diff --git a/.changeset/brown-boxes-compete.md b/.changeset/brown-boxes-compete.md
new file mode 100644
index 000000000000..c5a2c95c8aa9
--- /dev/null
+++ b/.changeset/brown-boxes-compete.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/data-transport-layer': patch
+---
+
+Adds additional code into the DTL to defend against situations where an RPC provider might be missing an event.
diff --git a/.changeset/calm-fans-travel.md b/.changeset/calm-fans-travel.md
new file mode 100644
index 000000000000..b579a850af27
--- /dev/null
+++ b/.changeset/calm-fans-travel.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/contracts': patch
+---
+
+Migrated from tslint to eslint. The preference for lint exceptions is as follows: line level, block level, file level, package level.
diff --git a/.changeset/cold-cows-cross.md b/.changeset/cold-cows-cross.md
new file mode 100644
index 000000000000..cc67cf4d950d
--- /dev/null
+++ b/.changeset/cold-cows-cross.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/integration-tests': patch
+---
+
+Reduce test timeout from 100 to 20 seconds
diff --git a/.changeset/config.json b/.changeset/config.json
index b3008c6a2fc0..d18f3a96e5af 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -4,7 +4,7 @@
"commit": false,
"linked": [],
"access": "public",
- "baseBranch": "master",
+ "baseBranch": "develop",
"updateInternalDependencies": "patch",
"ignore": []
}
diff --git a/.changeset/cool-baboons-guess.md b/.changeset/cool-baboons-guess.md
new file mode 100644
index 000000000000..aa0ea6cea3e9
--- /dev/null
+++ b/.changeset/cool-baboons-guess.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/smock': patch
+---
+
+Fixes a bug that would break call assertions for overloaded smocked functions
diff --git a/.changeset/fair-maps-pretend.md b/.changeset/fair-maps-pretend.md
new file mode 100644
index 000000000000..2feeebb11b22
--- /dev/null
+++ b/.changeset/fair-maps-pretend.md
@@ -0,0 +1,6 @@
+---
+'@eth-optimism/batch-submitter': patch
+'@eth-optimism/data-transport-layer': patch
+---
+
+Remove dead imports from core-utils
diff --git a/.changeset/fuzzy-dogs-share.md b/.changeset/fuzzy-dogs-share.md
new file mode 100644
index 000000000000..3b890e4e9e8d
--- /dev/null
+++ b/.changeset/fuzzy-dogs-share.md
@@ -0,0 +1,6 @@
+---
+'@eth-optimism/l2geth': patch
+'@eth-optimism/core-utils': patch
+---
+
+Implement the next fee spec in both geth and in core-utils
diff --git a/.changeset/great-shrimps-rule.md b/.changeset/great-shrimps-rule.md
new file mode 100644
index 000000000000..388ad60eeaa7
--- /dev/null
+++ b/.changeset/great-shrimps-rule.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/message-relayer': patch
+---
+
+Adds a README and cleans up the interface for generating messages and proofs
diff --git a/.changeset/kind-bears-think.md b/.changeset/kind-bears-think.md
deleted file mode 100644
index 6c23951cc055..000000000000
--- a/.changeset/kind-bears-think.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@eth-optimism/contracts': patch
----
-
-Move various dependencies from primary deps to dev deps
diff --git a/.changeset/kind-hotels-turn.md b/.changeset/kind-hotels-turn.md
new file mode 100644
index 000000000000..924700ae0d3c
--- /dev/null
+++ b/.changeset/kind-hotels-turn.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/gas-oracle': patch
+---
+
+Add additional logging in the `gas-oracle`
diff --git a/.changeset/kind-houses-rush.md b/.changeset/kind-houses-rush.md
new file mode 100644
index 000000000000..1819a8f8c93e
--- /dev/null
+++ b/.changeset/kind-houses-rush.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/l2geth': patch
+---
+
+fix potential underflow when launching the chain when the last verified index is 0
diff --git a/.changeset/late-countries-guess.md b/.changeset/late-countries-guess.md
new file mode 100644
index 000000000000..2edddd99dad3
--- /dev/null
+++ b/.changeset/late-countries-guess.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/contracts': patch
+---
+
+Update contracts README to add deploy instructions.
diff --git a/.changeset/lazy-toes-teach.md b/.changeset/lazy-toes-teach.md
new file mode 100644
index 000000000000..3c482f92504d
--- /dev/null
+++ b/.changeset/lazy-toes-teach.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/l2geth': patch
+---
+
+Fixes an off-by-one error that would sometimes break replica syncing when stopping and restarting geth.
diff --git a/.changeset/nasty-bees-remain.md b/.changeset/nasty-bees-remain.md
deleted file mode 100644
index 74cc671ad921..000000000000
--- a/.changeset/nasty-bees-remain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@eth-optimism/message-relayer': patch
----
-
-Add a check for `OVM_L2MessageRelayer` in the AddressManager before attempting to relay messages to help surface errors more quickly
diff --git a/.changeset/nasty-dots-grow.md b/.changeset/nasty-dots-grow.md
new file mode 100644
index 000000000000..417ca35c1d1f
--- /dev/null
+++ b/.changeset/nasty-dots-grow.md
@@ -0,0 +1,6 @@
+---
+'@eth-optimism/l2geth': patch
+'@eth-optimism/data-transport-layer': patch
+---
+
+Fix gasLimit overflow
diff --git a/.changeset/nice-terms-walk.md b/.changeset/nice-terms-walk.md
new file mode 100644
index 000000000000..98581e283868
--- /dev/null
+++ b/.changeset/nice-terms-walk.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/smock': patch
+---
+
+Minor smock patch to add support for hardhat 2.4.0 and up
diff --git a/.changeset/olive-planets-clean.md b/.changeset/olive-planets-clean.md
new file mode 100644
index 000000000000..27ddbce53227
--- /dev/null
+++ b/.changeset/olive-planets-clean.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/batch-submitter': patch
+---
+
+Add failure metrics to batch submitter
diff --git a/.changeset/pink-buttons-hang.md b/.changeset/pink-buttons-hang.md
deleted file mode 100644
index 809d21409cd2..000000000000
--- a/.changeset/pink-buttons-hang.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@eth-optimism/batch-submitter': patch
----
-
-Add the support for different sequencer & proposer keys in the batch submitter.
diff --git a/.changeset/quick-pandas-laugh.md b/.changeset/quick-pandas-laugh.md
new file mode 100644
index 000000000000..0faa252664d5
--- /dev/null
+++ b/.changeset/quick-pandas-laugh.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/data-transport-layer': patch
+---
+
+Fixes a bug that prevented verifiers from syncing properly with the DTL
diff --git a/.changeset/seven-carpets-tell.md b/.changeset/seven-carpets-tell.md
new file mode 100644
index 000000000000..9be51c0a6974
--- /dev/null
+++ b/.changeset/seven-carpets-tell.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/contracts': patch
+---
+
+Introduces the congestion price oracle contract
diff --git a/.changeset/sharp-files-knock.md b/.changeset/sharp-files-knock.md
new file mode 100644
index 000000000000..c74d2c14e4c3
--- /dev/null
+++ b/.changeset/sharp-files-knock.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/message-relayer': patch
+---
+
+Adds a new set of tools for generating messages to be relayed and their proofs
diff --git a/.changeset/silent-masks-hunt.md b/.changeset/silent-masks-hunt.md
new file mode 100644
index 000000000000..46f0382c5a79
--- /dev/null
+++ b/.changeset/silent-masks-hunt.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/core-utils': patch
+---
+
+Delete dead transaction coders. These are no longer used now that RLP encoded transactions are used
diff --git a/.changeset/slimy-rivers-promise.md b/.changeset/slimy-rivers-promise.md
new file mode 100644
index 000000000000..38b393bac00e
--- /dev/null
+++ b/.changeset/slimy-rivers-promise.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/data-transport-layer': patch
+---
+
+Logs the error stacktrace for a failed HTTP request
diff --git a/.changeset/smooth-ears-pay.md b/.changeset/smooth-ears-pay.md
new file mode 100644
index 000000000000..9df7b7cc9289
--- /dev/null
+++ b/.changeset/smooth-ears-pay.md
@@ -0,0 +1,7 @@
+---
+'@eth-optimism/integration-tests': patch
+'@eth-optimism/l2geth': patch
+'@eth-optimism/core-utils': patch
+---
+
+Implement the latest fee spec such that the L2 gas limit is scaled and the tx.gasPrice/tx.gasLimit show correctly in metamask
diff --git a/.changeset/sour-adults-worry.md b/.changeset/sour-adults-worry.md
new file mode 100644
index 000000000000..bd3031690f86
--- /dev/null
+++ b/.changeset/sour-adults-worry.md
@@ -0,0 +1,7 @@
+---
+'@eth-optimism/batch-submitter': patch
+'@eth-optimism/common-ts': patch
+'@eth-optimism/data-transport-layer': patch
+---
+
+Move the metric prefix string to a label #1047
diff --git a/.changeset/sour-onions-burn.md b/.changeset/sour-onions-burn.md
deleted file mode 100644
index 6c202ac41998..000000000000
--- a/.changeset/sour-onions-burn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@eth-optimism/l2geth': patch
----
-
-Update `scripts/start.sh` to parse the websocket port and pass to geth at runtime
diff --git a/.changeset/spotty-drinks-bathe.md b/.changeset/spotty-drinks-bathe.md
new file mode 100644
index 000000000000..9eb5d6357d5d
--- /dev/null
+++ b/.changeset/spotty-drinks-bathe.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/data-transport-layer': patch
+---
+
+incorrect parsing of eth_getBlockRange result
diff --git a/.changeset/ten-pumas-perform.md b/.changeset/ten-pumas-perform.md
new file mode 100644
index 000000000000..e40a6484c396
--- /dev/null
+++ b/.changeset/ten-pumas-perform.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/l2geth': patch
+---
+
+Correctly log 'end of OVM execution' message.
diff --git a/.changeset/ten-spiders-boil.md b/.changeset/ten-spiders-boil.md
new file mode 100644
index 000000000000..757827799789
--- /dev/null
+++ b/.changeset/ten-spiders-boil.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/message-relayer': patch
+---
+
+Removes spreadsheet mode from the message relayer
diff --git a/.changeset/thin-waves-bathe.md b/.changeset/thin-waves-bathe.md
new file mode 100644
index 000000000000..605e410ac5df
--- /dev/null
+++ b/.changeset/thin-waves-bathe.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/contracts': patch
+---
+
+Minor change to how deploy.ts is invoked
diff --git a/.changeset/wet-falcons-talk.md b/.changeset/wet-falcons-talk.md
new file mode 100644
index 000000000000..7698788db0e9
--- /dev/null
+++ b/.changeset/wet-falcons-talk.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/data-transport-layer': patch
+---
+
+improve slow blocking JSON parsing that occurs during l2 sync
diff --git a/.changeset/wise-mails-laugh.md b/.changeset/wise-mails-laugh.md
new file mode 100644
index 000000000000..3001b290ad56
--- /dev/null
+++ b/.changeset/wise-mails-laugh.md
@@ -0,0 +1,5 @@
+---
+'@eth-optimism/smock': patch
+---
+
+Add a test and a doc section for returning multiple uint256 arrays
diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 000000000000..baa0901e5844
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,80 @@
+version: 2.1
+jobs:
+ build:
+ machine:
+ image: ubuntu-1604:202004-01
+ steps:
+ - checkout
+ - run:
+ name: Build
+ command: |
+ make docker-build
+ no_output_timeout: 2400s
+ - run: sudo chown -R 100:1000 docker/config/ && sudo chmod -R 777 docker/config/
+ - run:
+ name: Infra standup
+ working_directory: /home/circleci/project/docker
+ command: docker-compose up ganache truffle
+ background: true
+ # prevent docker network creation race condition
+ - run: sleep 5
+ - run:
+ name: Test
+ working_directory: /home/circleci/project/docker
+ command: docker-compose up vault_server
+ no_output_timeout: 2400s
+ - run:
+ name: Test validation
+ working_directory: /home/circleci/project/docker
+ command: exit $(docker-compose logs | grep -c "DID NOT PASS THE REQUIRED TEST")
+ - run:
+ name: Save Docker image
+ command: |
+ mkdir -p /tmp/workspace
+ docker save -o /tmp/workspace/omgnetwork_vault-latest.tar omgnetwork/vault:latest
+ - persist_to_workspace:
+ root: /tmp/workspace
+ paths:
+ - "omgnetwork_vault-latest.tar"
+
+ publish:
+ machine:
+ image: ubuntu-1604:202004-01
+ environment:
+ GCR_PREFIX: gcr.io/omisego-development
+ IMMUTABILITY_IMAGE: omgnetwork/vault
+ steps:
+ - attach_workspace:
+ at: /tmp/workspace
+ - checkout
+ - run:
+ name: Install GCloud SDK
+ command: |
+ echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
+ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
+ sudo apt-get update && sudo apt-get install google-cloud-sdk
+ - run:
+ name: Publish to GCR
+ command: |
+ export SEMVER=$(cat ./VERSION)
+ echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file=-
+ gcloud -q auth configure-docker
+ docker load -i /tmp/workspace/omgnetwork_vault-latest.tar
+ docker tag $IMMUTABILITY_IMAGE:latest $GCR_PREFIX/$IMMUTABILITY_IMAGE:$SEMVER
+ docker push $GCR_PREFIX/$IMMUTABILITY_IMAGE:$SEMVER
+
+workflows:
+ version: 2
+ build-test-lint:
+ jobs:
+ - build
+ - publish:
+ requires: [build]
+ filters: &master_and_version_branches_and_all_tags
+ branches:
+ only:
+ - master
+ - /^v[0-9]+\.[0-9]+/
+ tags:
+ only:
+ - /.+/
diff --git a/.dockerignore b/.dockerignore
index 6743725724c5..d9185447b480 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -12,3 +12,4 @@ tests/testdata
l2geth/signer/fourbyte
l2geth/cmd/puppeth
l2geth/cmd/clef
+go/gas-oracle/gas-oracle
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 000000000000..043312b0e769
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,179 @@
+module.exports = {
+ root: true,
+ env: {
+ browser: true,
+ es6: true,
+ },
+ ignorePatterns: ['dist', 'packages/contracts/hardhat'],
+ extends: ['plugin:prettier/recommended'],
+ parser: 'babel-eslint',
+ parserOptions: {
+ es6: true,
+ ecmaVersion: 6,
+ sourceType: 'module',
+ },
+ plugins: [
+ 'eslint-plugin-import',
+ 'eslint-plugin-unicorn',
+ 'eslint-plugin-jsdoc',
+ 'eslint-plugin-prefer-arrow',
+ 'eslint-plugin-react',
+ '@typescript-eslint',
+ ],
+ overrides: [
+ {
+ files: ['**/*.ts'],
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ project: 'tsconfig.json',
+ sourceType: 'module',
+ },
+ rules: {
+ '@typescript-eslint/adjacent-overload-signatures': 'error',
+ '@typescript-eslint/array-type': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/consistent-type-assertions': 'error',
+ '@typescript-eslint/dot-notation': 'off',
+ '@typescript-eslint/indent': 'off',
+ '@typescript-eslint/member-delimiter-style': [
+ 'off',
+ {
+ multiline: {
+ delimiter: 'none',
+ requireLast: true,
+ },
+ singleline: {
+ delimiter: 'semi',
+ requireLast: false,
+ },
+ },
+ ],
+ '@typescript-eslint/member-ordering': 'off',
+ '@typescript-eslint/naming-convention': 'off',
+ '@typescript-eslint/no-empty-function': 'error',
+ '@typescript-eslint/no-empty-interface': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-misused-new': 'error',
+ '@typescript-eslint/no-namespace': 'error',
+ '@typescript-eslint/no-parameter-properties': 'off',
+ '@typescript-eslint/no-shadow': [
+ 'error',
+ {
+ hoist: 'all',
+ },
+ ],
+ '@typescript-eslint/no-this-alias': 'error',
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/no-var-requires': 'error',
+ '@typescript-eslint/prefer-for-of': 'error',
+ '@typescript-eslint/prefer-function-type': 'error',
+ '@typescript-eslint/prefer-namespace-keyword': 'error',
+ '@typescript-eslint/quotes': 'off',
+ '@typescript-eslint/semi': ['off', null],
+ '@typescript-eslint/triple-slash-reference': [
+ 'error',
+ {
+ path: 'always',
+ types: 'prefer-import',
+ lib: 'always',
+ },
+ ],
+ '@typescript-eslint/type-annotation-spacing': 'off',
+ '@typescript-eslint/unified-signatures': 'error',
+ },
+ },
+ ],
+ rules: {
+ 'prettier/prettier': 'warn',
+ 'arrow-parens': ['off', 'always'],
+ 'brace-style': ['off', 'off'],
+ 'comma-dangle': 'off',
+ complexity: 'off',
+ 'constructor-super': 'error',
+ curly: 'error',
+ 'dot-notation': 'off',
+ 'eol-last': 'off',
+ eqeqeq: ['error', 'smart'],
+ 'guard-for-in': 'error',
+ 'id-blacklist': 'off',
+ 'id-match': 'off',
+ 'import/no-extraneous-dependencies': ['error'],
+ 'import/no-internal-modules': 'off',
+ 'import/order': 'off',
+ indent: 'off',
+ 'jsdoc/check-alignment': 'error',
+ 'jsdoc/check-indentation': 'error',
+ 'jsdoc/newline-after-description': 'error',
+ 'linebreak-style': 'off',
+ 'max-classes-per-file': 'off',
+ 'max-len': 'off',
+ 'new-parens': 'off',
+ 'newline-per-chained-call': 'off',
+ 'no-bitwise': 'off',
+ 'no-caller': 'error',
+ 'no-cond-assign': 'error',
+ 'no-console': 'off',
+ 'no-debugger': 'error',
+ 'no-duplicate-case': 'error',
+ 'no-duplicate-imports': 'error',
+ 'no-empty': 'error',
+ 'no-eval': 'error',
+ 'no-extra-bind': 'error',
+ 'no-extra-semi': 'off',
+ 'no-fallthrough': 'off',
+ 'no-invalid-this': 'off',
+ 'no-irregular-whitespace': 'off',
+ 'no-multiple-empty-lines': 'off',
+ 'no-new-func': 'error',
+ 'no-new-wrappers': 'error',
+ 'no-redeclare': 'error',
+ 'no-return-await': 'error',
+ 'no-sequences': 'error',
+ 'no-sparse-arrays': 'error',
+ 'no-template-curly-in-string': 'error',
+ 'no-throw-literal': 'error',
+ 'no-trailing-spaces': 'off',
+ 'no-undef-init': 'error',
+ 'no-underscore-dangle': 'off',
+ 'no-unsafe-finally': 'error',
+ 'no-unused-expressions': 'off',
+ 'no-unused-labels': 'error',
+ 'no-use-before-define': 'off',
+ 'no-var': 'error',
+ 'object-shorthand': 'error',
+ 'one-var': ['error', 'never'],
+ 'padded-blocks': [
+ 'off',
+ {
+ blocks: 'never',
+ },
+ {
+ allowSingleLineBlocks: true,
+ },
+ ],
+ 'prefer-arrow/prefer-arrow-functions': 'error',
+ 'prefer-const': 'error',
+ 'prefer-object-spread': 'error',
+ 'quote-props': 'off',
+ quotes: 'off',
+ radix: 'error',
+ 'react/jsx-curly-spacing': 'off',
+ 'react/jsx-equals-spacing': 'off',
+ 'react/jsx-tag-spacing': [
+ 'off',
+ {
+ afterOpening: 'allow',
+ closingSlash: 'allow',
+ },
+ ],
+ 'react/jsx-wrap-multilines': 'off',
+ semi: 'off',
+ 'space-before-blocks': 'error',
+ 'space-before-function-paren': 'off',
+ 'space-in-parens': ['off', 'never'],
+ 'unicorn/prefer-ternary': 'off',
+ 'use-isnan': 'error',
+ 'valid-typeof': 'off',
+ },
+}
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000000..dfdb8b771ce0
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.sh text eol=lf
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index af4335e39e95..924c601c1677 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,14 +1,18 @@
-l2geth/ @smartcontracts @tynes @karlfloersch
-packages/specs/l2geth/ @smartcontracts @tynes @karlfloersch
-packages/contracts/ @smartcontracts @ben-chain @maurelian
-packages/specs/protocol/ @smartcontracts @ben-chain @maurelian
-ops/ @tynes @karlfloersch
-packages/hardhat-ovm/ @smartcontracts
-packages/smock/ @smartcontracts @maurelian
-packages/core-utils/ @smartcontracts @annieke @ben-chain
-packages/common-ts/ @annieke
-packages/core-utils/src/watcher.ts @K-Ho
-packages/message-relayer/ @K-Ho
-packages/batch-submitter/ @annieke @karlfloersch
-packages/data-transport-layer/ @annieke
-integration-tests/ @tynes
+# CODEOWNERS can be disruptive because it automatically requests review from individuals across the
+# board. We still like to use this file to track who's working on what, but all lines are commented
+# out so that GitHub won't trigger review requests.
+
+# l2geth/ @smartcontracts @tynes @karlfloersch
+# packages/specs/l2geth/ @smartcontracts @tynes @karlfloersch
+# packages/contracts/ @smartcontracts @ben-chain @maurelian @elenadimitrova
+# packages/specs/protocol/ @smartcontracts @ben-chain @maurelian
+# ops/ @tynes @karlfloersch
+# packages/hardhat-ovm/ @smartcontracts
+# packages/smock/ @smartcontracts @maurelian
+# packages/core-utils/ @smartcontracts @annieke @ben-chain
+# packages/common-ts/ @annieke
+# packages/core-utils/src/watcher.ts @K-Ho
+# packages/message-relayer/ @K-Ho
+# packages/batch-submitter/ @annieke @karlfloersch
+# packages/data-transport-layer/ @annieke
+# integration-tests/ @tynes
diff --git a/.github/label-requires-reviews.yml b/.github/label-requires-reviews.yml
new file mode 100644
index 000000000000..0563bdfde98d
--- /dev/null
+++ b/.github/label-requires-reviews.yml
@@ -0,0 +1,3 @@
+---
+ - label: 2-reviewers
+ reviews: 2
diff --git a/.github/labeler.yml b/.github/labeler.yml
index d7a54745ae9c..f2631e3cae4d 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -1,4 +1,14 @@
---
+2-reviewers:
+ - '.github/**/*'
+ - 'l2geth/**/*'
+ - 'ops/**/*'
+ - 'packages/batch-submitter/**/*'
+ - 'packages/contracts/**/*'
+ - 'packages/data-transport-layer/**/*'
+ - 'packages/message-relayer/**/*'
+ - 'patches/**/*'
+
A-ci:
- any: ['.github/**/*']
@@ -35,3 +45,4 @@ M-ops:
M-smock:
- any: ['packages/smock/**/*']
+
diff --git a/.github/pull.yml b/.github/pull.yml
new file mode 100644
index 000000000000..bf104e5ba047
--- /dev/null
+++ b/.github/pull.yml
@@ -0,0 +1,5 @@
+version: "1"
+rules:
+ - base: develop
+ upstream: ethereum-optimism:develop
+ mergeMethod: hardreset
diff --git a/.github/workflows/deploy2aws-integration.yml b/.github/workflows/deploy2aws-integration.yml
new file mode 100644
index 000000000000..f9d244796ec1
--- /dev/null
+++ b/.github/workflows/deploy2aws-integration.yml
@@ -0,0 +1,45 @@
+# This workflow will builds all docker images to run in AWS
+name: Deploy to integration-AWS
+
+on:
+ workflow_dispatch:
+ inputs:
+ deployerImageTag:
+ description: 'deployer image tag'
+ required: true
+ default: 'integration-v2'
+ secretname:
+ description: 'AWS Secret to be used in the deployment'
+ required: true
+ default: 'integration-v2'
+
+jobs:
+ deploy2aws:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: us-east-1
+
+ - name: Stop integration stack
+ run: |
+ cd ops_omgx
+ ./cfn-devenv.sh stop --stack-name integration
+
+ - name: Update Deployer
+ run: |
+ cd ops_omgx
+ ./cfn-devenv.sh update --stack-name integration --service-name deployer-rinkeby --secret-name ${{ github.event.inputs.secretname }} --deploy-tag ${{ github.event.inputs.deployerImageTag }}
+
+ - name: Update All other services
+ run: |
+ cd ops_omgx
+ rm -rf cloudformation/deployer-rinkeby.yaml
+ ./cfn-devenv.sh update --stack-name integration --secret-name ${{ github.event.inputs.secretname }} --deploy-tag ${{ github.sha }}
+ cd cloudformation
+ aws cloudformation update-stack --stack-name integration-l1l2test --capabilities CAPABILITY_NAMED_IAM --template-body=file://04-l1-l2-test-scheduled-ecs-task.yaml --region us-east-1 --parameters ParameterKey=SecretName,ParameterValue=${{ github.event.inputs.secretname }}
diff --git a/.github/workflows/ext-test-snx.yml b/.github/workflows/ext-test-snx.yml
new file mode 100644
index 000000000000..990d4bc6c641
--- /dev/null
+++ b/.github/workflows/ext-test-snx.yml
@@ -0,0 +1,65 @@
+name: Exteral Tests (Synthetix)
+
+on: workflow_dispatch
+
+jobs:
+ integration:
+ runs-on: ubuntu-latest
+ env:
+ DOCKER_BUILDKIT: 1
+ COMPOSE_DOCKER_CLI_BUILD: 1
+ steps:
+ - uses: actions/checkout@v2
+
+ # Required for some installation in the SNX repo
+ - uses: webfactory/ssh-agent@v0.4.1
+ with:
+ ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_READ }}
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Build the services
+ working-directory: ./ops
+ run: ./scripts/build-ci.sh
+
+ - name: Bring the stack up
+ working-directory: ./ops
+ run: |
+ ./scripts/stats.sh &
+ docker-compose up -d
+
+ - name: Wait for the Sequencer node
+ working-directory: ./ops
+ run: ./scripts/wait-for-sequencer.sh
+
+ - name: Run the SNX test suite
+ working-directory: ./integration-tests
+ run: ./ext-test/snx.sh
+
+ - name: Collect docker logs on failure
+ if: failure()
+ uses: jwalton/gh-docker-logs@v1
+ with:
+ images: 'ethereumoptimism/builder,ethereumoptimism/hardhat,ethereumoptimism/deployer,ethereumoptimism/data-transport-layer,ethereumoptimism/l2geth,ethereumoptimism/message-relayer,ethereumoptimism/batch-submitter,ethereumoptimism/l2geth,ethereumoptimism/integration-tests'
+ dest: '~/logs'
+
+ - name: Tar logs
+ if: failure()
+ run: tar cvzf ./logs.tgz ~/logs
+
+ - name: Upload logs to GitHub
+ if: failure()
+ uses: actions/upload-artifact@master
+ with:
+ name: logs.tgz
+ path: ./logs.tgz
diff --git a/.github/workflows/gas-oracle.yml b/.github/workflows/gas-oracle.yml
new file mode 100644
index 000000000000..394161b303b1
--- /dev/null
+++ b/.github/workflows/gas-oracle.yml
@@ -0,0 +1,43 @@
+name: gas-oracle unit tests
+
+on:
+ push:
+ paths:
+ - 'go/gas-oracle/**'
+ branches:
+ - 'master'
+ - 'develop'
+ - '*rc'
+ - 'regenesis/*'
+ pull_request:
+ paths:
+ - 'go/gas-oracle/**'
+ branches:
+ - 'master'
+ - 'develop'
+ - '*rc'
+ - 'regenesis/*'
+ workflow_dispatch:
+
+defaults:
+ run:
+ working-directory: ./go/gas-oracle
+
+jobs:
+ tests:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Install Go
+ uses: actions/setup-go@v2
+ with:
+ go-version: 1.16.x
+
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ - name: Install
+ run: make
+
+ - name: Test
+ run: make test
diff --git a/.github/workflows/geth.yml b/.github/workflows/geth.yml
index 2183ba5b6ecd..ad7a26f53e81 100644
--- a/.github/workflows/geth.yml
+++ b/.github/workflows/geth.yml
@@ -4,16 +4,20 @@ name: geth unit tests
on:
push:
paths:
- - 'l2geth/**'
+ - 'l2geth/**'
branches:
- - master
+ - 'master'
+ - 'develop'
- '*rc'
+ - 'regenesis/*'
pull_request:
paths:
- - 'l2geth/**'
+ - 'l2geth/**'
branches:
- - master
+ - 'master'
+ - 'develop'
- '*rc'
+ - 'regenesis/*'
workflow_dispatch:
defaults:
@@ -28,13 +32,13 @@ jobs:
- name: Install Go
uses: actions/setup-go@v2
with:
- go-version: 1.14.x
+ go-version: 1.15.x
- name: Checkout code
uses: actions/checkout@v2
- - name: Lint
- run: make lint
+ # - name: Lint
+ # run: make lint
tests:
runs-on: ubuntu-latest
@@ -43,7 +47,7 @@ jobs:
- name: Install Go
uses: actions/setup-go@v2
with:
- go-version: 1.14.x
+ go-version: 1.15.x
- name: Checkout code
uses: actions/checkout@v2
diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml
new file mode 100644
index 000000000000..e81c8ed0d574
--- /dev/null
+++ b/.github/workflows/golangci-lint.yml
@@ -0,0 +1,29 @@
+name: golangci-lint
+on:
+ push:
+ paths:
+ - 'go/gas-oracle/**'
+ branches:
+ - 'master'
+ - 'develop'
+ - '*rc'
+ - 'regenesis/*'
+ pull_request:
+ paths:
+ - 'go/gas-oracle/**'
+ branches:
+ - 'master'
+ - 'develop'
+ - '*rc'
+ - 'regenesis/*'
+jobs:
+ golangci:
+ name: lint
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: golangci-lint
+ uses: golangci/golangci-lint-action@v2
+ with:
+ version: v1.29
+ working-directory: go/gas-oracle
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index 4d3f6c8d36dd..86be9c000644 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -3,8 +3,10 @@ name: integration
on:
push:
branches:
- - master
+ - 'master'
+ - 'develop'
- '*rc'
+ - 'regenesis/*'
pull_request:
workflow_dispatch:
@@ -36,32 +38,82 @@ jobs:
- name: Bring the stack up
working-directory: ./ops
- run: docker-compose up -d
+ run: |
+ ./scripts/stats.sh &
+ docker-compose up -d
+
+ - name: Wait for the Sequencer node
+ working-directory: ./ops
+ run: ./scripts/wait-for-sequencer.sh
- name: Run the integration tests
working-directory: ./ops
run: docker-compose run integration_tests
# Examples Tests
- - name: Test & deploy hardhat-example on hardhat (regression)
- working-directory: ./examples/hardhat
+ # - name: Test & deploy hardhat-example on Ethereum (regression)
+ # working-directory: ./examples/hardhat
+ # run: |
+ # yarn
+ # yarn deploy
+ # yarn test:integration
+
+ # - name: Test & deploy hardhat-example on Optimistic Ethereum
+ # working-directory: ./examples/hardhat
+ # run: |
+ # yarn deploy:ovm
+ # yarn test:integration:ovm
+
+ - name: Test & deploy waffle-example on Ethereum (regression)
+ working-directory: ./examples/waffle
run: |
- yarn deploy
+ yarn
+ yarn compile
yarn test:integration
- - name: Test & deploy hardhat-example on Optimism
- working-directory: ./examples/hardhat
+ - name: Test & deploy waffle-example on Optimistic Ethereum
+ working-directory: ./examples/waffle
run: |
- yarn deploy:ovm
+ yarn compile:ovm
yarn test:integration:ovm
- - name: Test & deploy waffle-example on waffle (regression)
- working-directory: ./examples/waffle
+ - name: Test & deploy truffle-example on Ethereum (regression)
+ working-directory: ./examples/truffle
run: |
+ yarn
yarn compile
yarn test:integration
- - name: Test & deploy waffle-example on Optimism
- working-directory: ./examples/waffle
+ yarn deploy
+
+ - name: Test & deploy truffle-example on Optimistic Ethereum
+ working-directory: ./examples/truffle
run: |
yarn compile:ovm
yarn test:integration:ovm
+ yarn deploy:ovm
+
+ # - name: Test l1-l2-deposit-withdrawal example on Optimistic Ethereum with cross-domain message passing
+ # working-directory: ./examples/l1-l2-deposit-withdrawal
+ # run: |
+ # yarn
+ # yarn compile
+ # yarn compile:ovm
+ # yarn test:integration:ovm
+
+ # - name: Collect docker logs on failure
+ # if: failure()
+ # uses: jwalton/gh-docker-logs@v1
+ # with:
+ # images: 'ethereumoptimism/builder,ethereumoptimism/hardhat,ethereumoptimism/deployer,ethereumoptimism/data-transport-layer,ethereumoptimism/l2geth,ethereumoptimism/message-relayer,ethereumoptimism/batch-submitter,ethereumoptimism/l2geth,ethereumoptimism/integration-tests'
+ # dest: '~/logs'
+
+ # - name: Tar logs
+ # if: failure()
+ # run: tar cvzf ./logs.tgz ~/logs
+
+ # - name: Upload logs to GitHub
+ # if: failure()
+ # uses: actions/upload-artifact@master
+ # with:
+ # name: logs.tgz
+ # path: ./logs.tgz
diff --git a/.github/workflows/label-requires-reviews.yml b/.github/workflows/label-requires-reviews.yml
new file mode 100644
index 000000000000..f7081585d2b6
--- /dev/null
+++ b/.github/workflows/label-requires-reviews.yml
@@ -0,0 +1,16 @@
+name: Label Reviews
+on:
+ pull_request_review:
+
+jobs:
+ require-reviewers:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ ref: develop
+
+ - name: Require-reviewers
+ uses: travelperk/label-requires-reviews-action@v0.1
+ env:
+ GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN}}
\ No newline at end of file
diff --git a/.github/workflows/omgx-integration.yml b/.github/workflows/omgx-integration.yml
new file mode 100644
index 000000000000..d90fdfe51a97
--- /dev/null
+++ b/.github/workflows/omgx-integration.yml
@@ -0,0 +1,171 @@
+name: omgx_integration
+
+on:
+ push:
+ branches:
+ - 'master'
+ - 'develop'
+ - '*rc'
+ - 'regenesis/*'
+ pull_request:
+ workflow_dispatch:
+
+jobs:
+ start-runner:
+ name: Start self-hosted EC2 runner
+ runs-on: ubuntu-latest
+ outputs:
+ label: ${{ steps.start-ec2-runner.outputs.label }}
+ ec2-instance-id: ${{ steps.start-ec2-runner.outputs.ec2-instance-id }}
+ steps:
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: ${{ secrets.AWS_REGION }}
+ - name: Start EC2 runner
+ id: start-ec2-runner
+ uses: machulav/ec2-github-runner@v2
+ with:
+ mode: start
+ github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
+ ec2-image-id: ami-00b46fa1102c70ff2
+ ec2-instance-type: t2.xlarge
+ subnet-id: subnet-905870ae
+ security-group-id: sg-0855631d714870b32
+ omgx_integration:
+ needs: start-runner
+ runs-on: ${{ needs.start-runner.outputs.label }}
+ env:
+ DOCKER_BUILDKIT: 1
+ COMPOSE_DOCKER_CLI_BUILD: 1
+ TEST_PRIVATE_KEY_1: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
+ TEST_PRIVATE_KEY_2: "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba"
+ TEST_PRIVATE_KEY_3: "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e"
+ ADDRESS_MANAGER_ADDRESS: "0x5FbDB2315678afecb367f032d93F642f64180aa3"
+ L1_NODE_WEB3_URL: http://localhost:9545
+ L2_NODE_WEB3_URL: http://localhost:8545
+ URL: http://127.0.0.1:8080/addresses.json
+ OMGX_URL: http://127.0.0.1:8078/addresses.json
+
+ steps:
+ # Monorepo tests
+ - uses: actions/checkout@v2
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Install yq
+ run: sudo snap install yq
+
+ - name: Check the .envs
+ run: printenv
+
+ - name: Build the services, bring the stack up + OMGX services
+ working-directory: ./ops
+ env:
+ BUILD: 1
+ DAEMON: 1
+ run: ./up_local.sh
+
+ # just sets up background logs for the system that was just started
+ - name: Start background logging
+ working-directory: ./ops
+ run: docker-compose -f docker-compose.yml -f docker-compose-omgx-services.yml logs --follow &
+
+ # this test jitters - in any case, later tests will fail if the OMGX_deployer does not come up
+ - name: Test serving OMGX contracts
+ working-directory: ./
+ run: |
+ RETRIES=60
+ URL=http://127.0.0.1:8078/addresses.json
+ until $(curl --silent --fail --output /dev/null "$URL"); do
+ sleep 20s
+ echo "Will wait $((RETRIES--)) more times for $URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "OMGX contracts are deployed"
+ L2LIQUIDITY_POOL=$(curl --silent $URL | jq -r .L2LiquidityPool)
+ echo $L2LIQUIDITY_POOL
+ if [[ $L2LIQUIDITY_POOL =~ "0x" ]]; then
+ exit 0
+ else
+ exit 1
+ fi
+
+ - name: Test the base OMGX contracts
+ working-directory: ./packages/omgx/contracts
+ run: |
+ yarn test:integration
+
+ # ToDo
+ # - name: Test the base OMGX contracts
+ # working-directory: ./ops
+ # run: docker-compose -f docker-compose.yml -f docker-compose-omgx-services.yml run omgx_test_contracts
+
+ - name: Test the message-relayer-fast
+ working-directory: ./packages/omgx/message-relayer-fast
+ run: |
+ yarn test:integration
+
+ # ToDo
+ # - name: Test the message-relayer-fast
+ # working-directory: ./ops
+ # run: docker-compose -f docker-compose.yml -f docker-compose-omgx-services.yml run omgx_test_relayer
+
+ # - name: List all built images
+ # if: failure()
+ # run: docker images
+
+ # - name: Collect docker logs on failure
+ # if: failure()
+ # uses: jwalton/gh-docker-logs@v1
+ # with:
+ # images: 'omgx/builder,omgx/hardhat,omgx/deployer,omgx/data-transport-layer,omgx/l2geth,omgx/message-relayer,omgx/batch-submitter,omgx/l2geth,omgx/integration-tests,omgx/wallet_builder,omgx/wallet_deployer'
+ # dest: './logs'
+
+ # - name: Tar logs
+ # if: failure()
+ # run: tar cvzf ./logs.tgz ./logs
+
+ # - name: Upload logs to GitHub
+ # if: failure()
+ # uses: actions/upload-artifact@master
+ # with:
+ # name: logs.tgz
+ # path: ./logs.tgz
+ stop-runner:
+ name: Stop self-hosted EC2 runner
+ needs:
+ - start-runner # required to get output from the start-runner job
+ - omgx_integration # required to wait when the main job is done
+ runs-on: ubuntu-latest
+ if: ${{ always() }} # required to stop the runner even if the error happened in the previous jobs
+ steps:
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: ${{ secrets.AWS_REGION }}
+ - name: Stop EC2 runner
+ uses: machulav/ec2-github-runner@v2
+ with:
+ mode: stop
+ github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
+ label: ${{ needs.start-runner.outputs.label }}
+ ec2-instance-id: ${{ needs.start-runner.outputs.ec2-instance-id }}
diff --git a/.github/workflows/omgx-publish-develop.yml b/.github/workflows/omgx-publish-develop.yml
new file mode 100644
index 000000000000..36fba024be2a
--- /dev/null
+++ b/.github/workflows/omgx-publish-develop.yml
@@ -0,0 +1,73 @@
+name: Publish Packages (omgx-develop)
+
+on:
+ push:
+ branches:
+ - 'develop'
+# on:
+# push:
+# branches:
+# - 'master'
+# - 'develop'
+# - '*rc'
+# - 'regenesis/*'
+# pull_request:
+# workflow_dispatch:
+
+jobs:
+ build-publish-win:
+ runs-on: ubuntu-latest
+ env:
+ DOCKER_BUILDKIT: 1
+ COMPOSE_DOCKER_CLI_BUILD: 1
+ steps:
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - uses: actions/checkout@v2
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Build the services
+ working-directory: ./ops
+ run: |
+ ./scripts/build-ci.sh
+ docker build ../ --file docker/Dockerfile.omgx_monorepo --tag omgx/omgx_builder:latest
+ docker build ../ --file docker/Dockerfile.omgx_deployer --tag omgx/omgx_deployer:latest
+ docker build ../ --file docker/Dockerfile.gas-oracle --tag omgx/gas-oracle:latest
+ docker build ../ --file docker/Dockerfile.omgx_message-relayer-fast --tag omgx/omgx_message-relayer-fast:latest
+ - name: Rename and retag the optimism images
+ working-directory: ./ops
+ run: |
+ for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep omgx); do
+ docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):develop
+ done
+
+ for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep ethereumoptimism); do
+ docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):latest
+ docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):develop
+ done
+
+ docker rmi $(docker images | grep 'ethereumoptimism/' | awk '{print $1}')
+ docker images
+
+ - name: Rename and retag the optimism images
+ working-directory: ./ops
+ run: |
+ for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep omgx); do
+ echo "$1"
+ docker push "$i"
+ done
diff --git a/.github/workflows/omgx-publish-master.yml b/.github/workflows/omgx-publish-master.yml
new file mode 100644
index 000000000000..7613f419a751
--- /dev/null
+++ b/.github/workflows/omgx-publish-master.yml
@@ -0,0 +1,76 @@
+name: Publish Packages (omgx-master)
+
+on:
+ push:
+ tags:
+ - '*'
+
+# on:
+# push:
+# branches:
+# - 'master'
+# - 'develop'
+# - '*rc'
+# - 'regenesis/*'
+# pull_request:
+# workflow_dispatch:
+
+jobs:
+ build-publish-win:
+ runs-on: ubuntu-latest
+ env:
+ DOCKER_BUILDKIT: 1
+ COMPOSE_DOCKER_CLI_BUILD: 1
+ steps:
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - uses: actions/checkout@v2
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Get the version
+ id: tag
+ run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
+
+ - name: Print current tag
+ run: echo ${{ steps.tag.outputs.VERSION }}
+
+ - name: Build the services
+ working-directory: ./ops
+ run: |
+ ./scripts/build-ci.sh
+ docker build ../ --file docker/Dockerfile.omgx_monorepo --tag omgx/omgx_builder:${{ steps.tag.outputs.VERSION }}
+ docker build ../ --file docker/Dockerfile.omgx_deployer --tag omgx/omgx_deployer:${{ steps.tag.outputs.VERSION }}
+ docker build ../ --file docker/Dockerfile.gas-oracle --tag omgx/gas-oracle:${{ steps.tag.outputs.VERSION }}
+ docker build ../ --file docker/Dockerfile.omgx_message-relayer-fast --tag omgx/omgx_message-relayer-fast:${{ steps.tag.outputs.VERSION }}
+ - name: Rename and retag the Optimism images
+ working-directory: ./ops
+ run: |
+ for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep ethereumoptimism); do
+ docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):${{ steps.tag.outputs.VERSION }}
+ done
+ docker rmi $(docker images | grep 'ethereumoptimism/' | awk '{print $1}')
+ docker images
+ docker images | grep ${{ steps.tag.outputs.VERSION }}
+
+ - name: Rename and retag the optimism images
+ working-directory: ./ops
+ run: |
+ for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep omgx); do
+ echo "$1"
+ docker push "$i"
+ done
diff --git a/.github/workflows/publish-canary.yml b/.github/workflows/publish-canary.yml
new file mode 100644
index 000000000000..b3eb020863b2
--- /dev/null
+++ b/.github/workflows/publish-canary.yml
@@ -0,0 +1,282 @@
+name: Publish Packages (canary)
+
+on:
+ # enable users to manually trigger with workflow_dispatch
+ workflow_dispatch:
+ inputs:
+ customImageName:
+ description: 'Custom Docker Image Tag (keep empty for git hash)'
+ required: false
+ default: '0.0.0-rc-0'
+
+jobs:
+ canary-publish:
+ name: Publish Packages (canary)
+ runs-on: ubuntu-latest
+ # map the step outputs to job outputs
+ outputs:
+ builder: ${{ steps.packages.outputs.builder }}
+ l2geth: ${{ steps.packages.outputs.l2geth }}
+ batch-submitter: ${{ steps.packages.outputs.batch-submitter }}
+ message-relayer: ${{ steps.packages.outputs.message-relayer }}
+ data-transport-layer: ${{ steps.packages.outputs.data-transport-layer }}
+ contracts: ${{ steps.packages.outputs.contracts }}
+ canary-docker-tag: ${{ steps.docker-image-name.outputs.canary-docker-tag }}
+
+ steps:
+ - name: Check out source code
+ uses: actions/checkout@v2
+ with:
+ # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits
+ fetch-depth: 0
+
+ - name: Setup Node.js 12.x
+ uses: actions/setup-node@master
+ with:
+ node-version: 12.x
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Install Dependencies
+ run: yarn
+
+ - name: Build
+ run: yarn build
+
+ - name: Setup Canary Snapshot
+ run: yarn changeset version --snapshot
+
+ - name: Publish To NPM
+ uses: changesets/action@master
+ id: changesets
+ with:
+ publish: yarn changeset publish --tag canary
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ # Conditional on the release being executed, we unbundle the publishedPackages to specific
+ # job outputs
+ - name: Get version tags from each published version
+ id: packages
+ run: |
+ node ops/scripts/ci-versions.js ${{ toJSON(steps.changesets.outputs.publishedPackages) }}
+
+ - name: Docker Image Name
+ id: docker-image-name
+ run: |
+ if [ ${CUSTOM_IMAGE_NAME} == '' ]
+ then
+ echo "::set-output name=canary-docker-tag::${GITHUB_SHA::8}"
+ else
+ echo "::set-output name=canary-docker-tag::prerelease-${CUSTOM_IMAGE_NAME}"
+ fi
+ env:
+ CUSTOM_IMAGE_NAME: ${{ github.event.inputs.customImageName }}
+
+
+ # The below code is duplicated, would be ideal if we could use a matrix with a
+ # key/value being dynamically generated from the `publishedPackages` output
+ # while also allowing for parallelization (i.e. `l2geth` not depending on `builder`)
+ # and all jobs executing in parallel once `builder` is built
+ l2geth:
+ name: Publish L2Geth Version ${{ needs.canary-publish.outputs.canary-docker-tag }}
+ needs: canary-publish
+ if: needs.canary-publish.outputs.l2geth != ''
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Publish L2Geth
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.geth
+ push: true
+ tags: ethereumoptimism/l2geth:${{ needs.canary-publish.outputs.canary-docker-tag }}
+
+ # pushes the base builder image to dockerhub
+ builder:
+ name: Prepare the base builder image for the services
+ needs: canary-publish
+ if: needs.canary-publish.outputs.builder == 'true'
+ runs-on: ubuntu-latest
+ # we re-output the variables so that the child jobs can access them
+ outputs:
+ batch-submitter: ${{ needs.canary-publish.outputs.batch-submitter }}
+ message-relayer: ${{ needs.canary-publish.outputs.message-relayer }}
+ data-transport-layer: ${{ needs.canary-publish.outputs.data-transport-layer }}
+ contracts: ${{ needs.canary-publish.outputs.contracts }}
+ integration-tests: ${{ needs.canary-publish.outputs.integration-tests }}
+ canary-docker-tag: ${{ needs.canary-publish.outputs.canary-docker-tag }}
+
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.monorepo
+ push: true
+ tags: ethereumoptimism/builder
+
+ message-relayer:
+ name: Publish Message Relayer Version ${{ needs.builder.outputs.canary-docker-tag }}
+ needs: builder
+ if: needs.builder.outputs.message-relayer != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.message-relayer
+ push: true
+ tags: ethereumoptimism/message-relayer:${{ needs.builder.outputs.canary-docker-tag }}
+
+ batch-submitter:
+ name: Publish Batch Submitter Version ${{ needs.builder.outputs.canary-docker-tag }}
+ needs: builder
+ if: needs.builder.outputs.batch-submitter != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.batch-submitter
+ push: true
+ tags: ethereumoptimism/batch-submitter:${{ needs.builder.outputs.canary-docker-tag }}
+
+ data-transport-layer:
+ name: Publish Data Transport Layer Version ${{ needs.builder.outputs.canary-docker-tag }}
+ needs: builder
+ if: needs.builder.outputs.data-transport-layer != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.data-transport-layer
+ push: true
+ tags: ethereumoptimism/data-transport-layer:${{ needs.builder.outputs.canary-docker-tag }}
+
+ contracts:
+ name: Publish Deployer Version ${{ needs.builder.outputs.canary-docker-tag }}
+ needs: builder
+ if: needs.builder.outputs.contracts != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.deployer
+ push: true
+ tags: ethereumoptimism/deployer:${{ needs.builder.outputs.canary-docker-tag }}
+
+ integration_tests:
+ name: Publish Integration tests ${{ needs.builder.outputs.integration-tests }}
+ needs: builder
+ if: needs.builder.outputs.integration-tests != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.integration-tests
+ push: true
+ tags: ethereumoptimism/integration-tests:${{ needs.builder.outputs.canary-docker-tag }}
diff --git a/.github/workflows/publish-develop.yml b/.github/workflows/publish-develop.yml
new file mode 100644
index 000000000000..4c5c098e4d7d
--- /dev/null
+++ b/.github/workflows/publish-develop.yml
@@ -0,0 +1,261 @@
+name: Publish Packages (develop)
+
+# Triggers the workflow on push or pull request events
+on: [push, pull_request]
+
+jobs:
+ develop-publish:
+ name: Publish Packages (develop)
+ runs-on: ubuntu-latest
+ # map the step outputs to job outputs
+ outputs:
+ builder: ${{ steps.packages.outputs.builder }}
+ l2geth: ${{ steps.packages.outputs.l2geth }}
+ batch-submitter: ${{ steps.packages.outputs.batch-submitter }}
+ message-relayer: ${{ steps.packages.outputs.message-relayer }}
+ data-transport-layer: ${{ steps.packages.outputs.data-transport-layer }}
+ contracts: ${{ steps.packages.outputs.contracts }}
+
+ steps:
+ - name: Check out source code
+ uses: actions/checkout@v2
+ with:
+ # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits
+ fetch-depth: 0
+
+ - name: Setup Node.js 12.x
+ uses: actions/setup-node@master
+ with:
+ node-version: 12.x
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Install Dependencies
+ run: yarn
+
+ - name: Build
+ run: yarn build
+
+ - name: Setup Canary Snapshot
+ run: yarn changeset version --snapshot
+
+ # #Turn off until we have npm set up
+ # - name: Publish To NPM
+ # uses: changesets/action@master
+ # id: changesets
+ # with:
+ # publish: yarn changeset publish --tag canary
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ #
+ # #Conditional on the release being executed, we unbundle the publishedPackages to specific
+ # #job outputs
+ # - name: Get version tags from each published version
+ # id: packages
+ # run: |
+ # node ops/scripts/ci-versions.js ${{ toJSON(steps.changesets.outputs.publishedPackages) }}
+
+ # The below code is duplicated, would be ideal if we could use a matrix with a
+ # key/value being dynamically generated from the `publishedPackages` output
+ # while also allowing for parallelization (i.e. `l2geth` not depending on `builder`)
+ # and all jobs executing in parallel once `builder` is built
+ l2geth:
+ name: Publish L2Geth Version ${{ needs.develop-publish.outputs.l2geth }}
+ needs: develop-publish
+ if: needs.develop-publish.outputs.l2geth != ''
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Publish L2Geth
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.geth
+ push: true
+ tags: omgx/l2geth:${{ needs.develop-publish.outputs.l2geth }}
+
+ # pushes the base builder image to dockerhub
+ builder:
+ name: Prepare the base builder image for the services
+ needs: develop-publish
+ if: needs.develop-publish.outputs.builder == 'true'
+ runs-on: ubuntu-latest
+ # we re-output the variables so that the child jobs can access them
+ outputs:
+ batch-submitter: ${{ needs.develop-publish.outputs.batch-submitter }}
+ message-relayer: ${{ needs.develop-publish.outputs.message-relayer }}
+ data-transport-layer: ${{ needs.develop-publish.outputs.data-transport-layer }}
+ contracts: ${{ needs.develop-publish.outputs.contracts }}
+ integration-tests: ${{ needs.develop-publish.outputs.integration-tests }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.monorepo
+ push: true
+ tags: omgx/builder
+
+ message-relayer:
+ name: Publish Message Relayer Version ${{ needs.builder.outputs.message-relayer }}
+ needs: builder
+ if: needs.builder.outputs.message-relayer != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.message-relayer
+ push: true
+ tags: omgx/message-relayer:${{ needs.builder.outputs.message-relayer }}
+
+ batch-submitter:
+ name: Publish Batch Submitter Version ${{ needs.builder.outputs.batch-submitter }}
+ needs: builder
+ if: needs.builder.outputs.batch-submitter != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.batch-submitter
+ push: true
+ tags: omgx/batch-submitter:${{ needs.builder.outputs.batch-submitter }}
+
+ data-transport-layer:
+ name: Publish Data Transport Layer Version ${{ needs.builder.outputs.data-transport-layer }}
+ needs: builder
+ if: needs.builder.outputs.data-transport-layer != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.data-transport-layer
+ push: true
+ tags: omgx/data-transport-layer:${{ needs.builder.outputs.data-transport-layer }}
+
+ contracts:
+ name: Publish Deployer Version ${{ needs.builder.outputs.contracts }}
+ needs: builder
+ if: needs.builder.outputs.contracts != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.deployer
+ push: true
+ tags: omgx/deployer:${{ needs.builder.outputs.contracts }}
+
+ integration_tests:
+ name: Publish Integration tests ${{ needs.builder.outputs.integration-tests }}
+ needs: builder
+ if: needs.builder.outputs.integration-tests != ''
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.integration-tests
+ push: true
+ tags: omgx/integration-tests:${{ needs.builder.outputs.integration-tests }}
diff --git a/.github/workflows/push2aws.yml b/.github/workflows/push2aws.yml
new file mode 100644
index 000000000000..d74afc542824
--- /dev/null
+++ b/.github/workflows/push2aws.yml
@@ -0,0 +1,26 @@
+# This workflow will builds all docker images to run in AWS
+name: build and push to AWS ECR
+
+on:
+ push:
+ branches:
+ - develop
+
+jobs:
+ push2aws:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: us-east-1
+
+ - name: Build and push docker images to AWS
+ run: |
+ cd ops_omgx
+ rm -rf cloudformation/deployer-rinkeby.yaml
+ ./cfn-devenv.sh push2aws --from-tag latest --deploy-tag ${{ github.sha }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2bdc59c027b4..a983d9b0934e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -2,8 +2,13 @@ name: Release
on:
push:
- branches:
- - master
+ branches-ignore:
+ - '*'
+ - '*/**'
+ pull_request:
+ branches-ignore:
+ - '*'
+ - '*/**'
jobs:
release:
@@ -17,6 +22,7 @@ jobs:
message-relayer: ${{ steps.packages.outputs.message-relayer }}
data-transport-layer: ${{ steps.packages.outputs.data-transport-layer }}
contracts: ${{ steps.packages.outputs.contracts }}
+ gas-oracle: ${{ steps.packages.outputs.gas-oracle }}
steps:
- name: Checkout Repo
@@ -90,7 +96,49 @@ jobs:
context: .
file: ./ops/docker/Dockerfile.geth
push: true
- tags: ethereumoptimism/l2geth:${{ needs.release.outputs.l2geth }}
+ tags: ethereumoptimism/l2geth:${{ needs.release.outputs.l2geth }},ethereumoptimism/l2geth:latest
+
+ - name: Publish op_exporter
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.op_exporter
+ push: true
+ tags: ethereumoptimism/op_exporter:${{ needs.release.outputs.l2geth }}
+
+ - name: Publish rpc-proxy
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.rpc-proxy
+ push: true
+ tags: ethereumoptimism/rpc-proxy:${{ needs.release.outputs.l2geth }},ethereumoptimism/rpc-proxy:latest
+
+ gas-oracle:
+ name: Publish Gas Oracle Version ${{ needs.release.outputs.gas-oracle }}
+ needs: release
+ if: needs.release.outputs.gas-oracle != ''
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }}
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Publish Gas Oracle
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./ops/docker/Dockerfile.gas-oracle
+ push: true
+ tags: ethereumoptimism/gas-oracle:${{ needs.release.outputs.gas-oracle }},ethereumoptimism/gas-oracle:latest
# pushes the base builder image to dockerhub
builder:
@@ -150,7 +198,7 @@ jobs:
context: .
file: ./ops/docker/Dockerfile.message-relayer
push: true
- tags: ethereumoptimism/message-relayer:${{ needs.builder.outputs.message-relayer }}
+ tags: ethereumoptimism/message-relayer:${{ needs.builder.outputs.message-relayer }},ethereumoptimism/message-relayer:latest
batch-submitter:
name: Publish Batch Submitter Version ${{ needs.builder.outputs.batch-submitter }}
@@ -176,7 +224,7 @@ jobs:
context: .
file: ./ops/docker/Dockerfile.batch-submitter
push: true
- tags: ethereumoptimism/batch-submitter:${{ needs.builder.outputs.batch-submitter }}
+ tags: ethereumoptimism/batch-submitter:${{ needs.builder.outputs.batch-submitter }},ethereumoptimism/batch-submitter:latest
data-transport-layer:
name: Publish Data Transport Layer Version ${{ needs.builder.outputs.data-transport-layer }}
@@ -202,7 +250,7 @@ jobs:
context: .
file: ./ops/docker/Dockerfile.data-transport-layer
push: true
- tags: ethereumoptimism/data-transport-layer:${{ needs.builder.outputs.data-transport-layer }}
+ tags: ethereumoptimism/data-transport-layer:${{ needs.builder.outputs.data-transport-layer }},ethereumoptimism/data-transport-layer:latest
contracts:
name: Publish Deployer Version ${{ needs.builder.outputs.contracts }}
@@ -228,7 +276,7 @@ jobs:
context: .
file: ./ops/docker/Dockerfile.deployer
push: true
- tags: ethereumoptimism/deployer:${{ needs.builder.outputs.contracts }}
+ tags: ethereumoptimism/deployer:${{ needs.builder.outputs.contracts }},ethereumoptimism/deployer:latest
integration_tests:
name: Publish Integration tests ${{ needs.builder.outputs.integration-tests }}
@@ -254,4 +302,4 @@ jobs:
context: .
file: ./ops/docker/Dockerfile.integration-tests
push: true
- tags: ethereumoptimism/integration-tests:${{ needs.builder.outputs.integration-tests }}
+ tags: ethereumoptimism/integration-tests:${{ needs.builder.outputs.integration-tests }},ethereumoptimism/integration-tests:latest
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
new file mode 100644
index 000000000000..9eab9a0b3de9
--- /dev/null
+++ b/.github/workflows/static-analysis.yml
@@ -0,0 +1,61 @@
+name: Static analysis
+
+on:
+ push:
+ branches:
+ - master
+ - develop
+ pull_request:
+ workflow_dispatch:
+
+env:
+ PYTEST_ADDOPTS: "--color=yes"
+
+jobs:
+ slither:
+ name: Slither run
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Fetch history
+ run: git fetch
+
+ - name: Setup node
+ uses: actions/setup-node@v1
+ with:
+ node-version: '12.x'
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+
+ - name: Install Dependencies
+ # only install dependencies if there was a change in the deps
+ # if: steps.yarn-cache.outputs.cache-hit != 'true'
+ run: yarn install
+
+ - name: Build
+ run: yarn build
+
+ - name: Set up Python 3.8
+ uses: actions/setup-python@v2
+ with:
+ python-version: '3.8'
+
+ - name: Install Slither
+ run: pip3 install slither-analyzer
+
+ - name: Run analysis
+ working-directory: ./packages/contracts
+ shell: bash
+ run: yarn test:slither
+ continue-on-error: true
diff --git a/.github/workflows/sync-tests.yml b/.github/workflows/sync-tests.yml
new file mode 100644
index 000000000000..6e2eaa54783c
--- /dev/null
+++ b/.github/workflows/sync-tests.yml
@@ -0,0 +1,56 @@
+name: sync-tests
+
+on: workflow_dispatch
+
+jobs:
+ integration-sync-test:
+ runs-on: ubuntu-latest
+ env:
+ DOCKER_BUILDKIT: 1
+ COMPOSE_DOCKER_CLI_BUILD: 1
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Get yarn cache directory path
+ id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn cache dir)"
+
+ - uses: actions/cache@v2
+ id: yarn-cache
+ with:
+ path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+ key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-yarn-
+ - name: Build the services
+ working-directory: ./ops
+ run: ./scripts/build-ci.sh
+
+ - name: Bring the stack up
+ working-directory: ./ops
+ run: docker-compose up -d && ./scripts/wait-for-sequencer.sh
+
+ - name: Run the sync tests
+ working-directory: ./integration-tests
+ run: |
+ yarn
+ yarn build:integration
+ yarn test:sync
+
+ # - name: Collect docker logs on failure
+ # if: failure()
+ # uses: jwalton/gh-docker-logs@v1
+ # with:
+ # images: 'ethereumoptimism/builder,ethereumoptimism/hardhat,ethereumoptimism/deployer,ethereumoptimism/data-transport-layer,ethereumoptimism/l2geth,ethereumoptimism/message-relayer,ethereumoptimism/batch-submitter,ethereumoptimism/l2geth'
+ # dest: './logs'
+
+ # - name: Tar logs
+ # if: failure()
+ # run: tar cvzf ./logs.tgz ./logs
+
+ # - name: Upload logs to GitHub
+ # if: failure()
+ # uses: actions/upload-artifact@master
+ # with:
+ # name: logs.tgz
+ # path: ./logs.tgz
diff --git a/.github/workflows/ts-packages.yml b/.github/workflows/ts-packages.yml
index 2239ea6bd3e3..6c30df73cf07 100644
--- a/.github/workflows/ts-packages.yml
+++ b/.github/workflows/ts-packages.yml
@@ -3,8 +3,10 @@ name: typescript / contracts
on:
push:
branches:
- - master
+ - 'master'
+ - 'develop'
- '*rc'
+ - 'regenesis/*'
pull_request:
workflow_dispatch:
@@ -53,13 +55,51 @@ jobs:
run: cat packages/contracts/gas-report.txt
- name: Run codechecks
+ if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
working-directory: ./packages/contracts
run: yarn codechecks
env:
CC_SECRET: ${{ secrets.CC_SECRET }}
+ # A hack that allows running a job only if a specific directory changed.
+ # Ref: https://github.community/t/run-job-only-if-folder-changed/118292
+ is-contracts-package:
+ name: Check files for changes to the contracts package
+ # This job will break on a push event, so we just skip it,
+ # which in turn skips the test-coverage job.
+ if: ${{ github.event_name != 'push' }}
+ outputs:
+ run_coverage: ${{ steps.check_files.outputs.run_coverage }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+ - run: git fetch origin $GITHUB_BASE_REF
+
+ - name: check modified files
+ id: check_files
+ run: |
+ echo "=============== list modified files ==============="
+ git diff --name-only origin/$GITHUB_BASE_REF HEAD -- .
+
+ echo "========== check paths of modified files =========="
+ git diff --name-only origin/$GITHUB_BASE_REF HEAD -- . > files.txt
+ while IFS= read -r file
+ do
+ echo $file
+ if [[ $file != packages/contracts/* ]]; then
+ echo "This modified files are not in the contracts package."
+ echo "::set-output name=run_coverage::false"
+ break
+ else
+ echo "::set-output name=run_coverage::true"
+ fi
+ done < files.txt
+
test-coverage:
name: Generate test coverage
+ needs: is-contracts-package
+ if: needs.is-contracts-package.outputs.run_coverage == 'true'
runs-on: ubuntu-latest
steps:
@@ -131,5 +171,9 @@ jobs:
# if: steps.yarn-cache.outputs.cache-hit != 'true'
run: yarn install
- - name: Lint
- run: yarn lint:check
+ # - name: Lint JS and TS
+ # run: yarn lint:check
+
+ # - name: Lint Solidity
+ # working-directory: ./packages/contracts
+ # run: yarn lint:contracts
diff --git a/.gitignore b/.gitignore
index 18b731ead5fc..ed0509467a5f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,10 +14,21 @@ cache-ovm
l2geth/build/bin
packages/contracts/deployments/custom
packages/contracts/coverage*
+packages/contracts/@ens*
+packages/contracts/@openzeppelin*
+packages/contracts/hardhat*
packages/data-transport-layer/db
+packages/omgx/wallet/wallet/build
+
# vim
*.swp
.env
+env.js
+env.yml
+*.log
+
+packages/omgx/wallet-frontend/build
+.serverless
diff --git a/.husky/.gitignore b/.husky/.gitignore
new file mode 100644
index 000000000000..31354ec13899
--- /dev/null
+++ b/.husky/.gitignore
@@ -0,0 +1 @@
+_
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 000000000000..92eff75a7fa8
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+yarn lerna run --concurrency 1 --stream pre-commit --since HEAD --exclude-dependents
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000000..62df50f1eefe
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+14.17.0
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 000000000000..0f28c9f802fc
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,8 @@
+module.exports = {
+ "$schema": "http://json.schemastore.org/prettierrc",
+ "trailingComma": "es5",
+ "tabWidth": 2,
+ "semi": false,
+ "singleQuote": true,
+ "arrowParens": "always"
+};
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 000000000000..db78da54acff
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,12 @@
+{
+ // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
+ // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
+
+ // List of extensions which should be recommended for users of this workspace.
+ "recommendations": [
+ "dbaeumer.vscode-eslint",
+ "editorconfig.editorconfig",
+ "juanblanco.solidity",
+ "golang.go",
+ ],
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000000..f44c6ccb4a68
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,20 @@
+{
+ "[typescript]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint",
+ "editor.formatOnSave": false,
+ },
+ "eslint.workingDirectories": [
+ {"directory": "packages/core-utils", "changeProcessCWD": true },
+ {"directory": "packages/common-ts", "changeProcessCWD": true },
+ {"directory": "packages/hardhat-ovm", "changeProcessCWD": true },
+ {"directory": "packages/smock", "changeProcessCWD": true },
+ {"directory": "packages/contracts", "changeProcessCWD": true },
+ {"directory": "packages/data-transport-layer", "changeProcessCWD": true },
+ {"directory": "packages/batch-submitter", "changeProcessCWD": true },
+ {"directory": "packages/message-relayer", "changeProcessCWD": true },
+ ],
+ "eslint.nodePath": "./node_modules/eslint/bin/",
+ "eslint.format.enable": true,
+ "editorconfig.generateAuto": false,
+ "files.trimTrailingWhitespace": true,
+}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 04faa5223c0b..fce460afc7ef 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,303 +1,14 @@
-# Contributing
+# Optimism monorepo contributing guide
-🚨 Before making any non-trivial change via Pull Request, please first open an issue
-describing the change to solicit feedback and guidance. This will increase the
-likelihood of your Pull Request getting merged.
+**Please read our [general contributing guide](https://github.com/ethereum-optimism/.github/blob/master/CONTRIBUTING.md) before continuing**
-## Contributing in Issues
-For any issue, there are fundamentally three ways an individual can contribute:
+These packages only require 1 reviewer (all other packages require 2 reviewers, unless the changes do not affect production or test code).
+- packages/smock
+- packages/core-utils
+- packages/hardhat-ovm
+- packages/common-ts
+- examples
+- integration-tests
-1. By opening the issue for discussion: For instance, if you believe that you
- have uncovered a bug in Optimism, creating a new issue in this repository's
- issue tracker is the way to report it.
-2. By helping to triage the issue: This can be done by providing
- supporting details (a test case that demonstrates a bug), providing
- suggestions on how to address the issue, or ensuring that the issue is tagged
- correctly.
-
-3. By helping to resolve the issue: Typically this is done either in the form of
- demonstrating that the issue reported is not a problem after all, or more
- often, by opening a Pull Request that changes some bit of something in
- Optimism in a concrete and reviewable manner.
-
-**Anybody can participate in any stage of contribution**. We urge you to
-participate in the discussion around bugs and participate in reviewing PRs.
-
-### Asking for General Help
-
-If you have reviewed existing documentation and still have questions or are
-having problems, you can open an issue asking for help.
-
-In exchange for receiving help, we ask that you contribute back a documentation
-PR that helps others avoid the problems that you encountered.
-
-### Submitting a Bug Report
-
-When opening a new issue in the Optimism issue tracker, users will be presented
-with a [basic template][template] that should be filled in. If you believe that you have
-uncovered a bug, please fill out this form, following the template to the best
-of your ability. Do not worry if you cannot answer every detail, just fill in
-what you can.
-
-The two most important pieces of information we need in order to properly
-evaluate the report is a description of the behavior you are seeing and a simple
-test case we can use to recreate the problem on our own. If we cannot recreate
-the issue, it becomes impossible for us to fix.
-
-In order to rule out the possibility of bugs introduced by userland code, test
-cases should be limited, as much as possible, to using only Optimism APIs.
-
-See [How to create a Minimal, Complete, and Verifiable example][mcve].
-
-[mcve]: https://stackoverflow.com/help/mcve
-[template]: .github/PULL_REQUEST_TEMPLATE.md
-
-### Triaging a Bug Report
-
-Once an issue has been opened, it is not uncommon for there to be discussion
-around it. Some contributors may have differing opinions about the issue,
-including whether the behavior being seen is a bug or a feature. This discussion
-is part of the process and should be kept focused, helpful, and professional.
-
-Short, clipped responses—that provide neither additional context nor supporting
-detail—are not helpful or professional. To many, such responses are simply
-annoying and unfriendly.
-
-Contributors are encouraged to help one another make forward progress as much as
-possible, empowering one another to solve issues collaboratively. If you choose
-to comment on an issue that you feel either is not a problem that needs to be
-fixed, or if you encounter information in an issue that you feel is incorrect,
-explain why you feel that way with additional supporting context, and be willing
-to be convinced that you may be wrong. By doing so, we can often reach the
-correct outcome much faster.
-
-### Resolving a Bug Report
-
-In the majority of cases, issues are resolved by opening a Pull Request. The
-process for opening and reviewing a Pull Request is similar to that of opening
-and triaging issues, but carries with it a necessary review and approval
-workflow that ensures that the proposed changes meet the minimal quality and
-functional guidelines of the Optimism project.
-
-## Pull Requests
-
-1. Ensure that tests pass and code is lint free.
-2. Update the README.md if any changes invalidate its current content.
-3. Include tests for any new functionality.
-4. Reference relevant issues in your PR comment.
-
-### Commands
-
-This section lists some commonly needed commands.
-
-```
-# compile typescript
-yarn build
-# typescript lint checks
-yarn lint
-# typescript lint fixes
-yarn lint:fix
-# typescript unit tests
-yarn test
-# typescript integration tests
-yarn test:integration
-# l2geth lints
-make lint
-# l2geth tests
-make test
-```
-
-### Tests
-
-If the change being proposed alters code (as opposed to only documentation for
-example), it is either adding new functionality to Optimis or it is fixing
-existing, broken functionality. In both of these cases, the pull request should
-include one or more tests to ensure that functionality does not regress in the future.
-
-#### Unit Tests
-
-Functions which have very specific tasks should be unit tested. We encourage using
-table tests to cover a large number of cases in a succinct readable manner.
-
-#### Integration tests
-
-Integration tests go in the `integration-tests` package.
-
-The best strategy for writing a new integration test is to look at existing
-integration tests and follow the style. A common pattern is to
-instantiate an Optimism environment first by bringing the docker-compose network
-up (via `docker-compose up`) and then inside your test environment via [`OptimismEnv.new()`](https://github.com/ethereum-optimism/optimism/blob/18c122debc6b1acbd56be2d33c99109dc8f006fa/integration-tests/test/shared/env.ts#L23)
-
-### Commits
-
-It is a recommended best practice to keep your changes as logically grouped as
-possible within individual commits. There is no limit to the number of commits
-any single Pull Request may have, and many contributors find it easier to review
-changes that are split across multiple commits.
-
-That said, if you have a number of commits that are "checkpoints" and don't
-represent a single logical change, please squash those together.
-
-Note that multiple commits often get squashed when they are landed (see the
-notes about [commit squashing](#commit-squashing)).
-
-#### Commit message guidelines
-
-
-A good commit message should describe what changed and why. While we do not enforce it,
-we would prefer it if your commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) convention.
-
-1. The first line should:
-
- * contain a short description of the change (preferably 50 characters or less,
- and no more than 72 characters)
- * be entirely in lowercase with the exception of proper nouns, acronyms, and
- the words that refer to code, like function/variable names
- * be prefixed with the name of the sub package being changed and start with an imperative verb.
-
- Examples:
-
- * batch-submitter: introduce ENS querying for names and addresses
- * perf(integration-tests): tune down poll intervals
-
-2. Keep the second line blank.
-3. Wrap all other lines at 72 columns (except for long URLs).
-4. If your patch fixes an open issue, you can add a reference to it at the end
- of the log. Use the `Fixes: #` prefix and the issue number. For other
- references use `Refs: #`. `Refs` may include multiple issues, separated by a
- comma.
-
- Examples:
-
- - `Fixes: #1337`
- - `Refs: #1234`
-
-Sample complete commit message:
-
-```txt
-package: explain the commit in one line
-
-Body of commit message is a few lines of text, explaining things
-in more detail, possibly giving some background about the issue
-being fixed, etc.
-
-The body of the commit message can be several paragraphs, and
-please do proper word-wrap and keep columns shorter than about
-72 characters or so. That way, `git log` will show things
-nicely even when it is indented.
-
-Fixes: #1337
-Refs: #453, #154
-```
-
-### Opening the Pull Request
-
-From within GitHub, opening a new Pull Request will present you with a
-[template] that should be filled out. Please try to do your best at filling out
-the details, but feel free to skip parts if you're not sure what to put.
-
-[template]: .github/PULL_REQUEST_TEMPLATE.md
-
-### Discuss and update
-
-You will probably get feedback or requests for changes to your Pull Request.
-This is a big part of the submission process so don't be discouraged! Some
-contributors may sign off on the Pull Request right away, others may have
-more detailed comments or feedback. This is a necessary part of the process
-in order to evaluate whether the changes are correct and necessary.
-
-**Any community member can review a PR and you might get conflicting feedback**.
-Keep an eye out for comments from code owners to provide guidance on conflicting
-feedback.
-
-**Once the PR is open, do not rebase the commits**. See [Commit Squashing](#commit-squashing) for
-more details.
-
-### Commit Squashing
-
-In most cases, **do not squash commits that you add to your Pull Request during
-the review process**. When the commits in your Pull Request land, they may be
-squashed into one commit per logical change. Metadata will be added to the
-commit message (including links to the Pull Request, links to relevant issues,
-and the names of the reviewers). The commit history of your Pull Request,
-however, will stay intact on the Pull Request page.
-
-## Reviewing Pull Requests
-
-**Any Optimism community member is welcome to review any pull request**.
-
-All Optimism contributors who choose to review and provide feedback on Pull
-Requests have a responsibility to both the project and the individual making the
-contribution. Reviews and feedback must be helpful, insightful, and geared
-towards improving the contribution as opposed to simply blocking it. If there
-are reasons why you feel the PR should not land, explain what those are. Do not
-expect to be able to block a Pull Request from advancing simply because you say
-"No" without giving an explanation. Be open to having your mind changed. Be open
-to working with the contributor to make the Pull Request better.
-
-Reviews that are dismissive or disrespectful of the contributor or any other
-reviewers are strictly counter to the Code of Conduct.
-
-When reviewing a Pull Request, the primary goals are for the codebase to improve
-and for the person submitting the request to succeed. **Even if a Pull Request
-does not land, the submitters should come away from the experience feeling like
-their effort was not wasted or unappreciated**. Every Pull Request from a new
-contributor is an opportunity to grow the community.
-
-### Review a bit at a time.
-
-Do not overwhelm new contributors.
-
-It is tempting to micro-optimize and make everything about relative performance,
-perfect grammar, or exact style matches. Do not succumb to that temptation.
-
-Focus first on the most significant aspects of the change:
-
-1. Does this change make sense for Optimism?
-2. Does this change make Optimism better, even if only incrementally?
-3. Are there clear bugs or larger scale issues that need attending to?
-4. Is the commit message readable and correct? If it contains a breaking change
- is it clear enough?
-
-Note that only **incremental** improvement is needed to land a PR. This means
-that the PR does not need to be perfect, only better than the status quo. Follow
-up PRs may be opened to continue iterating.
-
-When changes are necessary, *request* them, do not *demand* them, and **do not
-assume that the submitter already knows how to add a test or run a benchmark**.
-
-Specific performance optimization techniques, coding styles and conventions
-change over time. The first impression you give to a new contributor never does.
-
-Nits (requests for small changes that are not essential) are fine, but try to
-avoid stalling the Pull Request. Most nits can typically be fixed by the Optimism
-Collaborator landing the Pull Request but they can also be an opportunity for
-the contributor to learn a bit more about the project.
-
-It is always good to clearly indicate nits when you comment: e.g.
-`Nit: change foo() to bar(). But this is not blocking.`
-
-If your comments were addressed but were not folded automatically after new
-commits or if they proved to be mistaken, please, [hide them][hiding-a-comment]
-with the appropriate reason to keep the conversation flow concise and relevant.
-
-### Be aware of the person behind the code
-
-Be aware that *how* you communicate requests and reviews in your feedback can
-have a significant impact on the success of the Pull Request. Yes, we may land
-a particular change that makes Optimism better, but the individual might just not
-want to have anything to do with Optimism ever again. The goal is not just having
-good code.
-
-### Abandoned or Stalled Pull Requests
-
-If a Pull Request appears to be abandoned or stalled, it is polite to first
-check with the contributor to see if they intend to continue the work before
-checking if they would mind if you took it over (especially if it just has nits
-left). When doing so, it is courteous to give the original contributor credit
-for the work they started (either by preserving their name and email address in
-the commit log, or by using an `Author: ` meta-data tag in the commit.
-
-[hiding-a-comment]: https://help.github.com/articles/managing-disruptive-comments/#hiding-a-comment
diff --git a/packages/data-transport-layer/LICENSE.txt b/LICENSE
similarity index 100%
rename from packages/data-transport-layer/LICENSE.txt
rename to LICENSE
diff --git a/README.md b/README.md
index 9974b568d60c..ffdf7d426246 100644
--- a/README.md
+++ b/README.md
@@ -1,84 +1,131 @@
-#
Optimism Monorepo
+
+

+
+
The Optimism Monorepo
+
+
+
+
+
+
-**Monorepo implementing the Optimistic Ethereum protocol**
+## TL;DR
-[](https://github.com/ethereum-optimism/optimism/actions/workflows/ts-packages.yml?query=branch%3Amaster)
-[](https://github.com/ethereum-optimism/optimism/actions/workflows/integration.yml?query=branch%3Amaster)
-[](https://github.com/ethereum-optimism/optimism/actions/workflows/geth.yml?query=branch%3Amaster)
+This is the primary place where [Optimism](https://optimism.io) works on stuff related to [Optimistic Ethereum](https://research.paradigm.xyz/optimism).
## Documentation
-Extensive documentation is available [here](http://community.optimism.io/docs/)
+Extensive documentation is available [here](http://community.optimism.io/docs/).
+
+## Community
+
+* [Come hang on discord](https://discord.optimism.io)
## Directory Structure
* [`packages`](./packages): Contains all the typescript packages and contracts
- * [`contracts`](./packages/contracts): Solidity smart contracts implementing the OVM
- * [`core-utils`](./packages/core-utils): Low-level utilities and encoding packages
- * [`common-ts`](./packages/common-ts): Common tools for TypeScript code that runs in Node
- * [`hardhat-ovm`](./packages/hardhat-ovm): Hardhat plugin which enables the [OVM Compiler](https://github.com/ethereum-optimism/solidity)
- * [`smock`](./packages/smock): Testing utility for mocking smart contract return values and storage
- * [`data-transport-layer`](./packages/data-transport-layer): Event indexer, allowing the `l2geth` node to access L1 data
- * [`batch-submitter`](./packages/batch-submitter): Daemon for submitting L2 transaction and state root batches to L1
- * [`message-relayer`](./packages/message-relayer): Service for relaying L2 messages to L1
+ * [`contracts`](./packages/contracts): Solidity smart contracts implementing the OVM
+ * [`core-utils`](./packages/core-utils): Low-level utilities and encoding packages
+ * [`common-ts`](./packages/common-ts): Common tools for TypeScript code that runs in Node
+ * [`hardhat-ovm`](./packages/hardhat-ovm): Hardhat plugin which enables the [OVM Compiler](https://github.com/ethereum-optimism/solidity)
+ * [`smock`](./packages/smock): Testing utility for mocking smart contract return values and storage
+ * [`data-transport-layer`](./packages/data-transport-layer): Event indexer, allowing the `l2geth` node to access L1 data
+ * [`batch-submitter`](./packages/batch-submitter): Daemon for submitting L2 transaction and state root batches to L1
+ * [`message-relayer`](./packages/message-relayer): Service for relaying L2 messages to L1
* [`l2geth`](./l2geth): Fork of [go-ethereum v1.9.10](https://github.com/ethereum/go-ethereum/tree/v1.9.10) implementing the [OVM](https://research.paradigm.xyz/optimism#optimistic-geth).
* [`integration-tests`](./integration-tests): Integration tests between a L1 testnet, `l2geth`,
-* [`ops`](./ops): Contains Dockerfiles for containerizing each service involved in the protocol,
+* [`ops`](./ops): Contains Dockerfiles for containerizing each service involved in the protocol,
as well as a docker-compose file for bringing up local testnets easily
-## Quickstart
+## Contributing
-### Installation
+Read through [CONTRIBUTING.md](./CONTRIBUTING.md) for a general overview of our contribution process.
+Follow the [Development Quick Start](#development-quick-start) to set up your local development environment.
-Dependency management is done using `yarn`.
+### Good First Issues
-```bash
-git clone git@github.com:ethereum-optimism/optimism.git
-cd optimism
-yarn
-```
+You can find good first issues by filtering for the ["good first issue" tag on our issues page](https://github.com/ethereum-optimism/optimism/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) or alternatively by taking a look at our [Good First Issues project board](https://github.com/orgs/ethereum-optimism/projects/23).
+If you'd like to tackle one of these issues, please leave a comment and [assign yourself to the issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/assigning-issues-and-pull-requests-to-other-github-users#assigning-an-individual-issue-or-pull-request).
+This helps prevent two people accidentally working on the same task at the same time.
+
+### Changesets
+
+We use [changesets](https://github.com/atlassian/changesets) to manage releases of our various packages.
+You *must* include a `changeset` file in your PR when making a change that would require a new package release.
+
+Adding a `changeset` file is easy:
+
+1. Navigate to the root of the monorepo.
+2. Run `yarn changeset`. You'll be prompted to select packages to include in the changeset. Use the arrow keys to move the cursor up and down, hit the `spacebar` to select a package, and hit `enter` to confirm your selection. Select *all* packages that require a new release as a result of your PR.
+3. Once you hit `enter` you'll be prompted to decide whether your selected packages need a `major`, `minor`, or `patch` release. We follow the [Semantic Versioning](https://semver.org/) scheme. Please avoid using `major` releases for any packages that are still in version `0.y.z`.
+4. Commit your changeset and push it into your PR. The changeset bot will notice your changeset file and leave a little comment to this effect on GitHub.
+5. Voilà , c'est fini!
+
+### Rebasing
-After installing the dependencies, you must also build them so that the typescript
-is compiled down to javascript:
+We use the `git rebase` command to keep our commit history tidy.
+Rebasing is an easy way to make sure that each PR includes a series of clean commits with descriptive commit messages
+See [this tutorial](https://docs.gitlab.com/ee/topics/git/git_rebase.html) for a detailed explanation of `git rebase` and how you should use it to maintain a clean commit history.
+
+## Development Quick Start
+
+### Dependencies
+
+You'll need the following:
+
+* [Git](https://git-scm.com/downloads)
+* [NodeJS](https://nodejs.org/en/download/)
+* [Yarn](https://classic.yarnpkg.com/en/docs/install)
+* [Docker](https://docs.docker.com/get-docker/)
+* [Docker Compose](https://docs.docker.com/compose/install/)
+
+### Setup
+
+Clone the repository, open it, and install nodejs packages with `yarn`:
```bash
-yarn build
+git clone git@github.com:ethereum-optimism/optimism.git
+cd optimism
+yarn install
```
-### Unit tests
+### Building the TypeScript packages
-All tests are run in parallel using `lerna`:
+To build all of the [TypeScript packages](./packages), run:
```bash
-yarn test
+yarn clean
+yarn build
```
-When you want to run tests only for packages that have changed since `master` (or any other branch)
-you can run `yarn lerna run test --parallel --since master`
+Packages compiled when on one branch may not be compatible with packages on a different branch.
+**You should recompile all packages whenever you move from one branch to another.**
+Use the above commands to recompile the packages.
-### Integration Tests
+### Building the rest of the system
-#### Running the integration tests
-
-The integration tests first require bringing up the Optimism stack. This is done via
-a Docker Compose network. For better performance, we also recommend enabling Docker
-BuildKit
+If you want to run an Optimistic Ethereum node OR **if you want to run the integration tests**, you'll need to build the rest of the system.
```bash
cd ops
-export COMPOSE_DOCKER_CLI_BUILD=1
+export COMPOSE_DOCKER_CLI_BUILD=1 # these environment variables significantly speed up build time
export DOCKER_BUILDKIT=1
docker-compose build
-cd ../integration-tests
-yarn build:integration
-yarn test:integration
```
-#### Locally testing and re-building specific services
+This will build the following containers:
-If you want to make changes to any of the containers, you'll have to bring one down,
-rebuild it, and then bring it back up.
+* [`builder`](https://hub.docker.com/r/ethereumoptimism/builder): used to build the TypeScript packages
+* [`l1_chain`](https://hub.docker.com/r/ethereumoptimism/hardhat): simulated L1 chain using hardhat-evm as a backend
+* [`deployer`](https://hub.docker.com/r/ethereumoptimism/deployer): process that deploys L1 smart contracts to the L1 chain
+* [`dtl`](https://hub.docker.com/r/ethereumoptimism/data-transport-layer): service that indexes transaction data from the L1 chain
+* [`l2geth`](https://hub.docker.com/r/ethereumoptimism/l2geth): L2 geth node running in Sequencer mode
+* [`verifier`](https://hub.docker.com/r/ethereumoptimism/go-ethereum): L2 geth node running in Verifier mode
+* [`relayer`](https://hub.docker.com/r/ethereumoptimism/message-relayer): helper process that relays messages between L1 and L2
+* [`batch_submitter`](https://hub.docker.com/r/ethereumoptimism/batch-submitter): service that submits batches of Sequencer transactions to the L1 chain
+* [`integration_tests`](https://hub.docker.com/r/ethereumoptimism/integration-tests): integration tests in a box
+If you want to make a change to a container, you'll need to take it down and rebuild it.
For example, if you make a change in l2geth:
```bash
@@ -98,9 +145,130 @@ docker-compose build -- builder batch_submitter
docker-compose start batch_submitter
```
+Source code changes can have an impact on more than one container.
+**If you're unsure about which containers to rebuild, just rebuild them all**:
+
+```bash
+cd ops
+docker-compose down
+docker-compose build
+docker-compose up
+```
+
+Finally, **if you're running into weird problems and nothing seems to be working**, run:
+
+```bash
+cd optimism
+yarn clean
+yarn build
+cd ops
+docker-compose down -v
+docker-compose build
+docker-compose up
+```
+
+#### Viewing docker container logs
+
By default, the `docker-compose up` command will show logs from all services, and that
can be hard to filter through. In order to view the logs from a specific service, you can run:
-```
+```bash
docker-compose logs --follow
```
+
+### Running tests
+
+Before running tests: **follow the above instructions to get everything built.**
+
+#### Running unit tests
+
+Run unit tests for all packages in parallel via:
+
+```bash
+yarn test
+```
+
+To run unit tests for a specific package:
+
+```bash
+cd packages/package-to-test
+yarn test
+```
+
+#### Running integration tests
+
+Follow above instructions for building the whole stack.
+Build and run the integration tests:
+
+```bash
+cd integration-tests
+yarn build:integration
+yarn test:integration
+```
+
+## Branching Model and Releases
+
+
+
+### Active Branches
+
+| Branch | Status |
+| --------------- | -------------------------------------------------------------------------------- |
+| [master](https://github.com/ethereum-optimism/optimism/tree/master/) | Accepts PRs from `develop` when we intend to deploy to mainnet. |
+| [develop](https://github.com/ethereum-optimism/optimism/tree/develop/) | Accepts PRs that are compatible with `master` OR from `regenesis/X.X.X` branches. |
+| regenesis/X.X.X | Accepts PRs for all changes, particularly those not backwards compatible with `develop` and `master`. |
+
+### Overview
+
+We generally follow [this Git branching model](https://nvie.com/posts/a-successful-git-branching-model/).
+Please read the linked post if you're planning to make frequent PRs into this repository (e.g., people working at/with Optimism).
+
+### The `master` branch
+
+The `master` branch contains the code for our latest "stable" releases.
+Updates from `master` always come from the `develop` branch.
+We only ever update the `master` branch when we intend to deploy code within the `develop` to the Optimistic Ethereum mainnet.
+Our update process takes the form of a PR merging the `develop` branch into the `master` branch.
+
+### The `develop` branch
+
+Our primary development branch is [`develop`](https://github.com/ethereum-optimism/optimism/tree/develop/).
+`develop` contains the most up-to-date software that remains backwards compatible with our latest experimental [network deployments](https://community.optimism.io/docs/developers/networks.html).
+If you're making a backwards compatible change, please direct your pull request towards `develop`.
+
+**Changes to contracts within `packages/contracts/contracts/optimistic-ethereum` are usually NOT considered backwards compatible and SHOULD be made against a release candidate branch**.
+Some exceptions to this rule exist for cases in which we absolutely must deploy some new contract after a release candidate branch has already been fully deployed.
+If you're changing or adding a contract and you're unsure about which branch to make a PR into, default to using the latest release candidate branch.
+See below for info about release candidate branches.
+
+### Release new versions
+
+Developers can release new versions of the software by adding changesets to their pull requests using `yarn changeset`. Changesets will persist over time on the `develop` branch without triggering new version bumps to be proposed by the Changesets bot. Once changesets are merged into `master`, the bot will create a new pull request called "Version Packages" which bumps the versions of packages. The correct flow for triggering releases is to re-base these pull requests onto `develop` and merge them, and then create a new pull request to merge `develop` onto `master`. Then, the `release` workflow will trigger the actual publishing to `npm` and Docker hub.
+
+### Release candidate branches
+
+Branches marked `regenesis/X.X.X` are **release candidate branches**.
+Changes that are not backwards compatible and all changes to contracts within `packages/contracts/contracts/optimistic-ethereum` MUST be directed towards a release candidate branch.
+Release candidates are merged into `develop` and then into `master` once they've been fully deployed.
+We may sometimes have more than one active `regenesis/X.X.X` branch if we're in the middle of a deployment.
+See table in the **Active Branches** section above to find the right branch to target.
+
+## Additional Reference Material
+
+### Running contract static analysis
+
+We perform static analysis with [`slither`](https://github.com/crytic/slither).
+You must have Python 3.x installed to run `slither`.
+To run `slither` locally, do:
+
+```bash
+cd packages/contracts
+pip3 install slither-analyzer
+yarn test:slither
+```
+
+## License
+
+Code forked from [`go-ethereum`](https://github.com/ethereum/go-ethereum) under the name [`l2geth`](https://github.com/ethereum-optimism/optimism/tree/master/l2geth) is licensed under the [GNU GPLv3](https://gist.github.com/kn9ts/cbe95340d29fc1aaeaa5dd5c059d2e60) in accordance with the [original license](https://github.com/ethereum/go-ethereum/blob/master/COPYING).
+
+All other files within this repository are licensed under the [MIT License](https://github.com/ethereum-optimism/optimism/blob/master/LICENSE) unless stated otherwise.
diff --git a/packages/core-utils/LICENSE.txt b/examples/hardhat/LICENSE
similarity index 97%
rename from packages/core-utils/LICENSE.txt
rename to examples/hardhat/LICENSE
index 36e597d78021..6a7da5218bb2 100644
--- a/packages/core-utils/LICENSE.txt
+++ b/examples/hardhat/LICENSE
@@ -1,6 +1,6 @@
(The MIT License)
-Copyright 2020 Optimism
+Copyright 2020-2021 Optimism
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -20,4 +20,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
diff --git a/examples/hardhat/deployments/optimism/.chainId b/examples/hardhat/deployments/optimism/.chainId
new file mode 100644
index 000000000000..368f89ceef17
--- /dev/null
+++ b/examples/hardhat/deployments/optimism/.chainId
@@ -0,0 +1 @@
+28
\ No newline at end of file
diff --git a/examples/hardhat/deployments/optimism/ERC20.json b/examples/hardhat/deployments/optimism/ERC20.json
new file mode 100644
index 000000000000..bbf08c170a6e
--- /dev/null
+++ b/examples/hardhat/deployments/optimism/ERC20.json
@@ -0,0 +1,446 @@
+{
+ "address": "0x7A9Ec1d04904907De0ED7b6839CcdD59c3716AC9",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "_initialSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "transactionHash": "0x3594b9b47fda4513cff7f7f92224ae2a0a307c2974ac5cbd379fdf8eb28bf9fe",
+ "receipt": {
+ "to": null,
+ "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "contractAddress": "0x7A9Ec1d04904907De0ED7b6839CcdD59c3716AC9",
+ "transactionIndex": 0,
+ "gasUsed": "2280850",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000040000000000000000000000000000000000100000000100000000000000000000000000000000000000000000000000000008000000000000000000000000000000400000000000000000000000000000000100000000000000000000000000000010000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000000000000000002000000000000000000000000000000000000008000000000000000000000000000000000000000000000000",
+ "blockHash": "0xef509c9459a9304ab34a62c7ad06c45bc22486038471fa9afede2ee97e7830b5",
+ "transactionHash": "0x3594b9b47fda4513cff7f7f92224ae2a0a307c2974ac5cbd379fdf8eb28bf9fe",
+ "logs": [
+ {
+ "transactionIndex": 0,
+ "blockNumber": 156,
+ "transactionHash": "0x3594b9b47fda4513cff7f7f92224ae2a0a307c2974ac5cbd379fdf8eb28bf9fe",
+ "address": "0x4200000000000000000000000000000000000006",
+ "topics": [
+ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
+ "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "0x0000000000000000000000004200000000000000000000000000000000000011"
+ ],
+ "data": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logIndex": 0,
+ "blockHash": "0xef509c9459a9304ab34a62c7ad06c45bc22486038471fa9afede2ee97e7830b5"
+ }
+ ],
+ "blockNumber": 156,
+ "cumulativeGasUsed": "2280850",
+ "status": 1,
+ "byzantium": true
+ },
+ "args": [
+ 1000000,
+ "My Optimistic Token"
+ ],
+ "solcInputHash": "a4e2764a77fec30ccb674d800c46e436",
+ "metadata": "{\"compiler\":{\"version\":\"0.7.6+ovm+commit.aff196a1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_initialSupply\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A super simple ERC20 implementation!\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"Address of the account to check an allowance from.\",\"_spender\":\"Address of the account trying to spend from the owner.\"},\"returns\":{\"_0\":\"Allowance for the spender from the owner.\"}},\"approve(address,uint256)\":{\"params\":{\"_amount\":\"Amount to allow the account to spend from your account.\",\"_spender\":\"Account to approve a balance for.\"},\"returns\":{\"_0\":\"true if the allowance was successful.\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"Address to check a balance for.\"},\"returns\":{\"_0\":\"Balance of the address.\"}},\"constructor\":{\"params\":{\"_initialSupply\":\"Initial maximum token supply.\",\"_name\":\"A name for our ERC20 (technically optional, but it's fun ok jeez).\"}},\"transfer(address,uint256)\":{\"params\":{\"_amount\":\"Amount to transfer to the other account.\",\"_to\":\"Address to transfer a balance to.\"},\"returns\":{\"_0\":\"true if the transfer was successful.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_amount\":\"Amount to transfer to the other account.\",\"_from\":\"Account to transfer a balance from.\",\"_to\":\"Account to transfer a balance to.\"},\"returns\":{\"_0\":\"true if the transfer was successful.\"}}},\"title\":\"ERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Checks how much a given account is allowed to spend from another given account.\"},\"approve(address,uint256)\":{\"notice\":\"Approves an account to spend some amount from your account.\"},\"balanceOf(address)\":{\"notice\":\"Checks the balance of an address.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers a balance from your account to someone else's account!\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers a balance from someone else's account to another account. You need an allowance from the sending account for this to work!\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC20\\n * @dev A super simple ERC20 implementation!\\n */\\ncontract ERC20 {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event Transfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _value\\n );\\n\\n event Approval(\\n address indexed _owner,\\n address indexed _spender,\\n uint256 _value\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (address => uint256) public balances;\\n mapping (address => mapping (address => uint256)) public allowances;\\n\\n // Some optional extra goodies.\\n uint256 public totalSupply;\\n string public name;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _initialSupply Initial maximum token supply.\\n * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).\\n */\\n constructor(\\n uint256 _initialSupply,\\n string memory _name\\n )\\n public\\n {\\n balances[msg.sender] = _initialSupply;\\n totalSupply = _initialSupply;\\n name = _name;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks the balance of an address.\\n * @param _owner Address to check a balance for.\\n * @return Balance of the address.\\n */\\n function balanceOf(\\n address _owner\\n )\\n external\\n view\\n returns (\\n uint256\\n )\\n {\\n return balances[_owner];\\n }\\n\\n /**\\n * Transfers a balance from your account to someone else's account!\\n * @param _to Address to transfer a balance to.\\n * @param _amount Amount to transfer to the other account.\\n * @return true if the transfer was successful.\\n */\\n function transfer(\\n address _to,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n require(\\n balances[msg.sender] >= _amount,\\n \\\"You don't have enough balance to make this transfer!\\\"\\n );\\n\\n balances[msg.sender] -= _amount;\\n balances[_to] += _amount;\\n\\n emit Transfer(\\n msg.sender,\\n _to,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Transfers a balance from someone else's account to another account. You need an allowance\\n * from the sending account for this to work!\\n * @param _from Account to transfer a balance from.\\n * @param _to Account to transfer a balance to.\\n * @param _amount Amount to transfer to the other account.\\n * @return true if the transfer was successful.\\n */\\n function transferFrom(\\n address _from,\\n address _to,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n require(\\n balances[_from] >= _amount,\\n \\\"Can't transfer from the desired account because it doesn't have enough balance.\\\"\\n );\\n\\n require(\\n allowances[_from][msg.sender] >= _amount,\\n \\\"Can't transfer from the desired account because you don't have enough of an allowance.\\\"\\n );\\n\\n balances[_to] += _amount;\\n balances[_from] -= _amount;\\n\\n emit Transfer(\\n _from,\\n _to,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Approves an account to spend some amount from your account.\\n * @param _spender Account to approve a balance for.\\n * @param _amount Amount to allow the account to spend from your account.\\n * @return true if the allowance was successful.\\n */\\n function approve(\\n address _spender,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n allowances[msg.sender][_spender] = _amount;\\n\\n emit Approval(\\n msg.sender,\\n _spender,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Checks how much a given account is allowed to spend from another given account.\\n * @param _owner Address of the account to check an allowance from.\\n * @param _spender Address of the account trying to spend from the owner.\\n * @return Allowance for the spender from the owner.\\n */\\n function allowance(\\n address _owner,\\n address _spender\\n )\\n external\\n view\\n returns (\\n uint256\\n )\\n {\\n return allowances[_owner][_spender];\\n }\\n}\\n\",\"keccak256\":\"0x5c76dbdcd208a53d57d8f7afa0061e54cd83157cf7d0e57be8ed914d0018283c\",\"license\":\"MIT\"}},\"version\":1}",
+ "bytecode": "0x60806040523480156200001c5760008062000019620001c4565b50505b50604051620012e8380380620012e8833981810160405260408110156200004d576000806200004a620001c4565b50505b810190808051906020019092919080516040519392919084640100000000821115620000835760008062000080620001c4565b50505b83820191506020820185811115620000a557600080620000a2620001c4565b50505b8251866001820283011164010000000082111715620000ce57600080620000cb620001c4565b50505b8083526020830192505050908051906020019080838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905090810190601f168015620001325780820380516001836020036101000a031916815260200191505b50604052505050816000805a6200014862000234565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906200018e62000293565b5050508160028190620001a062000293565b5050508060039080519060200190620001bb929190620002fa565b50505062000455565b632a2a7adb598160e01b8152600481016020815285602082015260005b8681101562000201578086015181604084010152602081019050620001e1565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156200028e5760008183015260208101905062000272565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015620002f557600081830152602081019050620002d9565b505050565b828062000306620003c6565b600181600116156101000203166002900490600052602060002090601f01602090048101928262000346576000856200033e62000293565b5050620003b3565b82601f106200036c57805160ff191683800117856200036462000293565b5050620003b3565b828001600101856200037d62000293565b50508215620003b3579182015b82811115620003b257825182620003a062000293565b5050916020019190600101906200038a565b5b509050620003c291906200042b565b5090565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b604081101562000426576000818301526020810190506200040a565b505050565b5b8082111562000451576000816000906200044562000293565b5050506001016200042c565b5090565b610e8380620004656000396000f3fe608060405234801561001957600080610016610c16565b50505b506004361061009c5760003560e01c806327e235e31161006f57806327e235e31461024557806355b6ed5c146102a657806370a0823114610327578063a9059cbb14610388578063dd62ed3e146103f55761009c565b806306fdde03146100aa578063095ea7b31461012d57806318160ddd1461019a57806323b872dd146101b8575b6000806100a7610c16565b50505b6100b2610476565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f25780820151818401526020810190506100d7565b50505050905090810190601f16801561011f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101826004803603604081101561014c57600080610149610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610530565b60405180821515815260200191505060405180910390f35b6101a261063b565b6040518082815260200191505060405180910390f35b61022d600480360360608110156101d7576000806101d4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610648565b60405180821515815260200191505060405180910390f35b6102906004803603602081101561026457600080610261610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610906565b6040518082815260200191505060405180910390f35b610311600480360360408110156102c5576000806102c2610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610925565b6040518082815260200191505060405180910390f35b6103726004803603602081101561034657600080610343610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610951565b6040518082815260200191505060405180910390f35b6103dd600480360360408110156103a7576000806103a4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b60405180821515815260200191505060405180910390f35b6104606004803603604081101561041457600080610411610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b6040518082815260200191505060405180910390f35b600380610481610c84565b600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182806104bc610c84565b600181600116156101000203166002900480156105285780601f106104f65761010080836104e8610c84565b040283529160200191610528565b820191906000526020600020905b8161050d610c84565b8152906001019060200180831161050457829003601f168201915b505050505081565b600081600160005a610540610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906105c1610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a6105e4610ce7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6002610645610c84565b81565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610691610c84565b10156106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180610e00604f9139606001915050604051809103906106ee610c16565b50505b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a61073c610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061077e610c84565b10156107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526056815260200180610daa60569139606001915050604051809103906107db610c16565b50505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610829610c84565b019250508190610837610d44565b505050816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610885610c84565b039250508190610893610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000602052806000526040600020600091509050610922610c84565b81565b60016020528160005260406000206020528060005260406000206000915091505061094e610c84565b81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610999610c84565b9050919050565b6000816000805a6109af610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206109f1610c84565b1015610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180610e4f6034913960400191505060405180910390610a4e610c16565b50505b816000805a610a5e610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610aa4610c84565b039250508190610ab2610d44565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610b00610c84565b019250508190610b0e610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610b31610ce7565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c0e610c84565b905092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c51578086015181604084010152602081019050610c33565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610ce257600081830152602081019050610cc8565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610d3f57600081830152602081019050610d25565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015610da457600081830152602081019050610d8a565b50505056fe43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520796f7520646f6e2774206861766520656e6f756768206f6620616e20616c6c6f77616e63652e43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520697420646f65736e2774206861766520656e6f7567682062616c616e63652e596f7520646f6e2774206861766520656e6f7567682062616c616e636520746f206d616b652074686973207472616e7366657221",
+ "deployedBytecode": "0x608060405234801561001957600080610016610c16565b50505b506004361061009c5760003560e01c806327e235e31161006f57806327e235e31461024557806355b6ed5c146102a657806370a0823114610327578063a9059cbb14610388578063dd62ed3e146103f55761009c565b806306fdde03146100aa578063095ea7b31461012d57806318160ddd1461019a57806323b872dd146101b8575b6000806100a7610c16565b50505b6100b2610476565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f25780820151818401526020810190506100d7565b50505050905090810190601f16801561011f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101826004803603604081101561014c57600080610149610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610530565b60405180821515815260200191505060405180910390f35b6101a261063b565b6040518082815260200191505060405180910390f35b61022d600480360360608110156101d7576000806101d4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610648565b60405180821515815260200191505060405180910390f35b6102906004803603602081101561026457600080610261610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610906565b6040518082815260200191505060405180910390f35b610311600480360360408110156102c5576000806102c2610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610925565b6040518082815260200191505060405180910390f35b6103726004803603602081101561034657600080610343610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610951565b6040518082815260200191505060405180910390f35b6103dd600480360360408110156103a7576000806103a4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b60405180821515815260200191505060405180910390f35b6104606004803603604081101561041457600080610411610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b6040518082815260200191505060405180910390f35b600380610481610c84565b600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182806104bc610c84565b600181600116156101000203166002900480156105285780601f106104f65761010080836104e8610c84565b040283529160200191610528565b820191906000526020600020905b8161050d610c84565b8152906001019060200180831161050457829003601f168201915b505050505081565b600081600160005a610540610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906105c1610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a6105e4610ce7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6002610645610c84565b81565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610691610c84565b10156106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180610e00604f9139606001915050604051809103906106ee610c16565b50505b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a61073c610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061077e610c84565b10156107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526056815260200180610daa60569139606001915050604051809103906107db610c16565b50505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610829610c84565b019250508190610837610d44565b505050816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610885610c84565b039250508190610893610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000602052806000526040600020600091509050610922610c84565b81565b60016020528160005260406000206020528060005260406000206000915091505061094e610c84565b81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610999610c84565b9050919050565b6000816000805a6109af610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206109f1610c84565b1015610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180610e4f6034913960400191505060405180910390610a4e610c16565b50505b816000805a610a5e610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610aa4610c84565b039250508190610ab2610d44565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610b00610c84565b019250508190610b0e610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610b31610ce7565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c0e610c84565b905092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c51578086015181604084010152602081019050610c33565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610ce257600081830152602081019050610cc8565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610d3f57600081830152602081019050610d25565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015610da457600081830152602081019050610d8a565b50505056fe43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520796f7520646f6e2774206861766520656e6f756768206f6620616e20616c6c6f77616e63652e43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520697420646f65736e2774206861766520656e6f7567682062616c616e63652e596f7520646f6e2774206861766520656e6f7567682062616c616e636520746f206d616b652074686973207472616e7366657221",
+ "devdoc": {
+ "details": "A super simple ERC20 implementation!",
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "Address of the account to check an allowance from.",
+ "_spender": "Address of the account trying to spend from the owner."
+ },
+ "returns": {
+ "_0": "Allowance for the spender from the owner."
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_amount": "Amount to allow the account to spend from your account.",
+ "_spender": "Account to approve a balance for."
+ },
+ "returns": {
+ "_0": "true if the allowance was successful."
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "Address to check a balance for."
+ },
+ "returns": {
+ "_0": "Balance of the address."
+ }
+ },
+ "constructor": {
+ "params": {
+ "_initialSupply": "Initial maximum token supply.",
+ "_name": "A name for our ERC20 (technically optional, but it's fun ok jeez)."
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_amount": "Amount to transfer to the other account.",
+ "_to": "Address to transfer a balance to."
+ },
+ "returns": {
+ "_0": "true if the transfer was successful."
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_amount": "Amount to transfer to the other account.",
+ "_from": "Account to transfer a balance from.",
+ "_to": "Account to transfer a balance to."
+ },
+ "returns": {
+ "_0": "true if the transfer was successful."
+ }
+ }
+ },
+ "title": "ERC20",
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "allowance(address,address)": {
+ "notice": "Checks how much a given account is allowed to spend from another given account."
+ },
+ "approve(address,uint256)": {
+ "notice": "Approves an account to spend some amount from your account."
+ },
+ "balanceOf(address)": {
+ "notice": "Checks the balance of an address."
+ },
+ "transfer(address,uint256)": {
+ "notice": "Transfers a balance from your account to someone else's account!"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "Transfers a balance from someone else's account to another account. You need an allowance from the sending account for this to work!"
+ }
+ },
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [
+ {
+ "astId": 22,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "balances",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_address,t_uint256)"
+ },
+ {
+ "astId": 28,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "allowances",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
+ },
+ {
+ "astId": 30,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "totalSupply",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_uint256"
+ },
+ {
+ "astId": 32,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "name",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_string_storage"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "encoding": "inplace",
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32",
+ "value": "t_mapping(t_address,t_uint256)"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32",
+ "value": "t_uint256"
+ },
+ "t_string_storage": {
+ "encoding": "bytes",
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "encoding": "inplace",
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/hardhat/deployments/optimism/solcInputs/a4e2764a77fec30ccb674d800c46e436.json b/examples/hardhat/deployments/optimism/solcInputs/a4e2764a77fec30ccb674d800c46e436.json
new file mode 100644
index 000000000000..9172859cb7af
--- /dev/null
+++ b/examples/hardhat/deployments/optimism/solcInputs/a4e2764a77fec30ccb674d800c46e436.json
@@ -0,0 +1,35 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "contracts/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.6.0 <0.8.0;\n\n/**\n * @title ERC20\n * @dev A super simple ERC20 implementation!\n */\ncontract ERC20 {\n\n /**********\n * Events *\n **********/\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (address => uint256) public balances;\n mapping (address => mapping (address => uint256)) public allowances;\n\n // Some optional extra goodies.\n uint256 public totalSupply;\n string public name;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _initialSupply Initial maximum token supply.\n * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).\n */\n constructor(\n uint256 _initialSupply,\n string memory _name\n )\n public\n {\n balances[msg.sender] = _initialSupply;\n totalSupply = _initialSupply;\n name = _name;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks the balance of an address.\n * @param _owner Address to check a balance for.\n * @return Balance of the address.\n */\n function balanceOf(\n address _owner\n )\n external\n view\n returns (\n uint256\n )\n {\n return balances[_owner];\n }\n\n /**\n * Transfers a balance from your account to someone else's account!\n * @param _to Address to transfer a balance to.\n * @param _amount Amount to transfer to the other account.\n * @return true if the transfer was successful.\n */\n function transfer(\n address _to,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n require(\n balances[msg.sender] >= _amount,\n \"You don't have enough balance to make this transfer!\"\n );\n\n balances[msg.sender] -= _amount;\n balances[_to] += _amount;\n\n emit Transfer(\n msg.sender,\n _to,\n _amount\n );\n\n return true;\n }\n\n /**\n * Transfers a balance from someone else's account to another account. You need an allowance\n * from the sending account for this to work!\n * @param _from Account to transfer a balance from.\n * @param _to Account to transfer a balance to.\n * @param _amount Amount to transfer to the other account.\n * @return true if the transfer was successful.\n */\n function transferFrom(\n address _from,\n address _to,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n require(\n balances[_from] >= _amount,\n \"Can't transfer from the desired account because it doesn't have enough balance.\"\n );\n\n require(\n allowances[_from][msg.sender] >= _amount,\n \"Can't transfer from the desired account because you don't have enough of an allowance.\"\n );\n\n balances[_to] += _amount;\n balances[_from] -= _amount;\n\n emit Transfer(\n _from,\n _to,\n _amount\n );\n\n return true;\n }\n\n /**\n * Approves an account to spend some amount from your account.\n * @param _spender Account to approve a balance for.\n * @param _amount Amount to allow the account to spend from your account.\n * @return true if the allowance was successful.\n */\n function approve(\n address _spender,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n allowances[msg.sender][_spender] = _amount;\n\n emit Approval(\n msg.sender,\n _spender,\n _amount\n );\n\n return true;\n }\n\n /**\n * Checks how much a given account is allowed to spend from another given account.\n * @param _owner Address of the account to check an allowance from.\n * @param _spender Address of the account trying to spend from the owner.\n * @return Allowance for the spender from the owner.\n */\n function allowance(\n address _owner,\n address _spender\n )\n external\n view\n returns (\n uint256\n )\n {\n return allowances[_owner][_spender];\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": false,
+ "runs": 200
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata",
+ "devdoc",
+ "userdoc",
+ "storageLayout",
+ "evm.gasEstimates"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ },
+ "metadata": {
+ "useLiteralContent": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/hardhat/hardhat.config.js b/examples/hardhat/hardhat.config.js
index c42677ecf5f8..bd5aa89e526f 100644
--- a/examples/hardhat/hardhat.config.js
+++ b/examples/hardhat/hardhat.config.js
@@ -1,7 +1,7 @@
require('@nomiclabs/hardhat-ethers')
require('@nomiclabs/hardhat-waffle')
require('hardhat-deploy')
-require("@eth-optimism/hardhat-ovm")
+require('@eth-optimism/hardhat-ovm')
module.exports = {
networks: {
diff --git a/examples/hardhat/package.json b/examples/hardhat/package.json
index 46f29693641a..21cb7de0ac23 100644
--- a/examples/hardhat/package.json
+++ b/examples/hardhat/package.json
@@ -3,29 +3,30 @@
"private": true,
"version": "1.0.0",
"main": "index.js",
+ "author": "Optimism PBC",
"license": "MIT",
"scripts": {
- "deploy": "hardhat deploy",
- "deploy:ovm": "hardhat deploy --network optimism",
+ "clean": "rimraf ./cache-ovm ./cache ./artifacts-ovm ./artifacts ./deployments",
"compile": "hardhat compile",
"compile:ovm": "hardhat compile --network optimism",
"test:integration": "hardhat test",
"test:integration:ovm": "hardhat test --network optimism",
- "clean": "rimraf ./cache-ovm ./cache ./artifacts-ovm ./artifacts ./deployments"
+ "deploy": "hardhat deploy",
+ "deploy:ovm": "hardhat deploy --network optimism"
},
"devDependencies": {
- "@eth-optimism/hardhat-ovm": "^0.1.0",
"@nomiclabs/hardhat-ethers": "^2.0.1",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@types/chai": "4.2.17",
- "@types/chai-as-promised": "^7.1.3",
"@types/mocha": "^8.2.2",
"chai": "4.3.4",
- "chai-as-promised": "^7.1.1",
"ethereum-waffle": "^3.3.0",
"ethers": "^5.1.4",
"hardhat": "^2.2.0",
"hardhat-deploy": "^0.7.5",
"mocha": "^8.2.1"
+ },
+ "dependencies": {
+ "@eth-optimism/hardhat-ovm": "^0.2.0"
}
}
diff --git a/examples/hardhat/test/erc20.test.js b/examples/hardhat/test/erc20.test.js
index ffae27d24f89..974e80fb7410 100644
--- a/examples/hardhat/test/erc20.test.js
+++ b/examples/hardhat/test/erc20.test.js
@@ -1,7 +1,10 @@
/* External Imports */
-const { ethers } = require('hardhat')
-const { expect } = require('chai')
+const { ethers, network } = require('hardhat')
+const chai = require('chai')
+const { solidity } = require('ethereum-waffle')
+const { expect } = chai
+chai.use(solidity)
describe(`ERC20`, () => {
const INITIAL_SUPPLY = 1000000
@@ -43,15 +46,15 @@ describe(`ERC20`, () => {
it(`should revert when the sender does not have enough balance`, async () => {
const tx = ERC20.connect(account1).transfer(
await account2.getAddress(),
- INITIAL_SUPPLY + 1,
+ INITIAL_SUPPLY + 1
)
- await expect(tx).to.be.reverted
+ await expect(tx).to.be.revertedWith("You don't have enough balance to make this transfer!")
})
it(`should succeed when the sender has enough balance`, async () => {
const tx = await ERC20.connect(account1).transfer(
await account2.getAddress(),
- INITIAL_SUPPLY,
+ INITIAL_SUPPLY
)
await tx.wait()
@@ -73,22 +76,22 @@ describe(`ERC20`, () => {
const tx = ERC20.connect(account2).transferFrom(
await account1.getAddress(),
await account2.getAddress(),
- INITIAL_SUPPLY,
+ INITIAL_SUPPLY
)
- await expect(tx).to.be.reverted
+ await expect(tx).to.be.revertedWith("Can't transfer from the desired account because you don't have enough of an allowance.")
})
it(`should succeed when the owner has enough balance and the sender has a large enough allowance`, async () => {
const tx1 = await ERC20.connect(account1).approve(
await account2.getAddress(),
- INITIAL_SUPPLY,
+ INITIAL_SUPPLY
)
await tx1.wait()
const tx2 = await ERC20.connect(account2).transferFrom(
await account1.getAddress(),
await account2.getAddress(),
- INITIAL_SUPPLY,
+ INITIAL_SUPPLY
)
await tx2.wait()
diff --git a/examples/waffle/yarn.lock b/examples/hardhat/yarn.lock
similarity index 79%
rename from examples/waffle/yarn.lock
rename to examples/hardhat/yarn.lock
index 9e4bdcdcdbb3..ddb257af4093 100644
--- a/examples/waffle/yarn.lock
+++ b/examples/hardhat/yarn.lock
@@ -18,20 +18,12 @@
resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
-"@eth-optimism/solc@0.7.6-alpha.1":
- version "0.7.6-alpha.1"
- resolved "https://registry.yarnpkg.com/@eth-optimism/solc/-/solc-0.7.6-alpha.1.tgz#f503073161fdc0029dbc1dae6fae28eeb046b559"
- integrity sha512-tVYeBtjwNRUDmaTdJNlKI0lTM0yV1hez0jPFOtACoepBwBEZOuuFLBgQLBOWPaR95UU2ke1YjqB7rrpkE3oRDg==
+"@eth-optimism/hardhat-ovm@^0.2.0":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.2.2.tgz#55fafaa6b8277447abaf132602c1c6d14a2a18a2"
+ integrity sha512-QLzqawYCzC/m6K/Oaj/tCZQlu6kZTgnleg1cJad8kVYA5E+JWZQ6ZJrcStoJoJrco9RIroPUjAFEhFM8YiCc7Q==
dependencies:
- command-exists "^1.2.8"
- commander "3.0.2"
- follow-redirects "^1.12.1"
- fs-extra "^0.30.0"
- js-sha3 "0.8.0"
- memorystream "^0.3.1"
- require-from-string "^2.0.0"
- semver "^5.5.0"
- tmp "0.0.33"
+ node-fetch "^2.6.1"
"@ethereum-waffle/chai@^3.3.0":
version "3.3.1"
@@ -86,6 +78,76 @@
patch-package "^6.2.2"
postinstall-postinstall "^2.1.0"
+"@ethereumjs/block@^3.2.1", "@ethereumjs/block@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.3.0.tgz#a1b3baec831c71c0d9e7f6145f25e919cff4939c"
+ integrity sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA==
+ dependencies:
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/tx" "^3.2.0"
+ ethereumjs-util "^7.0.10"
+ merkle-patricia-tree "^4.2.0"
+
+"@ethereumjs/blockchain@^5.2.1", "@ethereumjs/blockchain@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.3.0.tgz#206936e30a4320d87a26e58d157eadef21ef6ff1"
+ integrity sha512-B0Y5QDZcRDQISPilv3m8nzk97QmC98DnSE9WxzGpCxfef22Mw7xhwGipci5Iy0dVC2Np2Cr5d3F6bHAR7+yVmQ==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/ethash" "^1.0.0"
+ debug "^2.2.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+"@ethereumjs/common@^2.2.0", "@ethereumjs/common@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.3.0.tgz#b1174fab8653565b4835a455d972dc2e89411896"
+ integrity sha512-Fmi15MdVptsC85n6NcUXIFiiXCXWEfZNgPWP+OGAQOC6ZtdzoNawtxH/cYpIgEgSuIzfOeX3VKQP/qVI1wISHg==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.0.10"
+
+"@ethereumjs/ethash@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
+ integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.7"
+ miller-rabin "^4.0.0"
+
+"@ethereumjs/tx@^3.1.3", "@ethereumjs/tx@^3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.2.0.tgz#2a816d5db67eb36059c8dc13f022f64e9b8d7ab9"
+ integrity sha512-D3X/XtZ3ldUg34hr99Jvj7NxW3NxVKdUKrwQnEWlAp4CmCQpvYoyn7NF4lk34rHEt7ScS+Agu01pcDHoOcd19A==
+ dependencies:
+ "@ethereumjs/common" "^2.3.0"
+ ethereumjs-util "^7.0.10"
+
+"@ethereumjs/vm@^5.3.2":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.4.0.tgz#092d530388e855310406160f144d6f492800c0ea"
+ integrity sha512-0Mv51inp5S/mh+fKP0H90byT/5DdFirChUFUMhEjDlIBnHK55o/liKZ+0iNSLm6ZxX8iPs7urp11/UCoxPJfLA==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/blockchain" "^5.3.0"
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/tx" "^3.2.0"
+ async-eventemitter "^0.2.4"
+ core-js-pure "^3.0.1"
+ debug "^2.2.0"
+ ethereumjs-util "^7.0.10"
+ functional-red-black-tree "^1.0.1"
+ mcl-wasm "^0.7.1"
+ merkle-patricia-tree "^4.2.0"
+ rustbn.js "~0.2.0"
+ util.promisify "^1.0.1"
+
"@ethersproject/abi@5.0.0-beta.153":
version "5.0.0-beta.153"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
@@ -101,343 +163,357 @@
"@ethersproject/properties" ">=5.0.0-beta.131"
"@ethersproject/strings" ">=5.0.0-beta.130"
-"@ethersproject/abi@5.1.2", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.1.0":
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.1.2.tgz#a8e75cd0455e6dc9e4861c3d1c22bbe436c1d775"
- integrity sha512-uMhoQVPX0UtfzTpekYQSEUcJGDgsJ25ifz+SV6PDETWaUFhcR8RNgb1QPTASP13inW8r6iy0/Xdq9D5hK2pNvA==
- dependencies:
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/constants" "^5.1.0"
- "@ethersproject/hash" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
-
-"@ethersproject/abstract-provider@5.1.0", "@ethersproject/abstract-provider@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz#1f24c56cda5524ef4ed3cfc562a01d6b6f8eeb0b"
- integrity sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ==
- dependencies:
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/networks" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/transactions" "^5.1.0"
- "@ethersproject/web" "^5.1.0"
-
-"@ethersproject/abstract-signer@5.1.0", "@ethersproject/abstract-signer@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz#744c7a2d0ebe3cc0bc38294d0f53d5ca3f4e49e3"
- integrity sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w==
- dependencies:
- "@ethersproject/abstract-provider" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
-
-"@ethersproject/address@5.1.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.1.0.tgz#3854fd7ebcb6af7597de66f847c3345dae735b58"
- integrity sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg==
- dependencies:
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/rlp" "^5.1.0"
-
-"@ethersproject/base64@5.1.0", "@ethersproject/base64@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.1.0.tgz#27240c174d0a4e13f6eae87416fd876caf7f42b6"
- integrity sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g==
- dependencies:
- "@ethersproject/bytes" "^5.1.0"
-
-"@ethersproject/basex@5.1.0", "@ethersproject/basex@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.1.0.tgz#80da2e86f9da0cb5ccd446b337364d791f6a131c"
- integrity sha512-vBKr39bum7DDbOvkr1Sj19bRMEPA4FnST6Utt6xhDzI7o7L6QNkDn2yrCfP+hnvJGhZFKtLygWwqlTBZoBXYLg==
- dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
-
-"@ethersproject/bignumber@5.1.1", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.1.0":
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.1.1.tgz#84812695253ccbc639117f7ac49ee1529b68e637"
- integrity sha512-AVz5iqz7+70RIqoQTznsdJ6DOVBYciNlvO+AlQmPTB6ofCvoihI9bQdr6wljsX+d5W7Yc4nyvQvP4JMzg0Agig==
- dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- bn.js "^4.4.0"
-
-"@ethersproject/bytes@5.1.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.1.0.tgz#55dfa9c4c21df1b1b538be3accb50fb76d5facfd"
- integrity sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g==
- dependencies:
- "@ethersproject/logger" "^5.1.0"
-
-"@ethersproject/constants@5.1.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.1.0.tgz#4e7da6367ea0e9be87585d8b09f3fccf384b1452"
- integrity sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw==
- dependencies:
- "@ethersproject/bignumber" "^5.1.0"
+"@ethersproject/abi@5.3.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.0.tgz#00f0647d906edcd32c50b16ab9c98f83e208dcf1"
+ integrity sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz#f4c0ae4a4cef9f204d7781de805fd44b72756c81"
+ integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+
+"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz#05172b653e15b535ed5854ef5f6a72f4b441052d"
+ integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/address@5.3.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.3.0.tgz#e53b69eacebf332e8175de814c5e6507d6932518"
+ integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+
+"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.3.0.tgz#b831fb35418b42ad24d943c557259062b8640824"
+ integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+
+"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.3.0.tgz#02dea3ab8559ae625c6d548bc11773432255c916"
+ integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db"
+ integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ bn.js "^4.11.9"
-"@ethersproject/contracts@5.1.1":
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.1.1.tgz#c66cb6d618fcbd73e20a6b808e8f768b2b781d0b"
- integrity sha512-6WwktLJ0DFWU8pDkgH4IGttQHhQN4SnwKFu9h+QYVe48VGWtbDu4W8/q/7QA1u/HWlWMrKxqawPiZUJj0UMvOw==
- dependencies:
- "@ethersproject/abi" "^5.1.0"
- "@ethersproject/abstract-provider" "^5.1.0"
- "@ethersproject/abstract-signer" "^5.1.0"
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/constants" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/transactions" "^5.1.0"
-
-"@ethersproject/hash@5.1.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.1.0.tgz#40961d64837d57f580b7b055e0d74174876d891e"
- integrity sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ==
- dependencies:
- "@ethersproject/abstract-signer" "^5.1.0"
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
-
-"@ethersproject/hdnode@5.1.0", "@ethersproject/hdnode@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.1.0.tgz#2bf5c4048935136ce83e9242e1bd570afcc0bc83"
- integrity sha512-obIWdlujloExPHWJGmhJO/sETOOo7SEb6qemV4f8kyFoXg+cJK+Ta9SvBrj7hsUK85n3LZeZJZRjjM7oez3Clg==
- dependencies:
- "@ethersproject/abstract-signer" "^5.1.0"
- "@ethersproject/basex" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/pbkdf2" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/sha2" "^5.1.0"
- "@ethersproject/signing-key" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
- "@ethersproject/transactions" "^5.1.0"
- "@ethersproject/wordlists" "^5.1.0"
-
-"@ethersproject/json-wallets@5.1.0", "@ethersproject/json-wallets@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.1.0.tgz#bba7af2e520e8aea4d3829d80520db5d2e4fb8d2"
- integrity sha512-00n2iBy27w8zrGZSiU762UOVuzCQZxUZxopsZC47++js6xUFuI74DHcJ5K/2pddlF1YBskvmMuboEu1geK8mnA==
- dependencies:
- "@ethersproject/abstract-signer" "^5.1.0"
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/hdnode" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/pbkdf2" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/random" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
- "@ethersproject/transactions" "^5.1.0"
+"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9"
+ integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/constants@5.3.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77"
+ integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+
+"@ethersproject/contracts@5.3.0", "@ethersproject/contracts@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.3.0.tgz#ad699a3abaae30bfb6422cf31813a663b2d4099c"
+ integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==
+ dependencies:
+ "@ethersproject/abi" "^5.3.0"
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+
+"@ethersproject/hash@5.3.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.3.0.tgz#f65e3bf3db3282df4da676db6cfa049535dd3643"
+ integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.3.0.tgz#26fed65ffd5c25463fddff13f5fb4e5617553c94"
+ integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz#7b1a5ff500c12aa8597ae82c8939837b0449376e"
+ integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
aes-js "3.0.0"
scrypt-js "3.0.1"
-"@ethersproject/keccak256@5.1.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.1.0.tgz#fdcd88fb13bfef4271b225cdd8dec4d315c8e60e"
- integrity sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig==
+"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be"
+ integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==
dependencies:
- "@ethersproject/bytes" "^5.1.0"
+ "@ethersproject/bytes" "^5.3.0"
js-sha3 "0.5.7"
-"@ethersproject/logger@5.1.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.1.0.tgz#4cdeeefac029373349d5818f39c31b82cc6d9bbf"
- integrity sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw==
-
-"@ethersproject/networks@5.1.0", "@ethersproject/networks@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.1.0.tgz#f537290cb05aa6dc5e81e910926c04cfd5814bca"
- integrity sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA==
- dependencies:
- "@ethersproject/logger" "^5.1.0"
-
-"@ethersproject/pbkdf2@5.1.0", "@ethersproject/pbkdf2@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.1.0.tgz#6b740a85dc780e879338af74856ca2c0d3b24d19"
- integrity sha512-B8cUbHHTgs8OtgJIafrRcz/YPDobVd5Ru8gTnShOiM9EBuFpYHQpq3+8iQJ6pyczDu6HP/oc/njAsIBhwFZYew==
- dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/sha2" "^5.1.0"
-
-"@ethersproject/properties@5.1.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.1.0.tgz#9484bd6def16595fc6e4bdc26f29dff4d3f6ac42"
- integrity sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg==
- dependencies:
- "@ethersproject/logger" "^5.1.0"
-
-"@ethersproject/providers@5.1.2":
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.1.2.tgz#4e4459698903f911402fe91aa7544eb07f3921ed"
- integrity sha512-GqsS8rd+eyd4eNkcNgzZ4l9IRULBPUZa7JPnv22k4MHflMobUseyhfbVnmoN5bVNNkOxjV1IPTw9i0sV1hwdpg==
- dependencies:
- "@ethersproject/abstract-provider" "^5.1.0"
- "@ethersproject/abstract-signer" "^5.1.0"
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/basex" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/constants" "^5.1.0"
- "@ethersproject/hash" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/networks" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/random" "^5.1.0"
- "@ethersproject/rlp" "^5.1.0"
- "@ethersproject/sha2" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
- "@ethersproject/transactions" "^5.1.0"
- "@ethersproject/web" "^5.1.0"
+"@ethersproject/logger@5.3.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0"
+ integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==
+
+"@ethersproject/networks@5.3.0", "@ethersproject/networks@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.0.tgz#d8ad06eb107c69fb8651f4c81ddd0e88944fdfea"
+ integrity sha512-XGbD9MMgqrR7SYz8o6xVgdG+25v7YT5vQG8ZdlcLj2I7elOBM7VNeQrnxfSN7rWQNcqu2z80OM29gGbQz+4Low==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz#8adbb41489c3c9f319cc44bc7d3e6095fd468dc8"
+ integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+
+"@ethersproject/properties@5.3.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.3.0.tgz#feef4c4babeb7c10a6b3449575016f4ad2c092b2"
+ integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/providers@5.3.0", "@ethersproject/providers@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.3.0.tgz#bccb49f1073a7d56e24f49abb14bb281c9b08636"
+ integrity sha512-HtL+DEbzPcRyfrkrMay7Rk/4he+NbUpzI/wHXP4Cqtra82nQOnqqCgTQc4HbdDrl75WVxG/JRMFhyneIPIMZaA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
bech32 "1.1.4"
- ws "7.2.3"
+ ws "7.4.6"
-"@ethersproject/random@5.1.0", "@ethersproject/random@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.1.0.tgz#0bdff2554df03ebc5f75689614f2d58ea0d9a71f"
- integrity sha512-+uuczLQZ4+no9cP6TCoCktXx0u2YbNaRT7lRkSt12d8263e702f0u+4JnnRO8Qmv5nylWJebnqCHzyxP+6mLqw==
+"@ethersproject/random@5.3.0", "@ethersproject/random@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.3.0.tgz#7c46bf36e50cb0d0550bc8c666af8e1d4496dc1a"
+ integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==
dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
-"@ethersproject/rlp@5.1.0", "@ethersproject/rlp@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.1.0.tgz#700f4f071c27fa298d3c1d637485fefe919dd084"
- integrity sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw==
+"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.3.0.tgz#7cb93a7b5dfa69163894153c9d4b0d936f333188"
+ integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==
dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
-"@ethersproject/sha2@5.1.0", "@ethersproject/sha2@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.1.0.tgz#6ca42d1a26884b3e32ffa943fe6494af7211506c"
- integrity sha512-+fNSeZRstOpdRJpdGUkRONFCaiAqWkc91zXgg76Nlp5ndBQE25Kk5yK8gCPG1aGnCrbariiPr5j9DmrYH78JCA==
+"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366"
+ integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==
dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- hash.js "1.1.3"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ hash.js "1.1.7"
-"@ethersproject/signing-key@5.1.0", "@ethersproject/signing-key@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.1.0.tgz#6eddfbddb6826b597b9650e01acf817bf8991b9c"
- integrity sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw==
+"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.3.0.tgz#a96c88f8173e1abedfa35de32d3e5db7c48e5259"
+ integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==
dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- bn.js "^4.4.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ bn.js "^4.11.9"
elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.3.0", "@ethersproject/solidity@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93"
+ integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/strings@5.3.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0"
+ integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.3.0.tgz#49b86f2bafa4d0bdf8e596578fc795ee47c50458"
+ integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+
+"@ethersproject/units@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.3.0.tgz#c4d1493532ad3d4ddf6e2bc4f8c94a2db933a8f5"
+ integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/wallet@5.3.0", "@ethersproject/wallet@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.3.0.tgz#91946b470bd279e39ade58866f21f92749d062af"
+ integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/json-wallets" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/web@5.3.0", "@ethersproject/web@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.3.0.tgz#7959c403f6476c61515008d8f92da51c553a8ee1"
+ integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==
+ dependencies:
+ "@ethersproject/base64" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.3.0.tgz#45a0205f5178c1de33d316cb2ab7ed5eac3c06c5"
+ integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@nomiclabs/hardhat-ethers@^2.0.1":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
+ integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
-"@ethersproject/solidity@5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.1.0.tgz#095a9c75244edccb26c452c155736d363399b954"
- integrity sha512-kPodsGyo9zg1g9XSXp1lGhFaezBAUUsAUB1Vf6OkppE5Wksg4Et+x3kG4m7J/uShDMP2upkJtHNsIBK2XkVpKQ==
- dependencies:
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/sha2" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
-
-"@ethersproject/strings@5.1.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.1.0.tgz#0f95a56c3c8c9d5510a06c241d818779750e2da5"
- integrity sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw==
- dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/constants" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
-
-"@ethersproject/transactions@5.1.1", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.1.0":
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.1.1.tgz#5a6bbb25fb062c3cc75eb0db12faefcdd3870813"
- integrity sha512-Nwgbp09ttIVN0OoUBatCXaHxR7grWPHbozJN8v7AXDLrl6nnOIBEMDh+yJTnosSQlFhcyjfTGGN+Mx6R8HdvMw==
- dependencies:
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/constants" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/rlp" "^5.1.0"
- "@ethersproject/signing-key" "^5.1.0"
-
-"@ethersproject/units@5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.1.0.tgz#b6ab3430ebc22adc3cb4839516496f167bee3ad5"
- integrity sha512-isvJrx6qG0nKWfxsGORNjmOq/nh175fStfvRTA2xEKrGqx8JNJY83fswu4GkILowfriEM/eYpretfJnfzi7YhA==
- dependencies:
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/constants" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
-
-"@ethersproject/wallet@5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.1.0.tgz#134c5816eaeaa586beae9f9ff67891104a2c9a15"
- integrity sha512-ULmUtiYQLTUS+y3DgkLzRhFEK10zMwmjOthnjiZxee3Q/MVwr3rnmuAnXIUZrPjna6hvUPnyRIdW5XuF0Ld0YQ==
- dependencies:
- "@ethersproject/abstract-provider" "^5.1.0"
- "@ethersproject/abstract-signer" "^5.1.0"
- "@ethersproject/address" "^5.1.0"
- "@ethersproject/bignumber" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/hash" "^5.1.0"
- "@ethersproject/hdnode" "^5.1.0"
- "@ethersproject/json-wallets" "^5.1.0"
- "@ethersproject/keccak256" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/random" "^5.1.0"
- "@ethersproject/signing-key" "^5.1.0"
- "@ethersproject/transactions" "^5.1.0"
- "@ethersproject/wordlists" "^5.1.0"
-
-"@ethersproject/web@5.1.0", "@ethersproject/web@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.1.0.tgz#ed56bbe4e3d9a8ffe3b2ed882da5c62d3551381b"
- integrity sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA==
- dependencies:
- "@ethersproject/base64" "^5.1.0"
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
-
-"@ethersproject/wordlists@5.1.0", "@ethersproject/wordlists@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.1.0.tgz#54eb9ef3a00babbff90ffe124e19c89e07e6aace"
- integrity sha512-NsUCi/TpBb+oTFvMSccUkJGtp5o/84eOyqp5q5aBeiNBSLkYyw21znRn9mAmxZgySpxgruVgKbaapnYPgvctPQ==
+"@nomiclabs/hardhat-waffle@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2"
+ integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==
dependencies:
- "@ethersproject/bytes" "^5.1.0"
- "@ethersproject/hash" "^5.1.0"
- "@ethersproject/logger" "^5.1.0"
- "@ethersproject/properties" "^5.1.0"
- "@ethersproject/strings" "^5.1.0"
+ "@types/sinon-chai" "^3.2.3"
+ "@types/web3" "1.0.19"
"@resolver-engine/core@^0.3.3":
version "0.3.3"
@@ -476,11 +552,98 @@
path-browserify "^1.0.0"
url "^0.11.0"
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/hub" "5.30.0"
+ "@sentry/tracing" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^7.1.0":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@solidity-parser/parser@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add"
+ integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==
+
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@@ -495,6 +658,18 @@
dependencies:
ethers "^5.0.2"
+"@types/abstract-leveldown@*":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e"
+ integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ==
+
+"@types/bn.js@*", "@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
version "4.11.6"
resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
@@ -502,13 +677,29 @@
dependencies:
"@types/node" "*"
-"@types/bn.js@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
- integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+"@types/chai@*":
+ version "4.2.18"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4"
+ integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ==
+
+"@types/chai@4.2.17":
+ version "4.2.17"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.17.tgz#85f9f0610f514b22a94125d441f73eef65bde5cc"
+ integrity sha512-LaiwWNnYuL8xJlQcE91QB2JoswWZckq9A4b+nMPq8dt8AP96727Nb3X4e74u+E3tm4NLTILNI9MYFsyVc30wSA==
+
+"@types/levelup@^4.3.0":
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.1.tgz#7a53b9fd510716e11b2065332790fdf5f9b950b9"
+ integrity sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A==
dependencies:
+ "@types/abstract-leveldown" "*"
"@types/node" "*"
+"@types/lru-cache@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03"
+ integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==
+
"@types/mkdirp@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
@@ -516,6 +707,11 @@
dependencies:
"@types/node" "*"
+"@types/mocha@^8.2.2":
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
+ integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
+
"@types/node-fetch@^2.5.5":
version "2.5.10"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132"
@@ -525,14 +721,14 @@
form-data "^3.0.0"
"@types/node@*":
- version "15.0.1"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a"
- integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08"
+ integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==
"@types/node@^12.12.6":
- version "12.20.11"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.11.tgz#980832cd56efafff8c18aa148c4085eb02a483f4"
- integrity sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ==
+ version "12.20.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364"
+ integrity sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A==
"@types/pbkdf2@^3.0.0":
version "3.1.0"
@@ -546,6 +742,11 @@
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0"
integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==
+"@types/qs@^6.9.4":
+ version "6.9.6"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
+ integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
+
"@types/resolve@^0.0.8":
version "0.0.8"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
@@ -560,11 +761,51 @@
dependencies:
"@types/node" "*"
+"@types/sinon-chai@^3.2.3":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48"
+ integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*":
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.1.tgz#97ccb0482b750f5140ffdc661240ebbbe6e28d75"
+ integrity sha512-tZulsvuJwif5ddTBtscflI7gJcd+RpENcNZ7QCp0jKEl0bZY3Pu6PbJs4GR3SfQkGgsUa+FrlKsKQ0XyGNvDuA==
+ dependencies:
+ "@sinonjs/fake-timers" "^7.1.0"
+
+"@types/underscore@*":
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.2.tgz#9441e0f6402bbcb72dbee771582fa57c5a1dedd3"
+ integrity sha512-Ls2ylbo7++ITrWk2Yc3G/jijwSq5V3GT0tlgVXEl2kKYXY3ImrtmTCoE2uyTWFRI5owMBriloZFWbE1SXOsE7w==
+
+"@types/web3@1.0.19":
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924"
+ integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==
+ dependencies:
+ "@types/bn.js" "*"
+ "@types/underscore" "*"
+
+"@ungap/promise-all-settled@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
+ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
+
"@yarnpkg/lockfile@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
abstract-leveldown@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
@@ -586,6 +827,17 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
dependencies:
xtend "~4.0.0"
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
abstract-leveldown@~2.6.0:
version "2.6.3"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
@@ -593,6 +845,17 @@ abstract-leveldown@~2.6.0:
dependencies:
xtend "~4.0.0"
+abstract-leveldown@~6.2.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@@ -601,6 +864,11 @@ accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
aes-js@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
@@ -611,6 +879,13 @@ aes-js@^3.1.1:
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
ajv@^6.12.3:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@@ -626,6 +901,18 @@ ansi-colors@3.2.3:
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+ansi-colors@4.1.1, ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@@ -641,6 +928,11 @@ ansi-regex@^4.1.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -653,6 +945,13 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
anymatch@~3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
@@ -668,6 +967,11 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -739,7 +1043,7 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-async-eventemitter@^0.2.2:
+async-eventemitter@^0.2.2, async-eventemitter@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
@@ -775,6 +1079,11 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
@@ -790,6 +1099,13 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+axios@^0.21.1:
+ version "0.21.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
+ integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
+ dependencies:
+ follow-redirects "^1.10.0"
+
babel-code-frame@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@ -1394,7 +1710,7 @@ bn.js@4.11.6:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0:
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
@@ -1650,17 +1966,22 @@ camelcase@^5.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
caniuse-lite@^1.0.30000844:
- version "1.0.30001218"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001218.tgz#9b44f6ed16f875db6373e2debd4d14a07359002f"
- integrity sha512-0ASydOWSy3bB88FbDpJSTt+PfDwnMqrym3yRZfqG8EXSQ06OZhF+q5wgYP/EN+jJMERItNcDQUqMyNjzZ+r5+Q==
+ version "1.0.30001232"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001232.tgz#2ebc8b6a77656fd772ab44a82a332a26a17e9527"
+ integrity sha512-e4Gyp7P8vqC2qV2iHA+cJNf/yqUKOShXQOJHQt81OHxlIZl/j/j3soEA0adAQi8CPUQgvOdDENyQ5kd6a6mNSg==
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-chai@^4.3.4:
+chai@4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
@@ -1692,6 +2013,14 @@ chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
check-error@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
@@ -1719,6 +2048,21 @@ chokidar@3.3.0:
optionalDependencies:
fsevents "~2.1.1"
+chokidar@3.5.1, chokidar@^3.4.0:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
@@ -1781,6 +2125,15 @@ cliui@^5.0.0:
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
@@ -1813,11 +2166,23 @@ color-convert@^1.9.0:
dependencies:
color-name "1.1.3"
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -1902,6 +2267,11 @@ cookie@0.4.0:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
cookiejar@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
@@ -1913,9 +2283,9 @@ copy-descriptor@^0.1.0:
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
core-js-pure@^3.0.1:
- version "3.11.0"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.11.0.tgz#e07f25a8f616d178ec16b0354b008ad28b20b2f0"
- integrity sha512-PxEiQGjzC+5qbvE7ZIs5Zn6BynNeZO9zHhrrWmkRff2SZLq0CE/H5LuZOJHhmOQ8L38+eMzEHAmPYWrUtDfuDQ==
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.1.tgz#5d139d346780f015f67225f45ee2362a6bed6ba1"
+ integrity sha512-wVlh0IAi2t1iOEh16y4u1TRk6ubd4KvLE8dlMi+3QUI6SfKphQUh7tAwihGGSQ8affxEXpVIPpOdf9kjR4v4Pw==
core-js@^2.4.0, core-js@^2.5.0:
version "2.6.12"
@@ -1935,6 +2305,14 @@ cors@^2.8.1:
object-assign "^4"
vary "^1"
+crc-32@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+ integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
+ dependencies:
+ exit-on-epipe "~1.0.1"
+ printj "~1.1.0"
+
create-ecdh@^4.0.0:
version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
@@ -2031,6 +2409,13 @@ debug@3.2.6:
dependencies:
ms "^2.1.1"
+debug@4, debug@4.3.1, debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
debug@^3.1.0:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@@ -2038,18 +2423,16 @@ debug@^3.1.0:
dependencies:
ms "^2.1.1"
-debug@^4.1.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
- integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
- dependencies:
- ms "2.1.2"
-
decamelize@^1.1.1, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -2101,6 +2484,14 @@ deferred-leveldown@~4.0.0:
abstract-leveldown "~5.0.0"
inherits "^2.0.3"
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
define-properties@^1.1.2, define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -2170,6 +2561,11 @@ diff@3.5.0:
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -2184,11 +2580,6 @@ dom-walk@^0.1.0:
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
-dotenv@^8.2.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
- integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
-
dotignore@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
@@ -2215,9 +2606,9 @@ ee-first@1.1.1:
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.3.47:
- version "1.3.723"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.723.tgz#52769a75635342a4db29af5f1e40bd3dad02c877"
- integrity sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg==
+ version "1.3.743"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.743.tgz#fcec24d6d647cb84fd796b42caa1b4039a180894"
+ integrity sha512-K2wXfo9iZQzNJNx67+Pld0DRF+9bYinj62gXCdgPhcu1vidwVuLPHQPPFnCdO55njWigXXpfBiT90jGUPbw8Zg==
elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
version "6.5.4"
@@ -2237,6 +2628,16 @@ emoji-regex@^7.0.1:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encode-utf8@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+ integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@@ -2253,6 +2654,16 @@ encoding-down@5.0.4, encoding-down@~5.0.0:
level-errors "^2.0.0"
xtend "^4.0.1"
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
encoding@^0.1.11:
version "0.1.13"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
@@ -2267,6 +2678,18 @@ end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
+enquirer@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
errno@~0.1.1:
version "0.1.8"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
@@ -2282,9 +2705,9 @@ error-ex@^1.2.0:
is-arrayish "^0.2.1"
es-abstract@^1.18.0-next.2:
- version "1.18.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4"
- integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
@@ -2294,14 +2717,14 @@ es-abstract@^1.18.0-next.2:
has-symbols "^1.0.2"
is-callable "^1.2.3"
is-negative-zero "^2.0.1"
- is-regex "^1.1.2"
- is-string "^1.0.5"
- object-inspect "^1.9.0"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
object-keys "^1.1.1"
object.assign "^4.1.2"
string.prototype.trimend "^1.0.4"
string.prototype.trimstart "^1.0.4"
- unbox-primitive "^1.0.0"
+ unbox-primitive "^1.0.1"
es-to-primitive@^1.2.1:
version "1.2.1"
@@ -2338,6 +2761,11 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3:
d "^1.0.1"
ext "^1.1.2"
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -2348,6 +2776,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
esprima@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@@ -2462,6 +2895,16 @@ eth-sig-util@^1.4.2:
ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
ethereumjs-util "^5.1.1"
+eth-sig-util@^2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5"
+ integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==
+ dependencies:
+ ethereumjs-abi "0.6.8"
+ ethereumjs-util "^5.1.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.0"
+
eth-tx-summary@^3.1.2:
version "3.2.4"
resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
@@ -2505,7 +2948,7 @@ ethereum-common@^0.0.18:
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
-ethereum-cryptography@^0.1.3:
+ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
@@ -2526,7 +2969,7 @@ ethereum-cryptography@^0.1.3:
secp256k1 "^4.0.1"
setimmediate "^1.0.5"
-ethereum-waffle@^3.0.0:
+ethereum-waffle@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.3.0.tgz#166a0cc1d3b2925f117b20ef0951b3fe72e38e79"
integrity sha512-4xm3RWAPCu5LlaVxYEg0tG3L7g5ovBw1GY/UebrzZ+OTx22vcPjI+bvelFlGBpkdnO5yOIFXjH2eK59tNAe9IA==
@@ -2545,7 +2988,7 @@ ethereumjs-abi@0.6.5:
bn.js "^4.10.0"
ethereumjs-util "^4.3.0"
-ethereumjs-abi@0.6.8:
+ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8:
version "0.6.8"
resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
@@ -2555,7 +2998,7 @@ ethereumjs-abi@0.6.8:
"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
version "0.6.8"
- resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1a27c59c15ab1e95ee8e5c4ed6ad814c49cc439e"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
dependencies:
bn.js "^4.11.8"
ethereumjs-util "^6.0.0"
@@ -2679,7 +3122,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum
rlp "^2.0.0"
safe-buffer "^5.1.1"
-ethereumjs-util@^7.0.2:
+ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7:
version "7.0.10"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
@@ -2744,41 +3187,41 @@ ethereumjs-wallet@0.6.5:
utf8 "^3.0.0"
uuid "^3.3.2"
-ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.1.4.tgz#8ae973705ed962f8f41dc59693704002a38dd18b"
- integrity sha512-EAPQ/fgGRu0PoR/VNFnHTMOtG/IZ0AItdW55C9T8ffmVu0rnyllZL404eBF66elJehOLz2kxnUrhXpE7TCpW7g==
- dependencies:
- "@ethersproject/abi" "5.1.2"
- "@ethersproject/abstract-provider" "5.1.0"
- "@ethersproject/abstract-signer" "5.1.0"
- "@ethersproject/address" "5.1.0"
- "@ethersproject/base64" "5.1.0"
- "@ethersproject/basex" "5.1.0"
- "@ethersproject/bignumber" "5.1.1"
- "@ethersproject/bytes" "5.1.0"
- "@ethersproject/constants" "5.1.0"
- "@ethersproject/contracts" "5.1.1"
- "@ethersproject/hash" "5.1.0"
- "@ethersproject/hdnode" "5.1.0"
- "@ethersproject/json-wallets" "5.1.0"
- "@ethersproject/keccak256" "5.1.0"
- "@ethersproject/logger" "5.1.0"
- "@ethersproject/networks" "5.1.0"
- "@ethersproject/pbkdf2" "5.1.0"
- "@ethersproject/properties" "5.1.0"
- "@ethersproject/providers" "5.1.2"
- "@ethersproject/random" "5.1.0"
- "@ethersproject/rlp" "5.1.0"
- "@ethersproject/sha2" "5.1.0"
- "@ethersproject/signing-key" "5.1.0"
- "@ethersproject/solidity" "5.1.0"
- "@ethersproject/strings" "5.1.0"
- "@ethersproject/transactions" "5.1.1"
- "@ethersproject/units" "5.1.0"
- "@ethersproject/wallet" "5.1.0"
- "@ethersproject/web" "5.1.0"
- "@ethersproject/wordlists" "5.1.0"
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.4:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.0.tgz#1ec14d09c461e8f2554b00cd080e94a3094e7e9d"
+ integrity sha512-myN+338S4sFQZvQ9trii7xit8Hu/LnUtjA0ROFOHpUreQc3fgLZEMNVqF3vM1u2D78DIIeG1TbuozVCVlXQWvQ==
+ dependencies:
+ "@ethersproject/abi" "5.3.0"
+ "@ethersproject/abstract-provider" "5.3.0"
+ "@ethersproject/abstract-signer" "5.3.0"
+ "@ethersproject/address" "5.3.0"
+ "@ethersproject/base64" "5.3.0"
+ "@ethersproject/basex" "5.3.0"
+ "@ethersproject/bignumber" "5.3.0"
+ "@ethersproject/bytes" "5.3.0"
+ "@ethersproject/constants" "5.3.0"
+ "@ethersproject/contracts" "5.3.0"
+ "@ethersproject/hash" "5.3.0"
+ "@ethersproject/hdnode" "5.3.0"
+ "@ethersproject/json-wallets" "5.3.0"
+ "@ethersproject/keccak256" "5.3.0"
+ "@ethersproject/logger" "5.3.0"
+ "@ethersproject/networks" "5.3.0"
+ "@ethersproject/pbkdf2" "5.3.0"
+ "@ethersproject/properties" "5.3.0"
+ "@ethersproject/providers" "5.3.0"
+ "@ethersproject/random" "5.3.0"
+ "@ethersproject/rlp" "5.3.0"
+ "@ethersproject/sha2" "5.3.0"
+ "@ethersproject/signing-key" "5.3.0"
+ "@ethersproject/solidity" "5.3.0"
+ "@ethersproject/strings" "5.3.0"
+ "@ethersproject/transactions" "5.3.0"
+ "@ethersproject/units" "5.3.0"
+ "@ethersproject/wallet" "5.3.0"
+ "@ethersproject/web" "5.3.0"
+ "@ethersproject/wordlists" "5.3.0"
ethjs-unit@0.1.6:
version "0.1.6"
@@ -2796,6 +3239,11 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3:
is-hex-prefixed "1.0.0"
strip-hex-prefix "1.0.0"
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
eventemitter3@4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
@@ -2814,6 +3262,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
+exit-on-epipe@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+ integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
+
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
@@ -2983,6 +3436,14 @@ find-up@3.0.0, find-up@^3.0.0:
dependencies:
locate-path "^3.0.0"
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -2991,6 +3452,13 @@ find-up@^1.0.0:
path-exists "^2.0.0"
pinkie-promise "^2.0.0"
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
find-yarn-workspace-root@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
@@ -3013,15 +3481,27 @@ flat@^4.1.0:
dependencies:
is-buffer "~2.0.3"
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
flow-stoplight@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
-follow-redirects@^1.12.1:
- version "1.14.0"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.0.tgz#f5d260f95c5f8c105894491feee5dc8993b402fe"
- integrity sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==
+fmix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c"
+ integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=
+ dependencies:
+ imul "^1.0.0"
+
+follow-redirects@^1.10.0, follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
for-each@^0.3.3, for-each@~0.3.3:
version "0.3.3"
@@ -3058,10 +3538,20 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
-forwarded@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
- integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
fragment-cache@^0.2.1:
version "0.2.1"
@@ -3104,6 +3594,16 @@ fs-extra@^7.0.0, fs-extra@^7.0.1:
jsonfile "^4.0.0"
universalify "^0.1.0"
+fs-extra@^9.0.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
fs-minipass@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
@@ -3121,6 +3621,11 @@ fsevents@~2.1.1:
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+fsevents@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
function-bind@^1.1.1, function-bind@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@@ -3173,7 +3678,7 @@ get-caller-file@^1.0.1:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-get-caller-file@^2.0.1:
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -3242,7 +3747,7 @@ glob@7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.2, glob@^7.1.3, glob@~7.1.6:
+glob@7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -3254,6 +3759,18 @@ glob@^7.1.2, glob@^7.1.3, glob@~7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
+glob@^7.1.2, glob@^7.1.3, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
global@~4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
@@ -3304,7 +3821,7 @@ got@^7.1.0:
url-parse-lax "^1.0.0"
url-to-options "^1.0.1"
-graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0:
version "4.2.6"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
@@ -3327,6 +3844,83 @@ har-validator@~5.1.3:
ajv "^6.12.3"
har-schema "^2.0.0"
+hardhat-deploy@^0.7.5:
+ version "0.7.10"
+ resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.10.tgz#2bc94bf36db5f39aa488c6c6569f07d5ca4b410a"
+ integrity sha512-+0oiEWy/FgKOEzRNhSWPqSjofVCwtkK3E5x916kbZ5SgFGOjWTFCrWbWUYjzc2GyZgNXuSuRn8mBowHSLF4sVg==
+ dependencies:
+ "@ethersproject/abi" "^5.0.0"
+ "@ethersproject/abstract-signer" "^5.0.0"
+ "@ethersproject/address" "^5.0.0"
+ "@ethersproject/bignumber" "^5.0.0"
+ "@ethersproject/bytes" "^5.0.0"
+ "@ethersproject/contracts" "^5.0.0"
+ "@ethersproject/providers" "^5.0.0"
+ "@ethersproject/solidity" "^5.0.0"
+ "@ethersproject/transactions" "^5.0.0"
+ "@ethersproject/wallet" "^5.0.0"
+ "@types/qs" "^6.9.4"
+ axios "^0.21.1"
+ chalk "^4.1.0"
+ chokidar "^3.4.0"
+ debug "^4.1.1"
+ form-data "^3.0.0"
+ fs-extra "^9.0.0"
+ match-all "^1.2.6"
+ murmur-128 "^0.2.1"
+ qs "^6.9.4"
+
+hardhat@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.3.0.tgz#5c29f8b4d08155c3dc8c908af9713fd5079522d5"
+ integrity sha512-nc4ro2bM4wPaA6/0Y22o5F5QrifQk2KCyPUUKLPUeFFZoGNGYB8vmeW/k9gV9DdMukdWTzfYlKc2Jn4bfb6tDQ==
+ dependencies:
+ "@ethereumjs/block" "^3.2.1"
+ "@ethereumjs/blockchain" "^5.2.1"
+ "@ethereumjs/common" "^2.2.0"
+ "@ethereumjs/tx" "^3.1.3"
+ "@ethereumjs/vm" "^5.3.2"
+ "@sentry/node" "^5.18.1"
+ "@solidity-parser/parser" "^0.11.0"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ abort-controller "^3.0.0"
+ adm-zip "^0.4.16"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ eth-sig-util "^2.5.2"
+ ethereum-cryptography "^0.1.2"
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^7.0.10"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "^7.1.3"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ lodash "^4.17.11"
+ merkle-patricia-tree "^4.1.0"
+ mnemonist "^0.38.0"
+ mocha "^7.1.2"
+ node-fetch "^2.6.0"
+ qs "^6.7.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ slash "^3.0.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ "true-case-path" "^2.2.1"
+ tsort "0.0.1"
+ uuid "^3.3.2"
+ ws "^7.2.1"
+
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -3344,6 +3938,11 @@ has-flag@^3.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
has-symbol-support-x@^1.4.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
@@ -3408,15 +4007,7 @@ hash-base@^3.0.0:
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
-hash.js@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
- integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==
- dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.0"
-
-hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
@@ -3472,7 +4063,7 @@ http-errors@1.7.2:
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
-http-errors@~1.7.2:
+http-errors@1.7.3, http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
@@ -3497,6 +4088,14 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -3505,9 +4104,9 @@ iconv-lite@0.4.24:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01"
- integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
@@ -3533,6 +4132,16 @@ immediate@~3.2.3:
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+immutable@^4.0.0-rc.12:
+ version "4.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
+ integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
+
+imul@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9"
+ integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=
+
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -3563,6 +4172,13 @@ invert-kv@^1.0.0:
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
@@ -3595,9 +4211,9 @@ is-arrayish@^0.2.1:
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-bigint@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2"
- integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
is-binary-path@~2.1.0:
version "2.1.0"
@@ -3607,11 +4223,11 @@ is-binary-path@~2.1.0:
binary-extensions "^2.0.0"
is-boolean-object@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0"
- integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
is-buffer@^1.1.5:
version "1.1.6"
@@ -3636,9 +4252,9 @@ is-ci@^2.0.0:
ci-info "^2.0.0"
is-core-module@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887"
- integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
dependencies:
has "^1.0.3"
@@ -3657,9 +4273,9 @@ is-data-descriptor@^1.0.0:
kind-of "^6.0.0"
is-date-object@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
- integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
is-descriptor@^0.1.0:
version "0.1.6"
@@ -3723,6 +4339,11 @@ is-fullwidth-code-point@^2.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
is-function@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
@@ -3746,9 +4367,9 @@ is-negative-zero@^2.0.1:
integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
is-number-object@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197"
- integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
is-number@^3.0.0:
version "3.0.0"
@@ -3772,6 +4393,11 @@ is-plain-obj@^1.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -3779,13 +4405,13 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-is-regex@^1.0.4, is-regex@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251"
- integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
dependencies:
call-bind "^1.0.2"
- has-symbols "^1.0.1"
+ has-symbols "^1.0.2"
is-regex@~1.0.5:
version "1.0.5"
@@ -3804,17 +4430,17 @@ is-stream@^1.0.0, is-stream@^1.0.1:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
-is-string@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
- integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
is-symbol@^1.0.2, is-symbol@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
- integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
dependencies:
- has-symbols "^1.0.1"
+ has-symbols "^1.0.2"
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
@@ -3911,6 +4537,13 @@ js-yaml@3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
+ integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
+ dependencies:
+ argparse "^2.0.1"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -3996,6 +4629,15 @@ jsonfile@^4.0.0:
optionalDependencies:
graceful-fs "^4.1.6"
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
@@ -4083,6 +4725,11 @@ level-codec@~7.0.0:
resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
level-errors@^1.0.3:
version "1.1.2"
resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
@@ -4132,6 +4779,15 @@ level-iterator-stream@~3.0.0:
readable-stream "^2.3.6"
xtend "^4.0.0"
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
level-mem@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
@@ -4140,6 +4796,22 @@ level-mem@^3.0.1:
level-packager "~4.0.0"
memdown "~3.0.0"
+level-mem@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d"
+ integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==
+ dependencies:
+ level-packager "^5.0.3"
+ memdown "^5.0.0"
+
+level-packager@^5.0.3:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
level-packager@~4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
@@ -4171,6 +4843,13 @@ level-sublevel@6.6.4:
typewiselite "~1.0.0"
xtend "~4.0.0"
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
level-ws@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
@@ -4188,6 +4867,15 @@ level-ws@^1.0.0:
readable-stream "^2.2.8"
xtend "^4.0.1"
+level-ws@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339"
+ integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^3.1.0"
+ xtend "^4.0.1"
+
levelup@3.1.1, levelup@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
@@ -4211,6 +4899,17 @@ levelup@^1.2.1:
semver "~5.4.1"
xtend "~4.0.0"
+levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -4222,6 +4921,14 @@ load-json-file@^1.0.0:
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -4230,6 +4937,13 @@ locate-path@^3.0.0:
p-locate "^3.0.0"
path-exists "^3.0.0"
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
lodash.assign@^4.0.3, lodash.assign@^4.0.6:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@@ -4252,6 +4966,13 @@ log-symbols@3.0.0:
dependencies:
chalk "^2.4.2"
+log-symbols@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
looper@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
@@ -4293,6 +5014,11 @@ lru-cache@^3.2.0:
dependencies:
pseudomap "^1.0.1"
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
ltgt@^2.1.2, ltgt@~2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
@@ -4315,6 +5041,16 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
+match-all@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d"
+ integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==
+
+mcl-wasm@^0.7.1:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.7.tgz#fd463dd1641a37f9f55b6ca8e5a38e95be2bc58f"
+ integrity sha512-jDGiCQA++5hX37gdH6RDZ3ZsA0raet7xyY/R5itj5cbcdf4Gvw+YyxWX/ZZ0Z2UPxJiw1ktRsCJZzpnqlQILdw==
+
md5.js@^1.3.4:
version "1.3.5"
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
@@ -4341,6 +5077,18 @@ memdown@^1.0.0:
ltgt "~2.2.0"
safe-buffer "~5.1.1"
+memdown@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb"
+ integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.2.0"
+
memdown@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
@@ -4390,6 +5138,19 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
rlp "^2.0.0"
semaphore ">=1.0.1"
+merkle-patricia-tree@^4.1.0, merkle-patricia-tree@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1"
+ integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ level-ws "^2.0.0"
+ readable-stream "^3.6.0"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -4430,17 +5191,17 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
-mime-db@1.47.0:
- version "1.47.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
- integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.30"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
- integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
dependencies:
- mime-db "1.47.0"
+ mime-db "1.48.0"
mime@1.6.0:
version "1.6.0"
@@ -4523,7 +5284,14 @@ mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
dependencies:
minimist "^1.2.5"
-mocha@^7.0.1:
+mnemonist@^0.38.0:
+ version "0.38.3"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d"
+ integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==
+ dependencies:
+ obliterator "^1.6.1"
+
+mocha@^7.1.2:
version "7.2.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
@@ -4553,6 +5321,37 @@ mocha@^7.0.1:
yargs-parser "13.1.2"
yargs-unparser "1.6.0"
+mocha@^8.2.1:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
+ integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+ dependencies:
+ "@ungap/promise-all-settled" "1.1.2"
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.5.1"
+ debug "4.3.1"
+ diff "5.0.0"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "4.0.0"
+ log-symbols "4.0.0"
+ minimatch "3.0.4"
+ ms "2.1.3"
+ nanoid "3.1.20"
+ serialize-javascript "5.0.1"
+ strip-json-comments "3.1.1"
+ supports-color "8.1.1"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.1.0"
+ yargs "16.2.0"
+ yargs-parser "20.2.4"
+ yargs-unparser "2.0.0"
+
mock-fs@^4.1.0:
version "4.14.0"
resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
@@ -4573,7 +5372,7 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@^2.1.1:
+ms@2.1.3, ms@^2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -4618,11 +5417,25 @@ multihashes@^0.4.15, multihashes@~0.4.15:
multibase "^0.7.0"
varint "^5.0.0"
+murmur-128@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d"
+ integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==
+ dependencies:
+ encode-utf8 "^1.0.2"
+ fmix "^0.1.0"
+ imul "^1.0.0"
+
nano-json-stream-parser@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+nanoid@3.1.20:
+ version "3.1.20"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
+ integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -4673,7 +5486,7 @@ node-fetch@2.1.2:
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
-node-fetch@^2.6.0:
+node-fetch@^2.6.0, node-fetch@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
@@ -4707,9 +5520,9 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
normalize-url@^4.1.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
- integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
number-is-nan@^1.0.0:
version "1.0.1"
@@ -4743,10 +5556,10 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
-object-inspect@^1.9.0:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30"
- integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
object-inspect@~1.7.0:
version "1.7.0"
@@ -4814,6 +5627,11 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
+obliterator@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3"
+ integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==
+
oboe@2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
@@ -4875,6 +5693,13 @@ p-finally@^1.0.0:
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
p-limit@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -4882,6 +5707,20 @@ p-limit@^2.0.0:
dependencies:
p-try "^2.0.0"
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
p-locate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
@@ -4889,6 +5728,13 @@ p-locate@^3.0.0:
dependencies:
p-limit "^2.0.0"
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
p-timeout@^1.1.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
@@ -4896,6 +5742,11 @@ p-timeout@^1.1.1:
dependencies:
p-finally "^1.0.0"
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
p-try@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
@@ -4988,6 +5839,11 @@ path-exists@^3.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -4999,9 +5855,9 @@ path-key@^2.0.1:
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-parse@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@0.1.7:
version "0.1.7"
@@ -5038,10 +5894,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-picomatch@^2.0.4, picomatch@^2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d"
- integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
@@ -5086,9 +5942,14 @@ prepend-http@^2.0.0:
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
prettier@^2.1.2:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
- integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18"
+ integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==
+
+printj@~1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+ integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
private@^0.1.6, private@^0.1.8:
version "0.1.8"
@@ -5114,11 +5975,11 @@ promise-to-callback@^1.0.0:
set-immediate-shim "^1.0.1"
proxy-addr@~2.0.5:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
- integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
dependencies:
- forwarded "~0.1.2"
+ forwarded "0.2.0"
ipaddr.js "1.9.1"
prr@~1.0.1:
@@ -5224,6 +6085,13 @@ qs@6.7.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+qs@^6.7.0, qs@^6.9.4:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
qs@~6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -5273,6 +6141,16 @@ raw-body@2.4.0:
iconv-lite "0.4.24"
unpipe "1.0.0"
+raw-body@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -5313,7 +6191,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.6, readable-stream@^3.6.0:
+readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -5339,6 +6217,13 @@ readdirp@~3.2.0:
dependencies:
picomatch "^2.0.4"
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
regenerate@^1.2.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
@@ -5468,6 +6353,13 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+resolve@1.17.0, resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
resolve@^1.10.0, resolve@^1.8.1:
version "1.20.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
@@ -5476,13 +6368,6 @@ resolve@^1.10.0, resolve@^1.8.1:
is-core-module "^2.2.0"
path-parse "^1.0.6"
-resolve@~1.17.0:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
- integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
- dependencies:
- path-parse "^1.0.6"
-
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
@@ -5584,6 +6469,11 @@ seedrandom@3.0.1:
resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+semaphore-async-await@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa"
+ integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=
+
semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
@@ -5594,6 +6484,11 @@ semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
semver@~5.4.1:
version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
@@ -5618,6 +6513,13 @@ send@0.17.1:
range-parser "~1.2.1"
statuses "~1.5.0"
+serialize-javascript@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
@@ -5689,6 +6591,15 @@ shebang-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
@@ -5713,6 +6624,11 @@ slash@^2.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -5743,10 +6659,10 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
-solc@0.7.6:
- version "0.7.6"
- resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.6.tgz#21fc5dc11b85fcc518c181578b454f3271c27252"
- integrity sha512-WsR/W7CXwh2VnmZapB4JrsDeLlshoKBz5Pz/zYNulB6LBsOEHI2Zj/GeKLMFcvv57OHiXHvxq5ZOQB+EdqxlxQ==
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
dependencies:
command-exists "^1.2.8"
commander "3.0.2"
@@ -5809,6 +6725,14 @@ source-map-support@^0.4.15:
dependencies:
source-map "^0.5.6"
+source-map-support@^0.5.13:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map-url@^0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
@@ -5846,9 +6770,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65"
- integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
@@ -5877,6 +6801,13 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -5929,6 +6860,15 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
string.prototype.trim@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
@@ -5994,6 +6934,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
strip-bom@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -6013,6 +6960,11 @@ strip-json-comments@2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+strip-json-comments@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
supports-color@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
@@ -6020,6 +6972,13 @@ supports-color@6.0.0:
dependencies:
has-flag "^3.0.0"
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -6032,6 +6991,13 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
swarm-js@^0.1.40:
version "0.1.40"
resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
@@ -6188,6 +7154,11 @@ trim-right@^1.0.1:
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+"true-case-path@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf"
+ integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==
+
ts-essentials@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
@@ -6213,6 +7184,16 @@ ts-generator@^0.1.1:
resolve "^1.8.1"
ts-essentials "^1.0.0"
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=
+
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -6230,16 +7211,26 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
-tweetnacl@^1.0.0:
+tweetnacl@^1.0.0, tweetnacl@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
-type-detect@^4.0.0, type-detect@^4.0.5:
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -6310,7 +7301,7 @@ ultron@~1.1.0:
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
-unbox-primitive@^1.0.0:
+unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
@@ -6320,6 +7311,11 @@ unbox-primitive@^1.0.0:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
underscore@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
@@ -6340,6 +7336,11 @@ universalify@^0.1.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
unorm@^1.3.3:
version "1.6.0"
resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
@@ -6408,9 +7409,9 @@ use@^3.1.0:
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
utf-8-validate@^5.0.2:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8"
- integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
dependencies:
node-gyp-build "^4.2.0"
@@ -6424,7 +7425,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-util.promisify@^1.0.0:
+util.promisify@^1.0.0, util.promisify@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
@@ -6730,9 +7731,9 @@ web3-utils@1.2.11:
utf8 "3.0.0"
web3-utils@^1.0.0-beta.31:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.5.tgz#14ee2ff1a7a226867698d6eaffd21aa97aed422e"
- integrity sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A==
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10"
+ integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==
dependencies:
bn.js "^4.11.9"
eth-lib "0.2.8"
@@ -6740,7 +7741,7 @@ web3-utils@^1.0.0-beta.31:
ethjs-unit "0.1.6"
number-to-bn "1.7.0"
randombytes "^2.1.0"
- underscore "1.9.1"
+ underscore "1.12.1"
utf8 "3.0.0"
web3@1.2.11:
@@ -6813,6 +7814,13 @@ which@1.3.1, which@^1.2.9:
dependencies:
isexe "^2.0.0"
+which@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
wide-align@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
@@ -6825,6 +7833,11 @@ window-size@^0.2.0:
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+workerpool@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
+ integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
@@ -6842,15 +7855,24 @@ wrap-ansi@^5.1.0:
string-width "^3.0.0"
strip-ansi "^5.0.0"
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-ws@7.2.3:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46"
- integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==
+ws@7.4.6, ws@^7.2.1:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
ws@^3.0.0:
version "3.3.3"
@@ -6905,7 +7927,7 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
parse-headers "^2.0.0"
xtend "^4.0.0"
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -6927,6 +7949,11 @@ y18n@^4.0.0:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
yaeti@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
@@ -6945,6 +7972,11 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2:
camelcase "^5.0.0"
decamelize "^1.2.0"
+yargs-parser@20.2.4:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+
yargs-parser@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
@@ -6953,6 +7985,11 @@ yargs-parser@^2.4.1:
camelcase "^3.0.0"
lodash.assign "^4.0.6"
+yargs-parser@^20.2.2:
+ version "20.2.7"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+ integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
yargs-unparser@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
@@ -6962,6 +7999,16 @@ yargs-unparser@1.6.0:
lodash "^4.17.15"
yargs "^13.3.0"
+yargs-unparser@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
yargs@13.3.2, yargs@^13.3.0:
version "13.3.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
@@ -6978,6 +8025,19 @@ yargs@13.3.2, yargs@^13.3.0:
y18n "^4.0.0"
yargs-parser "^13.1.2"
+yargs@16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
yargs@^4.7.1:
version "4.8.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
@@ -6997,3 +8057,8 @@ yargs@^4.7.1:
window-size "^0.2.0"
y18n "^3.2.1"
yargs-parser "^2.4.1"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/examples/l1-l2-deposit-withdrawal/.gitignore b/examples/l1-l2-deposit-withdrawal/.gitignore
new file mode 100644
index 000000000000..861cdb7d8c3f
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/.gitignore
@@ -0,0 +1,11 @@
+# Packages
+node_modules/
+
+# Hardhat build outputs
+artifacts/
+artifacts-ovm/
+cache/
+cache-ovm/
+optimism
+
+.env
\ No newline at end of file
diff --git a/examples/l1-l2-deposit-withdrawal/README.md b/examples/l1-l2-deposit-withdrawal/README.md
new file mode 100644
index 000000000000..9f3952f4a973
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/README.md
@@ -0,0 +1,3 @@
+# L1/L2 ERC20 Deposit + Withdrawal Example
+
+### For the full README, please see the [guided repository of `l1-l2-deposit-withdrawal`](https://github.com/ethereum-optimism/l1-l2-deposit-withdrawal)
\ No newline at end of file
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/ERC20.sol b/examples/l1-l2-deposit-withdrawal/contracts/ERC20.sol
new file mode 100644
index 000000000000..bfb223340c0b
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/ERC20.sol
@@ -0,0 +1,241 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.6.0 <0.8.0;
+
+/**
+ * @title ERC20
+ * @dev A super simple ERC20 implementation! Also *very* insecure. Do not use in prod.
+ */
+contract ERC20 {
+
+ /**********
+ * Events *
+ **********/
+
+ event Transfer(
+ address indexed _from,
+ address indexed _to,
+ uint256 _value
+ );
+
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+
+
+ /*************
+ * Variables *
+ *************/
+
+ mapping (address => uint256) public balances;
+ mapping (address => mapping (address => uint256)) public allowances;
+
+ // Some optional extra goodies.
+ uint256 public totalSupply;
+ string public name;
+ string public symbol;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _initialSupply Initial maximum token supply.
+ * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).
+ * @param _symbol A symbol for our ERC20
+ */
+ constructor(
+ uint256 _initialSupply,
+ string memory _name,
+ string memory _symbol
+ )
+ public
+ {
+ balances[msg.sender] = _initialSupply;
+ totalSupply = _initialSupply;
+ name = _name;
+ symbol = _symbol;
+ }
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Checks the balance of an address.
+ * @param _owner Address to check a balance for.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _owner
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_owner];
+ }
+
+ /**
+ * Transfers a balance from your account to someone else's account!
+ * @param _to Address to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transfer(
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[msg.sender] >= _amount,
+ "You don't have enough balance to make this transfer!"
+ );
+
+ balances[msg.sender] -= _amount;
+ balances[_to] += _amount;
+
+ emit Transfer(
+ msg.sender,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Transfers a balance from someone else's account to another account. You need an allowance
+ * from the sending account for this to work!
+ * @param _from Account to transfer a balance from.
+ * @param _to Account to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[_from] >= _amount,
+ "Can't transfer from the desired account because it doesn't have enough balance."
+ );
+
+ require(
+ allowances[_from][msg.sender] >= _amount,
+ "Can't transfer from the desired account because you don't have enough of an allowance."
+ );
+
+ balances[_to] += _amount;
+ balances[_from] -= _amount;
+
+ emit Transfer(
+ _from,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Approves an account to spend some amount from your account.
+ * @param _spender Account to approve a balance for.
+ * @param _amount Amount to allow the account to spend from your account.
+ * @return true if the allowance was successful.
+ */
+ function approve(
+ address _spender,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ allowances[msg.sender][_spender] = _amount;
+
+ emit Approval(
+ msg.sender,
+ _spender,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks how much a given account is allowed to spend from another given account.
+ * @param _owner Address of the account to check an allowance from.
+ * @param _spender Address of the account trying to spend from the owner.
+ * @return Allowance for the spender from the owner.
+ */
+ function allowance(
+ address _owner,
+ address _spender
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return allowances[_owner][_spender];
+ }
+
+ /**
+ * Internal minting function.
+ * @param _who Address to mint tokens for.
+ * @param _amount Number of tokens to mint.
+ */
+ function _mint(
+ address _who,
+ uint256 _amount
+ )
+ internal
+ {
+ totalSupply += _amount;
+ balances[_who] += _amount;
+ emit Transfer(address(0), _who, _amount);
+ }
+
+ /**
+ * Internal burning function.
+ * @param _who Address to burn tokens from.
+ * @param _amount Number of tokens to burn.
+ */
+ function _burn(
+ address _who,
+ uint256 _amount
+ )
+ internal
+ {
+ require(
+ totalSupply >= _amount,
+ "Can't burn more than total supply."
+ );
+
+ require(
+ balances[_who] >= _amount,
+ "Account does not have enough to burn."
+ );
+
+ totalSupply -= _amount;
+ balances[_who] -= _amount;
+ emit Transfer(_who, address(0), _amount);
+ }
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/L2StandardERC20.sol b/examples/l1-l2-deposit-withdrawal/contracts/L2StandardERC20.sol
new file mode 100644
index 000000000000..76be60f50ca7
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/L2StandardERC20.sol
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.16 <0.8.0;
+
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+import './interfaces/IL2StandardERC20.sol';
+
+contract L2StandardERC20 is IL2StandardERC20, ERC20 {
+ address public override l1Token;
+ address public l2Bridge;
+
+ /**
+ * @param _l1Token Address of the corresponding L1 token.
+ * @param _name ERC20 name.
+ * @param _symbol ERC20 symbol.
+ */
+ constructor(
+ address _l2Bridge,
+ address _l1Token,
+ string memory _name,
+ string memory _symbol
+ )
+ ERC20(_name, _symbol) {
+ l1Token = _l1Token;
+ l2Bridge = _l2Bridge;
+ }
+
+ modifier onlyL2Bridge {
+ require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn");
+ _;
+ }
+
+ function supportsInterface(bytes4 _interfaceId) public override pure returns (bool) {
+ bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)")); // ERC165
+ bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector
+ ^ IL2StandardERC20.mint.selector
+ ^ IL2StandardERC20.burn.selector;
+ return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;
+ }
+
+ function mint(address _to, uint256 _amount) public override onlyL2Bridge {
+ _mint(_to, _amount);
+
+ emit Mint(_to, _amount);
+ }
+
+ function burn(address _from, uint256 _amount) public override onlyL2Bridge {
+ _burn(_from, _amount);
+
+ emit Burn(_from, _amount);
+ }
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/OVM_CrossDomainEnabled.sol b/examples/l1-l2-deposit-withdrawal/contracts/OVM_CrossDomainEnabled.sol
new file mode 100644
index 000000000000..4297c3649cdc
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/OVM_CrossDomainEnabled.sol
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/* Interface Imports */
+import { iOVM_CrossDomainMessenger } from "./interfaces/iOVM_CrossDomainMessenger.sol";
+
+/**
+ * @title OVM_CrossDomainEnabled
+ * @dev Helper contract for contracts performing cross-domain communications
+ *
+ * Compiler used: defined by inheriting contract
+ * Runtime target: defined by inheriting contract
+ */
+contract OVM_CrossDomainEnabled {
+
+ /*************
+ * Variables *
+ *************/
+
+ // Messenger contract used to send and recieve messages from the other domain.
+ address public messenger;
+
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _messenger Address of the CrossDomainMessenger on the current layer.
+ */
+ constructor(
+ address _messenger
+ ) {
+ messenger = _messenger;
+ }
+
+
+ /**********************
+ * Function Modifiers *
+ **********************/
+
+ /**
+ * Enforces that the modified function is only callable by a specific cross-domain account.
+ * @param _sourceDomainAccount The only account on the originating domain which is
+ * authenticated to call this function.
+ */
+ modifier onlyFromCrossDomainAccount(
+ address _sourceDomainAccount
+ ) {
+ require(
+ msg.sender == address(getCrossDomainMessenger()),
+ "OVM_XCHAIN: messenger contract unauthenticated"
+ );
+
+ require(
+ getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,
+ "OVM_XCHAIN: wrong sender of cross-domain message"
+ );
+
+ _;
+ }
+
+
+ /**********************
+ * Internal Functions *
+ **********************/
+
+ /**
+ * Gets the messenger, usually from storage. This function is exposed in case a child contract
+ * needs to override.
+ * @return The address of the cross-domain messenger contract which should be used.
+ */
+ function getCrossDomainMessenger()
+ internal
+ virtual
+ returns (
+ iOVM_CrossDomainMessenger
+ )
+ {
+ return iOVM_CrossDomainMessenger(messenger);
+ }
+
+ /**
+ * Sends a message to an account on another domain
+ * @param _crossDomainTarget The intended recipient on the destination domain
+ * @param _message The data to send to the target (usually calldata to a function with
+ * `onlyFromCrossDomainAccount()`)
+ * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
+ */
+ function sendCrossDomainMessage(
+ address _crossDomainTarget,
+ uint32 _gasLimit,
+ bytes memory _message
+ )
+ internal
+ {
+ getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
+ }
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/OVM_L1StandardBridge.sol b/examples/l1-l2-deposit-withdrawal/contracts/OVM_L1StandardBridge.sol
new file mode 100644
index 000000000000..9773a32de4a1
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/OVM_L1StandardBridge.sol
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: MIT
+// @unsupported: ovm
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { iOVM_L1StandardBridge } from "./interfaces/iOVM_L1StandardBridge.sol";
+import { iOVM_L1ERC20Bridge } from "./interfaces/iOVM_L1ERC20Bridge.sol";
+import { iOVM_L2ERC20Bridge } from "./interfaces/iOVM_L2ERC20Bridge.sol";
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+/* Library Imports */
+import { OVM_CrossDomainEnabled } from "./OVM_CrossDomainEnabled.sol";
+import { Lib_PredeployAddresses } from "./libraries/Lib_PredeployAddresses.sol";
+import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
+import { Address } from "@openzeppelin/contracts/utils/Address.sol";
+import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+
+/**
+ * @title OVM_L1StandardBridge
+ * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2.
+ * It synchronizes a corresponding L2 Bridge, informing it of deposits, and listening to it for newly finalized withdrawals.
+ *
+ * Compiler used: solc
+ * Runtime target: EVM
+ */
+contract OVM_L1StandardBridge is iOVM_L1StandardBridge, OVM_CrossDomainEnabled {
+ using SafeMath for uint;
+ using SafeERC20 for IERC20;
+
+ /********************************
+ * External Contract References *
+ ********************************/
+
+ address public l2TokenBridge;
+
+ // Maps L1 token to L2 token to balance of the L1 token deposited
+ mapping(address => mapping (address => uint256)) public deposits;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ // This contract lives behind a proxy, so the constructor parameters will go unused.
+ constructor()
+ OVM_CrossDomainEnabled(address(0))
+ {}
+
+ /******************
+ * Initialization *
+ ******************/
+
+ /**
+ * @param _l1messenger L1 Messenger address being used for cross-chain communications.
+ * @param _l2TokenBridge L2 standard bridge address.
+ */
+ function initialize(
+ address _l1messenger,
+ address _l2TokenBridge
+ )
+ public
+ {
+ require(messenger == address(0), "Contract has already been initialized.");
+ messenger = _l1messenger;
+ l2TokenBridge = _l2TokenBridge;
+ }
+
+ /**************
+ * Depositing *
+ **************/
+
+ /// @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious contract via initcode, but it takes care of the user error we want to avoid.
+ modifier onlyEOA() {
+ // Used to stop deposits from contracts (avoid accidentally lost tokens)
+ require(!Address.isContract(msg.sender), "Account not EOA");
+ _;
+ }
+
+ /**
+ * @dev This function can be called with no data
+ * to deposit an amount of ETH to the caller's balance on L2.
+ * Since the receive function doesn't take data, a conservative
+ * default amount is forwarded to L2.
+ */
+ receive()
+ external
+ payable
+ onlyEOA()
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ msg.sender,
+ 1_300_000,
+ bytes("")
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function depositETH(
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ payable
+ onlyEOA()
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ msg.sender,
+ _l2Gas,
+ _data
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function depositETHTo(
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ payable
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ _to,
+ _l2Gas,
+ _data
+ );
+ }
+
+ /**
+ * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.
+ * @param _from Account to pull the deposit from on L1.
+ * @param _to Account to give the deposit to on L2.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateETHDeposit(
+ address _from,
+ address _to,
+ uint32 _l2Gas,
+ bytes memory _data
+ )
+ internal
+ {
+ // Construct calldata for finalizeDeposit call
+ bytes memory message =
+ abi.encodeWithSelector(
+ iOVM_L2ERC20Bridge.finalizeDeposit.selector,
+ address(0),
+ Lib_PredeployAddresses.OVM_ETH,
+ _from,
+ _to,
+ msg.value,
+ _data
+ );
+
+ // Send calldata into L2
+ sendCrossDomainMessage(
+ l2TokenBridge,
+ _l2Gas,
+ message
+ );
+
+ emit ETHDepositInitiated(_from, _to, msg.value, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function depositERC20(
+ address _l1Token,
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ onlyEOA()
+ {
+ _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function depositERC20To(
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);
+ }
+
+ /**
+ * @dev Performs the logic for deposits by informing the L2 Deposited Token
+ * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)
+ *
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _from Account to pull the deposit from on L1
+ * @param _to Account to give the deposit to on L2
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateERC20Deposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ internal
+ {
+ // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future withdrawals.
+ // safeTransferFrom also checks if the contract has code, so this will fail if _from is an EOA or address(0).
+ IERC20(_l1Token).safeTransferFrom(
+ _from,
+ address(this),
+ _amount
+ );
+
+ // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)
+ bytes memory message = abi.encodeWithSelector(
+ iOVM_L2ERC20Bridge.finalizeDeposit.selector,
+ _l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+
+ // Send calldata into L2
+ sendCrossDomainMessage(
+ l2TokenBridge,
+ _l2Gas,
+ message
+ );
+
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].add(_amount);
+
+ emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function finalizeETHWithdrawal(
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ onlyFromCrossDomainAccount(l2TokenBridge)
+ {
+ (bool success, ) = _to.call{value: _amount}(new bytes(0));
+ require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
+
+ emit ETHWithdrawalFinalized(_from, _to, _amount, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function finalizeERC20Withdrawal(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ onlyFromCrossDomainAccount(l2TokenBridge)
+ {
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].sub(_amount);
+
+ // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer.
+ IERC20(_l1Token).safeTransfer(_to, _amount);
+
+ emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*****************************
+ * Temporary - Migrating ETH *
+ *****************************/
+
+ /**
+ * @dev Adds ETH balance to the account. This is meant to allow for ETH
+ * to be migrated from an old gateway to a new gateway.
+ * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract
+ */
+ function donateETH() external payable {}
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/OVM_L2StandardBridge.sol b/examples/l1-l2-deposit-withdrawal/contracts/OVM_L2StandardBridge.sol
new file mode 100644
index 000000000000..26ff6b294035
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/OVM_L2StandardBridge.sol
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { iOVM_L1StandardBridge } from "./interfaces/iOVM_L1StandardBridge.sol";
+import { iOVM_L1ERC20Bridge } from "./interfaces/iOVM_L1ERC20Bridge.sol";
+import { iOVM_L2ERC20Bridge } from "./interfaces/iOVM_L2ERC20Bridge.sol";
+
+/* Library Imports */
+import { ERC165Checker } from "@openzeppelin/contracts/introspection/ERC165Checker.sol";
+import { OVM_CrossDomainEnabled } from "./OVM_CrossDomainEnabled.sol";
+import { Lib_PredeployAddresses } from "./libraries/Lib_PredeployAddresses.sol";
+
+/* Contract Imports */
+import { IL2StandardERC20 } from "./interfaces/IL2StandardERC20.sol";
+
+/**
+ * @title OVM_L2StandardBridge
+ * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to enable
+ * ETH and ERC20 transitions between L1 and L2.
+ * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard bridge.
+ * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 bridge to release L1 funds.
+ *
+ * Compiler used: optimistic-solc
+ * Runtime target: OVM
+ */
+contract OVM_L2StandardBridge is iOVM_L2ERC20Bridge, OVM_CrossDomainEnabled {
+
+ /********************************
+ * External Contract References *
+ ********************************/
+
+ address public l1TokenBridge;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.
+ * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.
+ */
+ constructor(
+ address _l2CrossDomainMessenger,
+ address _l1TokenBridge
+ )
+ OVM_CrossDomainEnabled(_l2CrossDomainMessenger)
+ {
+ l1TokenBridge = _l1TokenBridge;
+ }
+
+ /***************
+ * Withdrawing *
+ ***************/
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function withdraw(
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateWithdrawal(
+ _l2Token,
+ msg.sender,
+ msg.sender,
+ _amount,
+ _l1Gas,
+ _data
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function withdrawTo(
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateWithdrawal(
+ _l2Token,
+ msg.sender,
+ _to,
+ _amount,
+ _l1Gas,
+ _data
+ );
+ }
+
+ /**
+ * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _from Account to pull the deposit from on L2.
+ * @param _to Account to give the withdrawal to on L1.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateWithdrawal(
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ internal
+ {
+ // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage
+ IL2StandardERC20(_l2Token).burn(msg.sender, _amount);
+
+ // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)
+ address l1Token = IL2StandardERC20(_l2Token).l1Token();
+ bytes memory message;
+
+ if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {
+ message = abi.encodeWithSelector(
+ iOVM_L1StandardBridge.finalizeETHWithdrawal.selector,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+ } else {
+ message = abi.encodeWithSelector(
+ iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+ }
+
+ // Send message up to L1 bridge
+ sendCrossDomainMessage(
+ l1TokenBridge,
+ _l1Gas,
+ message
+ );
+
+ emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);
+ }
+
+ /************************************
+ * Cross-chain Function: Depositing *
+ ************************************/
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function finalizeDeposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ onlyFromCrossDomainAccount(l1TokenBridge)
+ {
+ // Check the target token is compliant and
+ // verify the deposited token on L1 matches the L2 deposited token representation here
+ if (
+ ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&
+ _l1Token == IL2StandardERC20(_l2Token).l1Token()
+ ) {
+ // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.
+ IL2StandardERC20(_l2Token).mint(_to, _amount);
+ emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
+ } else {
+ // Either the L2 token which is being deposited-into disagrees about the correct address
+ // of its L1 token, or does not support the correct interface.
+ // This should only happen if there is a malicious L2 token, or if a user somehow
+ // specified the wrong L2 token address to deposit into.
+ // In either case, we stop the process here and construct a withdrawal
+ // message so that users can get their funds out in some cases.
+ // There is no way to prevent malicious token contracts altogether, but this does limit
+ // user error and mitigate some forms of malicious contract behavior.
+ bytes memory message = abi.encodeWithSelector(
+ iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ _l1Token,
+ _l2Token,
+ _to, // switched the _to and _from here to bounce back the deposit to the sender
+ _from,
+ _amount,
+ _data
+ );
+
+ // Send message up to L1 bridge
+ sendCrossDomainMessage(
+ l1TokenBridge,
+ 0,
+ message
+ );
+ emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+ }
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/interfaces/IL2StandardERC20.sol b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/IL2StandardERC20.sol
new file mode 100644
index 000000000000..34f7c2375155
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/IL2StandardERC20.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.16 <0.8.0;
+
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import { IERC165 } from "@openzeppelin/contracts/introspection/IERC165.sol";
+
+interface IL2StandardERC20 is IERC20, IERC165 {
+ function l1Token() external returns (address);
+
+ function mint(address _to, uint256 _amount) external;
+
+ function burn(address _from, uint256 _amount) external;
+
+ event Mint(address indexed _account, uint256 _amount);
+ event Burn(address indexed _account, uint256 _amount);
+}
diff --git a/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_CrossDomainMessenger.sol
similarity index 91%
rename from packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol
rename to examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_CrossDomainMessenger.sol
index 3bd8e9cd6845..457d9d34f9d0 100644
--- a/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/messaging/iAbs_BaseCrossDomainMessenger.sol
+++ b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_CrossDomainMessenger.sol
@@ -3,9 +3,9 @@ pragma solidity >0.5.0 <0.8.0;
pragma experimental ABIEncoderV2;
/**
- * @title iAbs_BaseCrossDomainMessenger
+ * @title iOVM_CrossDomainMessenger
*/
-interface iAbs_BaseCrossDomainMessenger {
+interface iOVM_CrossDomainMessenger {
/**********
* Events *
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1ERC20Bridge.sol b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1ERC20Bridge.sol
new file mode 100644
index 000000000000..636ddb61ce76
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1ERC20Bridge.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_L1ERC20Bridge
+ */
+interface iOVM_L1ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+
+ event ERC20DepositInitiated (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event ERC20WithdrawalFinalized (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev deposit an amount of the ERC20 to the caller's balance on L2.
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _amount Amount of the ERC20 to deposit
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositERC20 (
+ address _l1Token,
+ address _l2Token,
+ uint _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /**
+ * @dev deposit an amount of ERC20 to a recipient's balance on L2.
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _to L2 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositERC20To (
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external;
+
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
+ * L1 ERC20 token.
+ * This call will fail if the initialized withdrawal from L2 has not been finalized.
+ *
+ * @param _l1Token Address of L1 token to finalizeWithdrawal for.
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _from L2 address initiating the transfer.
+ * @param _to L1 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _data Data provided by the sender on L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeERC20Withdrawal (
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1StandardBridge.sol b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1StandardBridge.sol
new file mode 100644
index 000000000000..fe63dd8e88fc
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1StandardBridge.sol
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+import './iOVM_L1ERC20Bridge.sol';
+
+/**
+ * @title iOVM_L1StandardBridge
+ */
+interface iOVM_L1StandardBridge is iOVM_L1ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+ event ETHDepositInitiated (
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event ETHWithdrawalFinalized (
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev Deposit an amount of the ETH to the caller's balance on L2.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositETH (
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ payable;
+
+ /**
+ * @dev Deposit an amount of ETH to a recipient's balance on L2.
+ * @param _to L2 address to credit the withdrawal to.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositETHTo (
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ payable;
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
+ * L1 ETH token.
+ * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.
+ * @param _from L2 address initiating the transfer.
+ * @param _to L1 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeETHWithdrawal (
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L2ERC20Bridge.sol b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L2ERC20Bridge.sol
new file mode 100644
index 000000000000..75ea2f7c139e
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L2ERC20Bridge.sol
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_L2ERC20Bridge
+ */
+interface iOVM_L2ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+
+ event WithdrawalInitiated (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event DepositFinalized (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event DepositFailed (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev initiate a withdraw of some tokens to the caller's account on L1
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function withdraw (
+ address _l2Token,
+ uint _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /**
+ * @dev initiate a withdraw of some token to a recipient's account on L1.
+ * @param _l2Token Address of L2 token where withdrawal is initiated.
+ * @param _to L1 adress to credit the withdrawal to.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function withdrawTo (
+ address _l2Token,
+ address _to,
+ uint _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this
+ * L2 token.
+ * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.
+ * @param _l1Token Address for the l1 token this is called with
+ * @param _l2Token Address for the l2 token this is called with
+ * @param _from Account to pull the deposit from on L2.
+ * @param _to Address to receive the withdrawal at
+ * @param _amount Amount of the token to withdraw
+ * @param _data Data provider by the sender on L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeDeposit (
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+
+}
diff --git a/examples/l1-l2-deposit-withdrawal/contracts/libraries/Lib_PredeployAddresses.sol b/examples/l1-l2-deposit-withdrawal/contracts/libraries/Lib_PredeployAddresses.sol
new file mode 100644
index 000000000000..b597e00ec0da
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/contracts/libraries/Lib_PredeployAddresses.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/**
+ * @title Lib_PredeployAddresses
+ */
+library Lib_PredeployAddresses {
+ address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;
+ address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;
+ address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;
+ address internal constant ECDSA_CONTRACT_ACCOUNT = 0x4200000000000000000000000000000000000003;
+ address internal constant SEQUENCER_ENTRYPOINT = 0x4200000000000000000000000000000000000005;
+ address payable internal constant OVM_ETH = 0x4200000000000000000000000000000000000006;
+ address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;
+ address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;
+ address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;
+ address internal constant EXECUTION_MANAGER_WRAPPER = 0x420000000000000000000000000000000000000B;
+ address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;
+ address internal constant ERC1820_REGISTRY = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;
+ address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;
+}
diff --git a/examples/l1-l2-deposit-withdrawal/hardhat.config.js b/examples/l1-l2-deposit-withdrawal/hardhat.config.js
new file mode 100644
index 000000000000..42a126edf8fc
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/hardhat.config.js
@@ -0,0 +1,25 @@
+// Plugins
+require('@nomiclabs/hardhat-ethers')
+require('@nomiclabs/hardhat-waffle')
+require('@eth-optimism/hardhat-ovm')
+
+module.exports = {
+ networks: {
+ // Add this network to your config!
+ optimism: {
+ url: 'http://127.0.0.1:8545',
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true // This sets the network as using the ovm and ensure contract will be compiled against that.
+ },
+ },
+ solidity: '0.7.6',
+ ovm: {
+ solcVersion: '0.7.6'
+ },
+ mocha: {
+ timeout: 300000
+ }
+}
diff --git a/examples/l1-l2-deposit-withdrawal/package.json b/examples/l1-l2-deposit-withdrawal/package.json
new file mode 100644
index 000000000000..f47401e5e98e
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "l1-l2-deposit-withdrawal",
+ "version": "1.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "scripts": {
+ "clean": "rimraf ./cache ./artifacts ./cache-ovm ./artifacts-ovm",
+ "compile": "hardhat compile",
+ "compile:ovm": "hardhat compile --network optimism",
+ "test:integration:ovm": "yarn hardhat test --network optimism"
+ },
+ "devDependencies": {
+ "@eth-optimism/contracts": "^0.3.0",
+ "@eth-optimism/core-utils": "^0.4.2",
+ "@eth-optimism/hardhat-ovm": "^0.2.0",
+ "@eth-optimism/watcher": "^0.0.1-alpha.9",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "chai": "^4.3.4",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.1.4",
+ "hardhat": "^2.2.1",
+ "mocha": "^8.4.0",
+ "rimraf": "^3.0.2"
+ }
+}
diff --git a/examples/l1-l2-deposit-withdrawal/test/example.test.js b/examples/l1-l2-deposit-withdrawal/test/example.test.js
new file mode 100644
index 000000000000..80928f250e5e
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/test/example.test.js
@@ -0,0 +1,173 @@
+/* External Imports */
+const { ethers } = require('hardhat')
+const { expect } = require('chai')
+const { Watcher } = require('@eth-optimism/watcher')
+
+/* Internal Imports */
+const factory = (name, ovm = false) => {
+ const artifact = require(`../artifacts${ovm ? '-ovm' : ''}/contracts/${name}.sol/${name}.json`)
+ return new ethers.ContractFactory(artifact.abi, artifact.bytecode)
+}
+const factory__L1_ERC20 = factory('ERC20')
+const factory__L2_ERC20 = factory('L2StandardERC20', true)
+const factory__L1StandardBridge = factory('OVM_L1StandardBridge')
+const factory__L2StandardBridge = factory('OVM_L2StandardBridge', true)
+
+describe(`L1 <> L2 Deposit and Withdrawal`, () => {
+ // Set up our RPC provider connections.
+ const l1RpcProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9545')
+ const l2RpcProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545')
+
+ // Constructor arguments for `ERC20.sol`
+ const INITIAL_SUPPLY = 1234
+ const L1_ERC20_NAME = 'L1 ERC20'
+ const L1_ERC20_SYMBOL = 'L1 ERC20'
+
+ // L1 standard bridge address depends on the deployment, this is default for our local deployment.
+ const L1StandardBridgeAddress = '0x851356ae760d987E095750cCeb3bC6014560891C'
+ // L2 standard bridge address is always the same.
+ const L2StandardBridgeAddress = '0x4200000000000000000000000000000000000010'
+ // L1 messenger address depends on the deployment, this is default for our local deployment.
+ const l1MessengerAddress = '0x59b670e9fA9D0A427751Af201D676719a970857b'
+ // L2 messenger address is always the same.
+ const l2MessengerAddress = '0x4200000000000000000000000000000000000007'
+
+ const L2_ERC20_NAME = 'L2 ERC20'
+ const L2_ERC20_SYMBOL = 'L2 ERC20'
+
+ // Set up our wallets (using a default private key with 10k ETH allocated to it).
+ // Need two wallets objects, one for interacting with L1 and one for interacting with L2.
+ // Both will use the same private key.
+ const key = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+ const l1Wallet = new ethers.Wallet(key, l1RpcProvider)
+ const l2Wallet = new ethers.Wallet(key, l2RpcProvider)
+
+ // Tool that helps watches and waits for messages to be relayed between L1 and L2.
+ const watcher = new Watcher({
+ l1: {
+ provider: l1RpcProvider,
+ messengerAddress: l1MessengerAddress
+ },
+ l2: {
+ provider: l2RpcProvider,
+ messengerAddress: l2MessengerAddress
+ }
+ })
+
+ const L1StandardBridge = factory__L1StandardBridge.connect(l1Wallet).attach(L1StandardBridgeAddress)
+ const L2StandardBridge = factory__L2StandardBridge.connect(l2Wallet).attach(L2StandardBridgeAddress)
+ let L1_ERC20, L2_ERC20, L1GasLimit = 9999999, L2GasLimit = 9999999;
+
+ before(`deploy contracts`, async () => {
+ // Deploy an ERC20 token on L1.
+ L1_ERC20 = await factory__L1_ERC20.connect(l1Wallet).deploy(
+ INITIAL_SUPPLY,
+ L1_ERC20_NAME,
+ L1_ERC20_SYMBOL,
+ {
+ gasPrice: 0
+ }
+ )
+
+ await L1_ERC20.deployTransaction.wait()
+
+ // Deploy the paired ERC20 token to L2.
+ L2_ERC20 = await factory__L2_ERC20.connect(l2Wallet).deploy(
+ L2StandardBridgeAddress,
+ L1_ERC20.address,
+ L2_ERC20_NAME,
+ L2_ERC20_SYMBOL,
+ {
+ gasPrice: 0
+ }
+ )
+
+ await L2_ERC20.deployTransaction.wait()
+ })
+
+ describe('Initialization and initial balances', async () => {
+ it(`should have initial L1 balance of 1234 and initial L2 balance of 0`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(1234)
+ expect(l2Balance).to.eq(0)
+ })
+ })
+
+ describe('L1 to L2 deposit', async () => {
+ let l1Tx1
+
+ it(`should approve 1234 tokens for ERC20 bridge`, async () => {
+ const tx = await L1_ERC20.approve(L1StandardBridge.address, 1234)
+ await tx.wait()
+ const txHashPrefix = tx.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should deposit 1234 tokens into L2 ERC20`, async () => {
+ l1Tx1 = await L1StandardBridge.depositERC20(
+ L1_ERC20.address,
+ L2_ERC20.address,
+ 1234,
+ L2GasLimit,
+ ethers.utils.formatBytes32String('0'),
+ { gasPrice: 0 }
+ )
+ await l1Tx1.wait()
+ const txHashPrefix = l1Tx1.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should relay deposit message to L2`, async () => {
+ // Wait for the message to be relayed to L2.
+ const [ msgHash1 ] = await watcher.getMessageHashesFromL1Tx(l1Tx1.hash)
+ const l2TxReceipt = await watcher.getL2TransactionReceipt(msgHash1)
+ expect(l2TxReceipt.to).to.eq(l2MessengerAddress)
+ })
+
+ it(`should have changed L1 balance to 0 and L2 balance to 1234`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(0)
+ expect(l2Balance).to.eq(1234)
+ })
+ })
+
+ describe('L2 to L1 withdrawal', async () => {
+ let l2Tx1
+
+ it(`should approve 1234 tokens for ERC20 bridge`, async () => {
+ const tx = await L2_ERC20.approve(L2StandardBridge.address, 1234)
+ await tx.wait()
+ const txHashPrefix = tx.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should withdraw tokens back to L1 ERC20 and relay the message`, async () => {
+ // Burn the tokens on L2 and ask the L1 contract to unlock on our behalf.
+ l2Tx1 = await L2StandardBridge.withdraw(
+ L2_ERC20.address,
+ 1234,
+ L1GasLimit,
+ ethers.utils.formatBytes32String('0'),
+ { gasPrice: 0 }
+ )
+ await l2Tx1.wait()
+ const txHashPrefix = l2Tx1.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should relay withdrawal message to L1`, async () => {
+ const [ msgHash2 ] = await watcher.getMessageHashesFromL2Tx(l2Tx1.hash)
+ const l1TxReceipt = await watcher.getL1TransactionReceipt(msgHash2)
+ expect(l1TxReceipt.to).to.eq(l1MessengerAddress)
+ })
+
+ it(`should have changed L1 balance back to 1234 and L2 balance back to 0`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(1234)
+ expect(l2Balance).to.eq(0)
+ })
+ })
+})
diff --git a/examples/l1-l2-deposit-withdrawal/yarn.lock b/examples/l1-l2-deposit-withdrawal/yarn.lock
new file mode 100644
index 000000000000..7a9ede9a2125
--- /dev/null
+++ b/examples/l1-l2-deposit-withdrawal/yarn.lock
@@ -0,0 +1,8074 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ensdomains/ens@^0.4.4":
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc"
+ integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==
+ dependencies:
+ bluebird "^3.5.2"
+ eth-ens-namehash "^2.0.8"
+ solc "^0.4.20"
+ testrpc "0.0.1"
+ web3-utils "^1.0.0-beta.31"
+
+"@ensdomains/resolver@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
+ integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
+
+"@eth-optimism/contracts@^0.3.0":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.3.5.tgz#f63ff93bffde7310a5b990aea599dbb8395d2c0e"
+ integrity sha512-tjRadNBjbB/5uj5Boidl0d8f3k6pB+N7jP0JH6LQOk59aAGL4oY1F4Tetr0Igz+r7PZMjulen5rSP1UbCHPbNw==
+ dependencies:
+ "@eth-optimism/core-utils" "^0.4.5"
+ "@ethersproject/abstract-provider" "^5.0.8"
+ "@ethersproject/abstract-signer" "^5.1.0"
+ "@ethersproject/contracts" "^5.0.5"
+ glob "^7.1.6"
+
+"@eth-optimism/core-utils@^0.4.2", "@eth-optimism/core-utils@^0.4.5":
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.4.7.tgz#3eeec47222ccfad1d8f3d9539a368c9283b2df1e"
+ integrity sha512-H+NdGAyx6w4Wmjy3PaTF7xnBEeKh8BZK1jfU6yy52sd2E0oH7ABd0H5FtRY2SLPTH8AZ8gAgOhrTNoqE0Mlktw==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.0.9"
+ ethers "^5.0.31"
+ lodash "^4.17.21"
+
+"@eth-optimism/hardhat-ovm@^0.2.0":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.2.2.tgz#55fafaa6b8277447abaf132602c1c6d14a2a18a2"
+ integrity sha512-QLzqawYCzC/m6K/Oaj/tCZQlu6kZTgnleg1cJad8kVYA5E+JWZQ6ZJrcStoJoJrco9RIroPUjAFEhFM8YiCc7Q==
+ dependencies:
+ node-fetch "^2.6.1"
+
+"@eth-optimism/watcher@^0.0.1-alpha.9":
+ version "0.0.1-alpha.9"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/watcher/-/watcher-0.0.1-alpha.9.tgz#3a68eb9292acd28cdd589b8275eed3308356b028"
+ integrity sha512-FSMinaayA/nTQzSPv21tOUqok8gMfEB1UcIdLJkImt9NUzT4QjhGbrsPH6Q2hBlQkAApgTECMShUYZVMpZ7oOw==
+ dependencies:
+ ethers "5.0.0"
+
+"@ethereum-waffle/chai@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.0.tgz#2477877410a96bf370edd64df905b04fb9aba9d5"
+ integrity sha512-GVaFKuFbFUclMkhHtQTDnWBnBQMJc/pAbfbFj/nnIK237WPLsO3KDDslA7m+MNEyTAOFrcc0CyfruAGGXAQw3g==
+ dependencies:
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.0"
+
+"@ethereum-waffle/compiler@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz#68917321212563544913de33e408327745cb1284"
+ integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw==
+ dependencies:
+ "@resolver-engine/imports" "^0.3.3"
+ "@resolver-engine/imports-fs" "^0.3.3"
+ "@typechain/ethers-v5" "^2.0.0"
+ "@types/mkdirp" "^0.5.2"
+ "@types/node-fetch" "^2.5.5"
+ ethers "^5.0.1"
+ mkdirp "^0.5.1"
+ node-fetch "^2.6.1"
+ solc "^0.6.3"
+ ts-generator "^0.1.1"
+ typechain "^3.0.0"
+
+"@ethereum-waffle/ens@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.3.0.tgz#d54f4c8e6b7bcafdc13ab294433f45416b2b2791"
+ integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw==
+ dependencies:
+ "@ensdomains/ens" "^0.4.4"
+ "@ensdomains/resolver" "^0.2.4"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/mock-contract@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz#7b331f1c95c5d46ee9478f7a6be2869f707d307a"
+ integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw==
+ dependencies:
+ "@ethersproject/abi" "^5.0.1"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/provider@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.0.tgz#a36a0890d4fbc230e807870c8d3b683594efef00"
+ integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ==
+ dependencies:
+ "@ethereum-waffle/ens" "^3.3.0"
+ ethers "^5.0.1"
+ ganache-core "^2.13.2"
+ patch-package "^6.2.2"
+ postinstall-postinstall "^2.1.0"
+
+"@ethereumjs/block@^3.3.0", "@ethereumjs/block@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.4.0.tgz#4747b0c06220ee10cbdfe1cbde8cbb0677b1b074"
+ integrity sha512-umKAoTX32yXzErpIksPHodFc/5y8bmZMnOl6hWy5Vd8xId4+HKFUOyEiN16Y97zMwFRysRpcrR6wBejfqc6Bmg==
+ dependencies:
+ "@ethereumjs/common" "^2.4.0"
+ "@ethereumjs/tx" "^3.3.0"
+ ethereumjs-util "^7.1.0"
+ merkle-patricia-tree "^4.2.0"
+
+"@ethereumjs/blockchain@^5.3.0", "@ethereumjs/blockchain@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.0.tgz#28d712627d3442b2bb1f50dd5acba7cde1021993"
+ integrity sha512-wAuKLaew6PL52kH8YPXO7PbjjKV12jivRSyHQehkESw4slSLLfYA6Jv7n5YxyT2ajD7KNMPVh7oyF/MU6HcOvg==
+ dependencies:
+ "@ethereumjs/block" "^3.4.0"
+ "@ethereumjs/common" "^2.4.0"
+ "@ethereumjs/ethash" "^1.0.0"
+ debug "^2.2.0"
+ ethereumjs-util "^7.1.0"
+ level-mem "^5.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+"@ethereumjs/common@^2.3.1", "@ethereumjs/common@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.4.0.tgz#2d67f6e6ba22246c5c89104e6b9a119fb3039766"
+ integrity sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.0"
+
+"@ethereumjs/ethash@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
+ integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.7"
+ miller-rabin "^4.0.0"
+
+"@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378"
+ integrity sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==
+ dependencies:
+ "@ethereumjs/common" "^2.4.0"
+ ethereumjs-util "^7.1.0"
+
+"@ethereumjs/vm@^5.3.2":
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.0.tgz#d389c5792320ef28c51366a643b8ab9d64e10a31"
+ integrity sha512-h6Kr6WqKUP8nVuEzCWPWEPrC63v7HFwt3gRuK7CJiyg9S0iWSBKUA/YVD4YgaSVACuxUfWaOBbwV5uGVupm5PQ==
+ dependencies:
+ "@ethereumjs/block" "^3.4.0"
+ "@ethereumjs/blockchain" "^5.4.0"
+ "@ethereumjs/common" "^2.4.0"
+ "@ethereumjs/tx" "^3.3.0"
+ async-eventemitter "^0.2.4"
+ core-js-pure "^3.0.1"
+ debug "^2.2.0"
+ ethereumjs-util "^7.1.0"
+ functional-red-black-tree "^1.0.1"
+ mcl-wasm "^0.7.1"
+ merkle-patricia-tree "^4.2.0"
+ rustbn.js "~0.2.0"
+ util.promisify "^1.0.1"
+
+"@ethersproject/abi@5.0.0-beta.153":
+ version "5.0.0-beta.153"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
+ integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==
+ dependencies:
+ "@ethersproject/address" ">=5.0.0-beta.128"
+ "@ethersproject/bignumber" ">=5.0.0-beta.130"
+ "@ethersproject/bytes" ">=5.0.0-beta.129"
+ "@ethersproject/constants" ">=5.0.0-beta.128"
+ "@ethersproject/hash" ">=5.0.0-beta.128"
+ "@ethersproject/keccak256" ">=5.0.0-beta.127"
+ "@ethersproject/logger" ">=5.0.0-beta.129"
+ "@ethersproject/properties" ">=5.0.0-beta.131"
+ "@ethersproject/strings" ">=5.0.0-beta.130"
+
+"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242"
+ integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/abstract-provider@5.4.0", "@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.0.8", "@ethersproject/abstract-provider@^5.0.9", "@ethersproject/abstract-provider@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d"
+ integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+
+"@ethersproject/abstract-signer@5.4.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.1.0", "@ethersproject/abstract-signer@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65"
+ integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/address@5.4.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
+ integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+
+"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
+ integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+
+"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6"
+ integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/bignumber@5.4.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9"
+ integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
+ integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/constants@5.4.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
+ integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+
+"@ethersproject/contracts@5.4.0", "@ethersproject/contracts@^5.0.0", "@ethersproject/contracts@^5.0.5":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.0.tgz#e05fe6bd33acc98741e27d553889ec5920078abb"
+ integrity sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw==
+ dependencies:
+ "@ethersproject/abi" "^5.4.0"
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+
+"@ethersproject/hash@5.4.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
+ integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac"
+ integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/basex" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/pbkdf2" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.0.0", "@ethersproject/json-wallets@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95"
+ integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hdnode" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/pbkdf2" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
+ integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@5.4.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
+ integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
+
+"@ethersproject/networks@5.4.1", "@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.4.0":
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.1.tgz#2ce83b8e42aa85216e5d277a7952d97b6ce8d852"
+ integrity sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c"
+ integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+
+"@ethersproject/properties@5.4.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
+ integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/providers@5.4.1", "@ethersproject/providers@^5.0.0":
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.1.tgz#654267b563b833046b9c9647647cfc8267cb93b4"
+ integrity sha512-p06eiFKz8nu/5Ju0kIX024gzEQIgE5pvvGrBCngpyVjpuLtUIWT3097Agw4mTn9/dEA0FMcfByzFqacBMSgCVg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/basex" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.4.0", "@ethersproject/random@^5.0.0", "@ethersproject/random@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16"
+ integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.0.0", "@ethersproject/rlp@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
+ integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371"
+ integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.0.0", "@ethersproject/signing-key@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
+ integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.4.0", "@ethersproject/solidity@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec"
+ integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/strings@5.4.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
+ integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
+ integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+
+"@ethersproject/units@5.4.0", "@ethersproject/units@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe"
+ integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/wallet@5.4.0", "@ethersproject/wallet@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353"
+ integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/hdnode" "^5.4.0"
+ "@ethersproject/json-wallets" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/web@5.4.0", "@ethersproject/web@^5.0.0", "@ethersproject/web@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
+ integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==
+ dependencies:
+ "@ethersproject/base64" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7"
+ integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@nomiclabs/hardhat-ethers@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
+ integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
+
+"@nomiclabs/hardhat-waffle@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2"
+ integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==
+ dependencies:
+ "@types/sinon-chai" "^3.2.3"
+ "@types/web3" "1.0.19"
+
+"@resolver-engine/core@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967"
+ integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==
+ dependencies:
+ debug "^3.1.0"
+ is-url "^1.2.4"
+ request "^2.85.0"
+
+"@resolver-engine/fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973"
+ integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports-fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b"
+ integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==
+ dependencies:
+ "@resolver-engine/fs" "^0.3.3"
+ "@resolver-engine/imports" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc"
+ integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+ hosted-git-info "^2.6.0"
+ path-browserify "^1.0.0"
+ url "^0.11.0"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/hub" "5.30.0"
+ "@sentry/tracing" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^7.1.0":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@solidity-parser/parser@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add"
+ integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@typechain/ethers-v5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810"
+ integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==
+ dependencies:
+ ethers "^5.0.2"
+
+"@types/abstract-leveldown@*":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f"
+ integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ==
+
+"@types/bn.js@*", "@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai@*":
+ version "4.2.21"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650"
+ integrity sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg==
+
+"@types/level-errors@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8"
+ integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==
+
+"@types/levelup@^4.3.0":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4"
+ integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==
+ dependencies:
+ "@types/abstract-leveldown" "*"
+ "@types/level-errors" "*"
+ "@types/node" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef"
+ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==
+
+"@types/mkdirp@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+ integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node-fetch@^2.5.5":
+ version "2.5.11"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.11.tgz#ce22a2e65fc8999f4dbdb7ddbbcf187d755169e4"
+ integrity sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "16.0.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8"
+ integrity sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==
+
+"@types/node@^12.12.6":
+ version "12.20.16"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.16.tgz#1acf34f6456208f495dac0434dd540488d17f991"
+ integrity sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3"
+ integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==
+
+"@types/resolve@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c"
+ integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/sinon-chai@^3.2.3":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48"
+ integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*":
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4"
+ integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==
+ dependencies:
+ "@sinonjs/fake-timers" "^7.1.0"
+
+"@types/underscore@*":
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.3.tgz#d6734f3741ce41b2630018c6b61c6745f6188c07"
+ integrity sha512-Fl1TX1dapfXyDqFg2ic9M+vlXRktcPJrc4PR7sRc7sdVrjavg/JHlbUXBt8qWWqhJrmSqg3RNAkAPRiOYw6Ahw==
+
+"@types/web3@1.0.19":
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924"
+ integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==
+ dependencies:
+ "@types/bn.js" "*"
+ "@types/underscore" "*"
+
+"@ungap/promise-all-settled@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
+ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
+
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
+ integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
+ integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
+ integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
+ansi-colors@4.1.1, ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.1, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
+ integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
+ dependencies:
+ typical "^2.6.0"
+
+array-back@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022"
+ integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
+ dependencies:
+ typical "^2.6.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-eventemitter@^0.2.2, async-eventemitter@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
+ integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+ dependencies:
+ lodash "^4.17.11"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.14, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ 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"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
+ dependencies:
+ 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@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+ integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+ integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+ integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
+ dependencies:
+ 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@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
+ dependencies:
+ 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@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
+ dependencies:
+ 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@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ 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@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ 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@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babelify@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+ integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ 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"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bip39@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
+ integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
+ dependencies:
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ unorm "^1.3.3"
+
+blakejs@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+ integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+bluebird@^3.5.0, bluebird@^3.5.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer-xor@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289"
+ integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+bytewise-core@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
+ integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+ dependencies:
+ typewise-core "^1.2"
+
+bytewise@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e"
+ integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
+ dependencies:
+ bytewise-core "^1.2.2"
+ typewise "^1.0.3"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ 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"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+cachedown@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15"
+ integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+ dependencies:
+ abstract-leveldown "^2.4.1"
+ lru-cache "^3.2.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30001243"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001243.tgz#d9250155c91e872186671c523f3ae50cfc94a3aa"
+ integrity sha512-vNxw9mkTBtkmLFnJRv/2rhs1yufpDfCkBZexG3Y0xdOH2Z/eE/85E4Dl5j1YUN34nZVsSp6vVRFQRrez9wJMRA==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chai@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
+ integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.1"
+ type-detect "^4.0.5"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
+chokidar@3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
+chokidar@^3.4.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@2.1.2, clone@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46"
+ integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
+ dependencies:
+ array-back "^2.0.0"
+ find-replace "^1.0.3"
+ typical "^2.6.1"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.5.1:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-pure@^3.0.1:
+ version "3.15.2"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce"
+ integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+crc-32@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+ integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
+ dependencies:
+ exit-on-epipe "~1.0.1"
+ printj "~1.1.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@4, debug@^4.1.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
+ integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
+ dependencies:
+ ms "2.1.2"
+
+debug@4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
+ integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ inherits "^2.0.3"
+
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotignore@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
+ integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
+ dependencies:
+ minimatch "^3.0.4"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.47:
+ version "1.3.770"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.770.tgz#a9e705a73315f4900880622b3ab76cf1d7221b77"
+ integrity sha512-Kyh8DGK1KfEZuYKIHvuOmrKotsKZQ+qBkDIWHciE3QoFkxXB1KzPP+tfLilSHAfxTON0yYMnFCWkQtUOR7g6KQ==
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@5.0.4, encoding-down@~5.0.0:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614"
+ integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
+ dependencies:
+ abstract-leveldown "^5.0.0"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+ xtend "^4.0.1"
+
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
+encoding@^0.1.11:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enquirer@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
+ integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
+ dependencies:
+ 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-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f"
+ integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==
+ dependencies:
+ cross-fetch "^2.1.1"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
+ integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==
+ dependencies:
+ 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"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-sig-util@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e"
+ integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==
+ dependencies:
+ 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-sig-util@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
+ integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
+ dependencies:
+ ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
+ ethereumjs-util "^5.1.1"
+
+eth-sig-util@^2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5"
+ integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==
+ dependencies:
+ ethereumjs-abi "0.6.8"
+ ethereumjs-util "^5.1.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.0"
+
+eth-tx-summary@^3.1.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
+ integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
+ dependencies:
+ 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"
+
+ethashjs@~0.0.7:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9"
+ integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==
+ dependencies:
+ async "^2.1.2"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.2"
+ miller-rabin "^4.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-waffle@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720"
+ integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ==
+ dependencies:
+ "@ethereum-waffle/chai" "^3.4.0"
+ "@ethereum-waffle/compiler" "^3.4.0"
+ "@ethereum-waffle/mock-contract" "^3.3.0"
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.1"
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.8"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9"
+ integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
+ dependencies:
+ ethereumjs-util "^6.0.0"
+ rlp "^2.2.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-blockchain@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f"
+ integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==
+ dependencies:
+ async "^2.6.1"
+ ethashjs "~0.0.7"
+ ethereumjs-block "~2.2.2"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.1.0"
+ flow-stoplight "^1.0.0"
+ level-mem "^3.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.2"
+ semaphore "^1.1.0"
+
+ethereumjs-common@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd"
+ integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==
+
+ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
+ integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
+
+ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0"
+ integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7, ethereumjs-util@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz#e2b43a30bfcdbcb432a4eb42bd5f2393209b3fd5"
+ integrity sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab"
+ integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.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"
+ util.promisify "^1.0.0"
+
+ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
+ integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474"
+ integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^6.0.0"
+ randombytes "^2.0.6"
+ safe-buffer "^5.1.2"
+ scryptsy "^1.2.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.0.tgz#76558a3020766f310a49f4e1a4c6c1e331761abd"
+ integrity sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==
+ dependencies:
+ "@ethersproject/abi" "^5.0.0"
+ "@ethersproject/abstract-provider" "^5.0.0"
+ "@ethersproject/abstract-signer" "^5.0.0"
+ "@ethersproject/address" "^5.0.0"
+ "@ethersproject/base64" "^5.0.0"
+ "@ethersproject/bignumber" "^5.0.0"
+ "@ethersproject/bytes" "^5.0.0"
+ "@ethersproject/constants" "^5.0.0"
+ "@ethersproject/contracts" "^5.0.0"
+ "@ethersproject/hash" "^5.0.0"
+ "@ethersproject/hdnode" "^5.0.0"
+ "@ethersproject/json-wallets" "^5.0.0"
+ "@ethersproject/keccak256" "^5.0.0"
+ "@ethersproject/logger" "^5.0.0"
+ "@ethersproject/networks" "^5.0.0"
+ "@ethersproject/pbkdf2" "^5.0.0"
+ "@ethersproject/properties" "^5.0.0"
+ "@ethersproject/providers" "^5.0.0"
+ "@ethersproject/random" "^5.0.0"
+ "@ethersproject/rlp" "^5.0.0"
+ "@ethersproject/sha2" "^5.0.0"
+ "@ethersproject/signing-key" "^5.0.0"
+ "@ethersproject/solidity" "^5.0.0"
+ "@ethersproject/strings" "^5.0.0"
+ "@ethersproject/transactions" "^5.0.0"
+ "@ethersproject/units" "^5.0.0"
+ "@ethersproject/wallet" "^5.0.0"
+ "@ethersproject/web" "^5.0.0"
+ "@ethersproject/wordlists" "^5.0.0"
+
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.0.31, ethers@^5.1.4:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.1.tgz#bcff1e9f45bf1a061bf313ec04e8d9881d2d53f9"
+ integrity sha512-SrcddMdCgP1hukDvCPd87Aipbf4NWjQvdfAbZ65XSZGbfyuYPtIrUJPDH5B1SBRsdlfiEgX3eoz28DdBDzMNFg==
+ dependencies:
+ "@ethersproject/abi" "5.4.0"
+ "@ethersproject/abstract-provider" "5.4.0"
+ "@ethersproject/abstract-signer" "5.4.0"
+ "@ethersproject/address" "5.4.0"
+ "@ethersproject/base64" "5.4.0"
+ "@ethersproject/basex" "5.4.0"
+ "@ethersproject/bignumber" "5.4.0"
+ "@ethersproject/bytes" "5.4.0"
+ "@ethersproject/constants" "5.4.0"
+ "@ethersproject/contracts" "5.4.0"
+ "@ethersproject/hash" "5.4.0"
+ "@ethersproject/hdnode" "5.4.0"
+ "@ethersproject/json-wallets" "5.4.0"
+ "@ethersproject/keccak256" "5.4.0"
+ "@ethersproject/logger" "5.4.0"
+ "@ethersproject/networks" "5.4.1"
+ "@ethersproject/pbkdf2" "5.4.0"
+ "@ethersproject/properties" "5.4.0"
+ "@ethersproject/providers" "5.4.1"
+ "@ethersproject/random" "5.4.0"
+ "@ethersproject/rlp" "5.4.0"
+ "@ethersproject/sha2" "5.4.0"
+ "@ethersproject/signing-key" "5.4.0"
+ "@ethersproject/solidity" "5.4.0"
+ "@ethersproject/strings" "5.4.0"
+ "@ethersproject/transactions" "5.4.0"
+ "@ethersproject/units" "5.4.0"
+ "@ethersproject/wallet" "5.4.0"
+ "@ethersproject/web" "5.4.0"
+ "@ethersproject/wordlists" "5.4.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exit-on-epipe@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+ integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ 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"
+
+express@^4.14.0:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ 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"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-replace@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
+ integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+flow-stoplight@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
+ integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+
+follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3, for-each@~0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2, fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fsevents@~2.3.1, fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1, function-bind@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+ganache-core@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3"
+ integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==
+ dependencies:
+ abstract-leveldown "3.0.0"
+ async "2.6.2"
+ bip39 "2.5.0"
+ cachedown "1.0.0"
+ clone "2.1.2"
+ debug "3.2.6"
+ encoding-down "5.0.4"
+ eth-sig-util "3.0.0"
+ ethereumjs-abi "0.6.8"
+ ethereumjs-account "3.0.0"
+ ethereumjs-block "2.2.2"
+ ethereumjs-common "1.5.0"
+ ethereumjs-tx "2.1.2"
+ ethereumjs-util "6.2.1"
+ ethereumjs-vm "4.2.0"
+ heap "0.2.6"
+ keccak "3.0.1"
+ level-sublevel "6.6.4"
+ levelup "3.1.1"
+ lodash "4.17.20"
+ lru-cache "5.1.1"
+ merkle-patricia-tree "3.0.0"
+ patch-package "6.2.2"
+ seedrandom "3.0.1"
+ source-map-support "0.5.12"
+ tmp "0.1.0"
+ web3-provider-engine "14.2.1"
+ websocket "1.0.32"
+ optionalDependencies:
+ ethereumjs-wallet "0.6.5"
+ web3 "1.2.11"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@~5.1.0, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ 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@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ 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@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hardhat@^2.2.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.4.2.tgz#d72956d89ad3d57eddbac346e27572b4471946e2"
+ integrity sha512-tmUyFV9c7g9iODSGO/E7DFegBsFgtTc4oVtvryVOBZ0LP0ViYlgwcsPiRwOdmdcf4QHKcp900vEsD9jKgQyovg==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/blockchain" "^5.3.0"
+ "@ethereumjs/common" "^2.3.1"
+ "@ethereumjs/tx" "^3.2.1"
+ "@ethereumjs/vm" "^5.3.2"
+ "@ethersproject/abi" "^5.1.2"
+ "@sentry/node" "^5.18.1"
+ "@solidity-parser/parser" "^0.11.0"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ abort-controller "^3.0.0"
+ adm-zip "^0.4.16"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ eth-sig-util "^2.5.2"
+ ethereum-cryptography "^0.1.2"
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^7.0.10"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "^7.1.3"
+ https-proxy-agent "^5.0.0"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ lodash "^4.17.11"
+ merkle-patricia-tree "^4.2.0"
+ mnemonist "^0.38.0"
+ mocha "^7.1.2"
+ node-fetch "^2.6.0"
+ qs "^6.7.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ slash "^3.0.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ "true-case-path" "^2.2.1"
+ tsort "0.0.1"
+ uuid "^3.3.2"
+ ws "^7.4.6"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3, has@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+immutable@^4.0.0-rc.12:
+ version "4.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
+ integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-regex@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+ integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+ dependencies:
+ has "^1.0.3"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
+ integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
+ dependencies:
+ argparse "^2.0.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9"
+ integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
+ dependencies:
+ 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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
+ integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
+ dependencies:
+ inherits "^2.0.1"
+
+json-rpc-random-id@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+ integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@3.0.1, keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
+ integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
+ integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4"
+ integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.5"
+ xtend "^4.0.0"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
+ integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ xtend "^4.0.0"
+
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
+level-mem@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
+ integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
+ dependencies:
+ level-packager "~4.0.0"
+ memdown "~3.0.0"
+
+level-mem@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d"
+ integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==
+ dependencies:
+ level-packager "^5.0.3"
+ memdown "^5.0.0"
+
+level-packager@^5.0.3:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
+level-packager@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
+ integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
+ dependencies:
+ encoding-down "~5.0.0"
+ levelup "^3.0.0"
+
+level-post@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0"
+ integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
+ dependencies:
+ ltgt "^2.1.2"
+
+level-sublevel@6.6.4:
+ version "6.6.4"
+ resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba"
+ integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==
+ dependencies:
+ 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"
+
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level-ws@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b"
+ integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.8"
+ xtend "^4.0.1"
+
+level-ws@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339"
+ integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^3.1.0"
+ xtend "^4.0.1"
+
+levelup@3.1.1, levelup@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
+ integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
+ dependencies:
+ deferred-leveldown "~4.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~3.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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"
+
+levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash@4.17.20:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+log-symbols@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+looper@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
+ integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
+
+looper@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749"
+ integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@5.1.1, lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+ integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
+ dependencies:
+ pseudomap "^1.0.1"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
+ltgt@^2.1.2, ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+ltgt@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
+ integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+mcl-wasm@^0.7.1:
+ version "0.7.8"
+ resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.8.tgz#4d0dc5a92f7bd20892fd3fcd41764acf86fd1e6e"
+ integrity sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw==
+ dependencies:
+ typescript "^4.3.4"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memdown@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb"
+ integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.2.0"
+
+memdown@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
+ integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.1.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merkle-patricia-tree@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8"
+ integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==
+ dependencies:
+ async "^2.6.1"
+ ethereumjs-util "^5.2.0"
+ level-mem "^3.0.1"
+ level-ws "^1.0.0"
+ readable-stream "^3.0.6"
+ rlp "^2.0.0"
+ semaphore ">=1.0.1"
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
+ integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
+ dependencies:
+ 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"
+
+merkle-patricia-tree@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1"
+ integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ level-ws "^2.0.0"
+ readable-stream "^3.6.0"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mnemonist@^0.38.0:
+ version "0.38.3"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d"
+ integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==
+ dependencies:
+ obliterator "^1.6.1"
+
+mocha@^7.1.2:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+ dependencies:
+ ansi-colors "3.2.3"
+ browser-stdout "1.3.1"
+ chokidar "3.3.0"
+ debug "3.2.6"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ find-up "3.0.0"
+ glob "7.1.3"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ mkdirp "0.5.5"
+ ms "2.1.1"
+ node-environment-flags "1.0.6"
+ object.assign "4.1.0"
+ strip-json-comments "2.0.1"
+ supports-color "6.0.0"
+ which "1.3.1"
+ wide-align "1.1.3"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
+mocha@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
+ integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+ dependencies:
+ "@ungap/promise-all-settled" "1.1.2"
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.5.1"
+ debug "4.3.1"
+ diff "5.0.0"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "4.0.0"
+ log-symbols "4.0.0"
+ minimatch "3.0.4"
+ ms "2.1.3"
+ nanoid "3.1.20"
+ serialize-javascript "5.0.1"
+ strip-json-comments "3.1.1"
+ supports-color "8.1.1"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.1.0"
+ yargs "16.2.0"
+ yargs-parser "20.2.4"
+ yargs-unparser "2.0.0"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanoid@3.1.20:
+ version "3.1.20"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
+ integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ 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"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
+ dependencies:
+ object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-inspect@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+obliterator@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3"
+ integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==
+
+oboe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
+ integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+patch-package@6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+patch-package@^6.2.2:
+ version "6.4.7"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
+ integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+path-browserify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.1.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d"
+ integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==
+
+printj@~1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+ integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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@^1.1.9:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b"
+ integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
+
+pull-defer@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113"
+ integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
+
+pull-level@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac"
+ integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==
+ dependencies:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5"
+ integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
+ dependencies:
+ pull-cat "^1.1.9"
+ pull-stream "^3.4.0"
+
+pull-pushable@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
+ integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
+
+pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
+ version "3.6.14"
+ resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee"
+ integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
+
+pull-window@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0"
+ integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
+ dependencies:
+ looper "^2.0.0"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.7.0:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerate@^1.2.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+ integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
+
+require-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@1.17.0, resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.10.0, resolve@^1.8.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+resumer@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+ integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
+ dependencies:
+ through "~2.3.4"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.2.8, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+scryptsy@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
+ integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
+ dependencies:
+ pbkdf2 "^3.0.3"
+
+secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
+ integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+
+semaphore-async-await@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa"
+ integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=
+
+semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+serialize-javascript@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ 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"
+
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@^0.4.20:
+ version "0.4.26"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5"
+ integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
+
+solc@^0.6.3:
+ version "0.6.12"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e"
+ integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.12:
+ version "0.5.12"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
+ integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.13:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-to-pull-stream@^1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece"
+ integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
+ dependencies:
+ looper "^3.0.0"
+ pull-stream "^3.2.3"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trim@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
+ integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+strip-json-comments@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
+ integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tape@^4.6.3:
+ version "4.13.3"
+ resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278"
+ integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==
+ dependencies:
+ deep-equal "~1.1.1"
+ defined "~1.0.0"
+ dotignore "~0.1.2"
+ for-each "~0.3.3"
+ function-bind "~1.1.1"
+ glob "~7.1.6"
+ has "~1.0.3"
+ inherits "~2.0.4"
+ is-regex "~1.0.5"
+ minimist "~1.2.5"
+ object-inspect "~1.7.0"
+ resolve "~1.17.0"
+ resumer "~0.0.0"
+ string.prototype.trim "~1.2.1"
+ through "~2.3.8"
+
+tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
+ integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+testrpc@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed"
+ integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==
+
+through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@~2.3.4, through@~2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+"true-case-path@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf"
+ integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==
+
+ts-essentials@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
+ integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
+
+ts-essentials@^6.0.3:
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6"
+ integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
+
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
+ dependencies:
+ "@types/mkdirp" "^0.5.2"
+ "@types/prettier" "^2.1.1"
+ "@types/resolve" "^0.0.8"
+ chalk "^2.4.1"
+ glob "^7.1.2"
+ mkdirp "^0.5.1"
+ prettier "^2.1.2"
+ resolve "^1.8.1"
+ ts-essentials "^1.0.0"
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.0:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+tweetnacl@^1.0.0, tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typechain@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e"
+ integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==
+ dependencies:
+ command-line-args "^4.0.7"
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ ts-essentials "^6.0.3"
+ ts-generator "^0.1.1"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typescript@^4.3.4:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4"
+ integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==
+
+typewise-core@^1.2, typewise-core@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
+ integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+
+typewise@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651"
+ integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+ dependencies:
+ typewise-core "^1.2.0"
+
+typewiselite@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e"
+ integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+
+typical@^2.6.0, typical@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
+ integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+underscore@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unorm@^1.3.3:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0, util.promisify@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f"
+ integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.9.1"
+
+web3-core-helpers@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99"
+ integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==
+ dependencies:
+ underscore "1.9.1"
+ web3-eth-iban "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-method@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6"
+ integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-promievent@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf"
+ integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a"
+ integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==
+ dependencies:
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-providers-http "1.2.11"
+ web3-providers-ipc "1.2.11"
+ web3-providers-ws "1.2.11"
+
+web3-core-subscriptions@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd"
+ integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-core@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7"
+ integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-requestmanager "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-abi@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0"
+ integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==
+ dependencies:
+ "@ethersproject/abi" "5.0.0-beta.153"
+ underscore "1.9.1"
+ web3-utils "1.2.11"
+
+web3-eth-accounts@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520"
+ integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.9.1"
+ uuid "3.3.2"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-contract@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90"
+ integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-ens@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532"
+ integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-iban@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef"
+ integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.2.11"
+
+web3-eth-personal@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70"
+ integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793"
+ integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==
+ dependencies:
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-accounts "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-eth-ens "1.2.11"
+ web3-eth-iban "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-net@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b"
+ integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-provider-engine@14.2.1:
+ version "14.2.1"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95"
+ integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==
+ dependencies:
+ 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"
+
+web3-providers-http@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6"
+ integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==
+ dependencies:
+ web3-core-helpers "1.2.11"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21"
+ integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==
+ dependencies:
+ oboe "2.1.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-providers-ws@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb"
+ integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ websocket "^1.0.31"
+
+web3-shh@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f"
+ integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-net "1.2.11"
+
+web3-utils@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82"
+ integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@^1.0.0-beta.31:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.4.0.tgz#e8cb381c81b242dc1d4ecb397200356d404410e6"
+ integrity sha512-b8mEhwh/J928Xk+SQFjtqrR2EGPhpknWLcIt9aCpVPVRXiqjUGo/kpOHKz0azu9c6/onEJ9tWXZt0cVjmH0N5Q==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975"
+ integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==
+ dependencies:
+ web3-bzz "1.2.11"
+ web3-core "1.2.11"
+ web3-eth "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-shh "1.2.11"
+ web3-utils "1.2.11"
+
+websocket@1.0.32:
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+websocket@^1.0.31:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1.3.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+workerpool@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
+ integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
+ integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^7.4.6:
+ version "7.5.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6"
+ integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@20.2.4:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
+
+yargs-unparser@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yargs@^4.7.1:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+ integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA=
+ dependencies:
+ 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"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/examples/standard-bridge-tokens/README.md b/examples/standard-bridge-tokens/README.md
new file mode 100644
index 000000000000..9f3952f4a973
--- /dev/null
+++ b/examples/standard-bridge-tokens/README.md
@@ -0,0 +1,3 @@
+# L1/L2 ERC20 Deposit + Withdrawal Example
+
+### For the full README, please see the [guided repository of `l1-l2-deposit-withdrawal`](https://github.com/ethereum-optimism/l1-l2-deposit-withdrawal)
\ No newline at end of file
diff --git a/examples/standard-bridge-tokens/contracts/ERC20.sol b/examples/standard-bridge-tokens/contracts/ERC20.sol
new file mode 100644
index 000000000000..bfb223340c0b
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/ERC20.sol
@@ -0,0 +1,241 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.6.0 <0.8.0;
+
+/**
+ * @title ERC20
+ * @dev A super simple ERC20 implementation! Also *very* insecure. Do not use in prod.
+ */
+contract ERC20 {
+
+ /**********
+ * Events *
+ **********/
+
+ event Transfer(
+ address indexed _from,
+ address indexed _to,
+ uint256 _value
+ );
+
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+
+
+ /*************
+ * Variables *
+ *************/
+
+ mapping (address => uint256) public balances;
+ mapping (address => mapping (address => uint256)) public allowances;
+
+ // Some optional extra goodies.
+ uint256 public totalSupply;
+ string public name;
+ string public symbol;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _initialSupply Initial maximum token supply.
+ * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).
+ * @param _symbol A symbol for our ERC20
+ */
+ constructor(
+ uint256 _initialSupply,
+ string memory _name,
+ string memory _symbol
+ )
+ public
+ {
+ balances[msg.sender] = _initialSupply;
+ totalSupply = _initialSupply;
+ name = _name;
+ symbol = _symbol;
+ }
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Checks the balance of an address.
+ * @param _owner Address to check a balance for.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _owner
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_owner];
+ }
+
+ /**
+ * Transfers a balance from your account to someone else's account!
+ * @param _to Address to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transfer(
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[msg.sender] >= _amount,
+ "You don't have enough balance to make this transfer!"
+ );
+
+ balances[msg.sender] -= _amount;
+ balances[_to] += _amount;
+
+ emit Transfer(
+ msg.sender,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Transfers a balance from someone else's account to another account. You need an allowance
+ * from the sending account for this to work!
+ * @param _from Account to transfer a balance from.
+ * @param _to Account to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[_from] >= _amount,
+ "Can't transfer from the desired account because it doesn't have enough balance."
+ );
+
+ require(
+ allowances[_from][msg.sender] >= _amount,
+ "Can't transfer from the desired account because you don't have enough of an allowance."
+ );
+
+ balances[_to] += _amount;
+ balances[_from] -= _amount;
+
+ emit Transfer(
+ _from,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Approves an account to spend some amount from your account.
+ * @param _spender Account to approve a balance for.
+ * @param _amount Amount to allow the account to spend from your account.
+ * @return true if the allowance was successful.
+ */
+ function approve(
+ address _spender,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ allowances[msg.sender][_spender] = _amount;
+
+ emit Approval(
+ msg.sender,
+ _spender,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks how much a given account is allowed to spend from another given account.
+ * @param _owner Address of the account to check an allowance from.
+ * @param _spender Address of the account trying to spend from the owner.
+ * @return Allowance for the spender from the owner.
+ */
+ function allowance(
+ address _owner,
+ address _spender
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return allowances[_owner][_spender];
+ }
+
+ /**
+ * Internal minting function.
+ * @param _who Address to mint tokens for.
+ * @param _amount Number of tokens to mint.
+ */
+ function _mint(
+ address _who,
+ uint256 _amount
+ )
+ internal
+ {
+ totalSupply += _amount;
+ balances[_who] += _amount;
+ emit Transfer(address(0), _who, _amount);
+ }
+
+ /**
+ * Internal burning function.
+ * @param _who Address to burn tokens from.
+ * @param _amount Number of tokens to burn.
+ */
+ function _burn(
+ address _who,
+ uint256 _amount
+ )
+ internal
+ {
+ require(
+ totalSupply >= _amount,
+ "Can't burn more than total supply."
+ );
+
+ require(
+ balances[_who] >= _amount,
+ "Account does not have enough to burn."
+ );
+
+ totalSupply -= _amount;
+ balances[_who] -= _amount;
+ emit Transfer(_who, address(0), _amount);
+ }
+}
diff --git a/examples/standard-bridge-tokens/contracts/L2StandardERC20.sol b/examples/standard-bridge-tokens/contracts/L2StandardERC20.sol
new file mode 100644
index 000000000000..76be60f50ca7
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/L2StandardERC20.sol
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.16 <0.8.0;
+
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+import './interfaces/IL2StandardERC20.sol';
+
+contract L2StandardERC20 is IL2StandardERC20, ERC20 {
+ address public override l1Token;
+ address public l2Bridge;
+
+ /**
+ * @param _l1Token Address of the corresponding L1 token.
+ * @param _name ERC20 name.
+ * @param _symbol ERC20 symbol.
+ */
+ constructor(
+ address _l2Bridge,
+ address _l1Token,
+ string memory _name,
+ string memory _symbol
+ )
+ ERC20(_name, _symbol) {
+ l1Token = _l1Token;
+ l2Bridge = _l2Bridge;
+ }
+
+ modifier onlyL2Bridge {
+ require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn");
+ _;
+ }
+
+ function supportsInterface(bytes4 _interfaceId) public override pure returns (bool) {
+ bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)")); // ERC165
+ bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector
+ ^ IL2StandardERC20.mint.selector
+ ^ IL2StandardERC20.burn.selector;
+ return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;
+ }
+
+ function mint(address _to, uint256 _amount) public override onlyL2Bridge {
+ _mint(_to, _amount);
+
+ emit Mint(_to, _amount);
+ }
+
+ function burn(address _from, uint256 _amount) public override onlyL2Bridge {
+ _burn(_from, _amount);
+
+ emit Burn(_from, _amount);
+ }
+}
diff --git a/examples/standard-bridge-tokens/contracts/OVM_CrossDomainEnabled.sol b/examples/standard-bridge-tokens/contracts/OVM_CrossDomainEnabled.sol
new file mode 100644
index 000000000000..4297c3649cdc
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/OVM_CrossDomainEnabled.sol
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/* Interface Imports */
+import { iOVM_CrossDomainMessenger } from "./interfaces/iOVM_CrossDomainMessenger.sol";
+
+/**
+ * @title OVM_CrossDomainEnabled
+ * @dev Helper contract for contracts performing cross-domain communications
+ *
+ * Compiler used: defined by inheriting contract
+ * Runtime target: defined by inheriting contract
+ */
+contract OVM_CrossDomainEnabled {
+
+ /*************
+ * Variables *
+ *************/
+
+ // Messenger contract used to send and recieve messages from the other domain.
+ address public messenger;
+
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _messenger Address of the CrossDomainMessenger on the current layer.
+ */
+ constructor(
+ address _messenger
+ ) {
+ messenger = _messenger;
+ }
+
+
+ /**********************
+ * Function Modifiers *
+ **********************/
+
+ /**
+ * Enforces that the modified function is only callable by a specific cross-domain account.
+ * @param _sourceDomainAccount The only account on the originating domain which is
+ * authenticated to call this function.
+ */
+ modifier onlyFromCrossDomainAccount(
+ address _sourceDomainAccount
+ ) {
+ require(
+ msg.sender == address(getCrossDomainMessenger()),
+ "OVM_XCHAIN: messenger contract unauthenticated"
+ );
+
+ require(
+ getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,
+ "OVM_XCHAIN: wrong sender of cross-domain message"
+ );
+
+ _;
+ }
+
+
+ /**********************
+ * Internal Functions *
+ **********************/
+
+ /**
+ * Gets the messenger, usually from storage. This function is exposed in case a child contract
+ * needs to override.
+ * @return The address of the cross-domain messenger contract which should be used.
+ */
+ function getCrossDomainMessenger()
+ internal
+ virtual
+ returns (
+ iOVM_CrossDomainMessenger
+ )
+ {
+ return iOVM_CrossDomainMessenger(messenger);
+ }
+
+ /**
+ * Sends a message to an account on another domain
+ * @param _crossDomainTarget The intended recipient on the destination domain
+ * @param _message The data to send to the target (usually calldata to a function with
+ * `onlyFromCrossDomainAccount()`)
+ * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
+ */
+ function sendCrossDomainMessage(
+ address _crossDomainTarget,
+ uint32 _gasLimit,
+ bytes memory _message
+ )
+ internal
+ {
+ getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
+ }
+}
diff --git a/examples/standard-bridge-tokens/contracts/OVM_L1StandardBridge.sol b/examples/standard-bridge-tokens/contracts/OVM_L1StandardBridge.sol
new file mode 100644
index 000000000000..9773a32de4a1
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/OVM_L1StandardBridge.sol
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: MIT
+// @unsupported: ovm
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { iOVM_L1StandardBridge } from "./interfaces/iOVM_L1StandardBridge.sol";
+import { iOVM_L1ERC20Bridge } from "./interfaces/iOVM_L1ERC20Bridge.sol";
+import { iOVM_L2ERC20Bridge } from "./interfaces/iOVM_L2ERC20Bridge.sol";
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+/* Library Imports */
+import { OVM_CrossDomainEnabled } from "./OVM_CrossDomainEnabled.sol";
+import { Lib_PredeployAddresses } from "./libraries/Lib_PredeployAddresses.sol";
+import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
+import { Address } from "@openzeppelin/contracts/utils/Address.sol";
+import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+
+/**
+ * @title OVM_L1StandardBridge
+ * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2.
+ * It synchronizes a corresponding L2 Bridge, informing it of deposits, and listening to it for newly finalized withdrawals.
+ *
+ * Compiler used: solc
+ * Runtime target: EVM
+ */
+contract OVM_L1StandardBridge is iOVM_L1StandardBridge, OVM_CrossDomainEnabled {
+ using SafeMath for uint;
+ using SafeERC20 for IERC20;
+
+ /********************************
+ * External Contract References *
+ ********************************/
+
+ address public l2TokenBridge;
+
+ // Maps L1 token to L2 token to balance of the L1 token deposited
+ mapping(address => mapping (address => uint256)) public deposits;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ // This contract lives behind a proxy, so the constructor parameters will go unused.
+ constructor()
+ OVM_CrossDomainEnabled(address(0))
+ {}
+
+ /******************
+ * Initialization *
+ ******************/
+
+ /**
+ * @param _l1messenger L1 Messenger address being used for cross-chain communications.
+ * @param _l2TokenBridge L2 standard bridge address.
+ */
+ function initialize(
+ address _l1messenger,
+ address _l2TokenBridge
+ )
+ public
+ {
+ require(messenger == address(0), "Contract has already been initialized.");
+ messenger = _l1messenger;
+ l2TokenBridge = _l2TokenBridge;
+ }
+
+ /**************
+ * Depositing *
+ **************/
+
+ /// @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious contract via initcode, but it takes care of the user error we want to avoid.
+ modifier onlyEOA() {
+ // Used to stop deposits from contracts (avoid accidentally lost tokens)
+ require(!Address.isContract(msg.sender), "Account not EOA");
+ _;
+ }
+
+ /**
+ * @dev This function can be called with no data
+ * to deposit an amount of ETH to the caller's balance on L2.
+ * Since the receive function doesn't take data, a conservative
+ * default amount is forwarded to L2.
+ */
+ receive()
+ external
+ payable
+ onlyEOA()
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ msg.sender,
+ 1_300_000,
+ bytes("")
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function depositETH(
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ payable
+ onlyEOA()
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ msg.sender,
+ _l2Gas,
+ _data
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function depositETHTo(
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ payable
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ _to,
+ _l2Gas,
+ _data
+ );
+ }
+
+ /**
+ * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.
+ * @param _from Account to pull the deposit from on L1.
+ * @param _to Account to give the deposit to on L2.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateETHDeposit(
+ address _from,
+ address _to,
+ uint32 _l2Gas,
+ bytes memory _data
+ )
+ internal
+ {
+ // Construct calldata for finalizeDeposit call
+ bytes memory message =
+ abi.encodeWithSelector(
+ iOVM_L2ERC20Bridge.finalizeDeposit.selector,
+ address(0),
+ Lib_PredeployAddresses.OVM_ETH,
+ _from,
+ _to,
+ msg.value,
+ _data
+ );
+
+ // Send calldata into L2
+ sendCrossDomainMessage(
+ l2TokenBridge,
+ _l2Gas,
+ message
+ );
+
+ emit ETHDepositInitiated(_from, _to, msg.value, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function depositERC20(
+ address _l1Token,
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ onlyEOA()
+ {
+ _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function depositERC20To(
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);
+ }
+
+ /**
+ * @dev Performs the logic for deposits by informing the L2 Deposited Token
+ * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)
+ *
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _from Account to pull the deposit from on L1
+ * @param _to Account to give the deposit to on L2
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateERC20Deposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ internal
+ {
+ // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future withdrawals.
+ // safeTransferFrom also checks if the contract has code, so this will fail if _from is an EOA or address(0).
+ IERC20(_l1Token).safeTransferFrom(
+ _from,
+ address(this),
+ _amount
+ );
+
+ // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)
+ bytes memory message = abi.encodeWithSelector(
+ iOVM_L2ERC20Bridge.finalizeDeposit.selector,
+ _l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+
+ // Send calldata into L2
+ sendCrossDomainMessage(
+ l2TokenBridge,
+ _l2Gas,
+ message
+ );
+
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].add(_amount);
+
+ emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function finalizeETHWithdrawal(
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ onlyFromCrossDomainAccount(l2TokenBridge)
+ {
+ (bool success, ) = _to.call{value: _amount}(new bytes(0));
+ require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
+
+ emit ETHWithdrawalFinalized(_from, _to, _amount, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function finalizeERC20Withdrawal(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ onlyFromCrossDomainAccount(l2TokenBridge)
+ {
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].sub(_amount);
+
+ // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer.
+ IERC20(_l1Token).safeTransfer(_to, _amount);
+
+ emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*****************************
+ * Temporary - Migrating ETH *
+ *****************************/
+
+ /**
+ * @dev Adds ETH balance to the account. This is meant to allow for ETH
+ * to be migrated from an old gateway to a new gateway.
+ * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract
+ */
+ function donateETH() external payable {}
+}
diff --git a/examples/standard-bridge-tokens/contracts/OVM_L2StandardBridge.sol b/examples/standard-bridge-tokens/contracts/OVM_L2StandardBridge.sol
new file mode 100644
index 000000000000..26ff6b294035
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/OVM_L2StandardBridge.sol
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { iOVM_L1StandardBridge } from "./interfaces/iOVM_L1StandardBridge.sol";
+import { iOVM_L1ERC20Bridge } from "./interfaces/iOVM_L1ERC20Bridge.sol";
+import { iOVM_L2ERC20Bridge } from "./interfaces/iOVM_L2ERC20Bridge.sol";
+
+/* Library Imports */
+import { ERC165Checker } from "@openzeppelin/contracts/introspection/ERC165Checker.sol";
+import { OVM_CrossDomainEnabled } from "./OVM_CrossDomainEnabled.sol";
+import { Lib_PredeployAddresses } from "./libraries/Lib_PredeployAddresses.sol";
+
+/* Contract Imports */
+import { IL2StandardERC20 } from "./interfaces/IL2StandardERC20.sol";
+
+/**
+ * @title OVM_L2StandardBridge
+ * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to enable
+ * ETH and ERC20 transitions between L1 and L2.
+ * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard bridge.
+ * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 bridge to release L1 funds.
+ *
+ * Compiler used: optimistic-solc
+ * Runtime target: OVM
+ */
+contract OVM_L2StandardBridge is iOVM_L2ERC20Bridge, OVM_CrossDomainEnabled {
+
+ /********************************
+ * External Contract References *
+ ********************************/
+
+ address public l1TokenBridge;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.
+ * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.
+ */
+ constructor(
+ address _l2CrossDomainMessenger,
+ address _l1TokenBridge
+ )
+ OVM_CrossDomainEnabled(_l2CrossDomainMessenger)
+ {
+ l1TokenBridge = _l1TokenBridge;
+ }
+
+ /***************
+ * Withdrawing *
+ ***************/
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function withdraw(
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateWithdrawal(
+ _l2Token,
+ msg.sender,
+ msg.sender,
+ _amount,
+ _l1Gas,
+ _data
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function withdrawTo(
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateWithdrawal(
+ _l2Token,
+ msg.sender,
+ _to,
+ _amount,
+ _l1Gas,
+ _data
+ );
+ }
+
+ /**
+ * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _from Account to pull the deposit from on L2.
+ * @param _to Account to give the withdrawal to on L1.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateWithdrawal(
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ internal
+ {
+ // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage
+ IL2StandardERC20(_l2Token).burn(msg.sender, _amount);
+
+ // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)
+ address l1Token = IL2StandardERC20(_l2Token).l1Token();
+ bytes memory message;
+
+ if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {
+ message = abi.encodeWithSelector(
+ iOVM_L1StandardBridge.finalizeETHWithdrawal.selector,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+ } else {
+ message = abi.encodeWithSelector(
+ iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+ }
+
+ // Send message up to L1 bridge
+ sendCrossDomainMessage(
+ l1TokenBridge,
+ _l1Gas,
+ message
+ );
+
+ emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);
+ }
+
+ /************************************
+ * Cross-chain Function: Depositing *
+ ************************************/
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function finalizeDeposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ onlyFromCrossDomainAccount(l1TokenBridge)
+ {
+ // Check the target token is compliant and
+ // verify the deposited token on L1 matches the L2 deposited token representation here
+ if (
+ ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&
+ _l1Token == IL2StandardERC20(_l2Token).l1Token()
+ ) {
+ // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.
+ IL2StandardERC20(_l2Token).mint(_to, _amount);
+ emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
+ } else {
+ // Either the L2 token which is being deposited-into disagrees about the correct address
+ // of its L1 token, or does not support the correct interface.
+ // This should only happen if there is a malicious L2 token, or if a user somehow
+ // specified the wrong L2 token address to deposit into.
+ // In either case, we stop the process here and construct a withdrawal
+ // message so that users can get their funds out in some cases.
+ // There is no way to prevent malicious token contracts altogether, but this does limit
+ // user error and mitigate some forms of malicious contract behavior.
+ bytes memory message = abi.encodeWithSelector(
+ iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ _l1Token,
+ _l2Token,
+ _to, // switched the _to and _from here to bounce back the deposit to the sender
+ _from,
+ _amount,
+ _data
+ );
+
+ // Send message up to L1 bridge
+ sendCrossDomainMessage(
+ l1TokenBridge,
+ 0,
+ message
+ );
+ emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+ }
+}
diff --git a/examples/standard-bridge-tokens/contracts/interfaces/IL2StandardERC20.sol b/examples/standard-bridge-tokens/contracts/interfaces/IL2StandardERC20.sol
new file mode 100644
index 000000000000..34f7c2375155
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/interfaces/IL2StandardERC20.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.16 <0.8.0;
+
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import { IERC165 } from "@openzeppelin/contracts/introspection/IERC165.sol";
+
+interface IL2StandardERC20 is IERC20, IERC165 {
+ function l1Token() external returns (address);
+
+ function mint(address _to, uint256 _amount) external;
+
+ function burn(address _from, uint256 _amount) external;
+
+ event Mint(address indexed _account, uint256 _amount);
+ event Burn(address indexed _account, uint256 _amount);
+}
diff --git a/examples/standard-bridge-tokens/contracts/interfaces/iOVM_CrossDomainMessenger.sol b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_CrossDomainMessenger.sol
new file mode 100644
index 000000000000..457d9d34f9d0
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_CrossDomainMessenger.sol
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_CrossDomainMessenger
+ */
+interface iOVM_CrossDomainMessenger {
+
+ /**********
+ * Events *
+ **********/
+
+ event SentMessage(bytes message);
+ event RelayedMessage(bytes32 msgHash);
+ event FailedRelayedMessage(bytes32 msgHash);
+
+
+ /*************
+ * Variables *
+ *************/
+
+ function xDomainMessageSender() external view returns (address);
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Sends a cross domain message to the target messenger.
+ * @param _target Target contract address.
+ * @param _message Message to send to the target.
+ * @param _gasLimit Gas limit for the provided message.
+ */
+ function sendMessage(
+ address _target,
+ bytes calldata _message,
+ uint32 _gasLimit
+ ) external;
+}
diff --git a/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L1ERC20Bridge.sol b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L1ERC20Bridge.sol
new file mode 100644
index 000000000000..636ddb61ce76
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L1ERC20Bridge.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_L1ERC20Bridge
+ */
+interface iOVM_L1ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+
+ event ERC20DepositInitiated (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event ERC20WithdrawalFinalized (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev deposit an amount of the ERC20 to the caller's balance on L2.
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _amount Amount of the ERC20 to deposit
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositERC20 (
+ address _l1Token,
+ address _l2Token,
+ uint _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /**
+ * @dev deposit an amount of ERC20 to a recipient's balance on L2.
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _to L2 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositERC20To (
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external;
+
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
+ * L1 ERC20 token.
+ * This call will fail if the initialized withdrawal from L2 has not been finalized.
+ *
+ * @param _l1Token Address of L1 token to finalizeWithdrawal for.
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _from L2 address initiating the transfer.
+ * @param _to L1 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _data Data provided by the sender on L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeERC20Withdrawal (
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+}
diff --git a/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L1StandardBridge.sol b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L1StandardBridge.sol
new file mode 100644
index 000000000000..fe63dd8e88fc
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L1StandardBridge.sol
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+import './iOVM_L1ERC20Bridge.sol';
+
+/**
+ * @title iOVM_L1StandardBridge
+ */
+interface iOVM_L1StandardBridge is iOVM_L1ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+ event ETHDepositInitiated (
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event ETHWithdrawalFinalized (
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev Deposit an amount of the ETH to the caller's balance on L2.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositETH (
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ payable;
+
+ /**
+ * @dev Deposit an amount of ETH to a recipient's balance on L2.
+ * @param _to L2 address to credit the withdrawal to.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositETHTo (
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ payable;
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
+ * L1 ETH token.
+ * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.
+ * @param _from L2 address initiating the transfer.
+ * @param _to L1 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeETHWithdrawal (
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+}
diff --git a/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L2ERC20Bridge.sol b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L2ERC20Bridge.sol
new file mode 100644
index 000000000000..75ea2f7c139e
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/interfaces/iOVM_L2ERC20Bridge.sol
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_L2ERC20Bridge
+ */
+interface iOVM_L2ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+
+ event WithdrawalInitiated (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event DepositFinalized (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event DepositFailed (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev initiate a withdraw of some tokens to the caller's account on L1
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function withdraw (
+ address _l2Token,
+ uint _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /**
+ * @dev initiate a withdraw of some token to a recipient's account on L1.
+ * @param _l2Token Address of L2 token where withdrawal is initiated.
+ * @param _to L1 adress to credit the withdrawal to.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function withdrawTo (
+ address _l2Token,
+ address _to,
+ uint _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this
+ * L2 token.
+ * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.
+ * @param _l1Token Address for the l1 token this is called with
+ * @param _l2Token Address for the l2 token this is called with
+ * @param _from Account to pull the deposit from on L2.
+ * @param _to Address to receive the withdrawal at
+ * @param _amount Amount of the token to withdraw
+ * @param _data Data provider by the sender on L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeDeposit (
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+
+}
diff --git a/examples/standard-bridge-tokens/contracts/libraries/Lib_PredeployAddresses.sol b/examples/standard-bridge-tokens/contracts/libraries/Lib_PredeployAddresses.sol
new file mode 100644
index 000000000000..b597e00ec0da
--- /dev/null
+++ b/examples/standard-bridge-tokens/contracts/libraries/Lib_PredeployAddresses.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/**
+ * @title Lib_PredeployAddresses
+ */
+library Lib_PredeployAddresses {
+ address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;
+ address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;
+ address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;
+ address internal constant ECDSA_CONTRACT_ACCOUNT = 0x4200000000000000000000000000000000000003;
+ address internal constant SEQUENCER_ENTRYPOINT = 0x4200000000000000000000000000000000000005;
+ address payable internal constant OVM_ETH = 0x4200000000000000000000000000000000000006;
+ address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;
+ address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;
+ address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;
+ address internal constant EXECUTION_MANAGER_WRAPPER = 0x420000000000000000000000000000000000000B;
+ address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;
+ address internal constant ERC1820_REGISTRY = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;
+ address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;
+}
diff --git a/examples/standard-bridge-tokens/hardhat.config.js b/examples/standard-bridge-tokens/hardhat.config.js
new file mode 100644
index 000000000000..31ab352bdbe0
--- /dev/null
+++ b/examples/standard-bridge-tokens/hardhat.config.js
@@ -0,0 +1,33 @@
+// Plugins
+require('@nomiclabs/hardhat-ethers')
+require('@nomiclabs/hardhat-waffle')
+require('hardhat-deploy')
+require('@eth-optimism/hardhat-ovm')
+
+module.exports = {
+ networks: {
+ // Add this network to your config!
+ optimism: {
+ url: 'http://127.0.0.1:8545',
+ // instantiate with a mnemonic so that you have >1 accounts available
+ accounts: {
+ mnemonic: 'test test test test test test test test test test test junk'
+ },
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true // This sets the network as using the ovm and ensure contract will be compiled against that.
+ },
+ },
+ solidity: '0.7.6',
+ ovm: {
+ solcVersion: '0.7.6'
+ },
+ namedAccounts: {
+ deployer: 0
+ },
+ mocha: {
+ timeout: 60000
+ }
+}
\ No newline at end of file
diff --git a/examples/standard-bridge-tokens/package.json b/examples/standard-bridge-tokens/package.json
new file mode 100644
index 000000000000..d06eab267638
--- /dev/null
+++ b/examples/standard-bridge-tokens/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "standard-bridge-token",
+ "version": "1.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "scripts": {
+ "clean": "rimraf ./cache ./artifacts ./cache-ovm ./artifacts-ovm",
+ "compile": "hardhat compile",
+ "compile:ovm": "hardhat compile --network optimism",
+ "test:integration:ovm": "hardhat test --network optimism",
+ "deploy": "hardhat deploy",
+ "deploy:ovm": "hardhat deploy --network optimism"
+ },
+ "devDependencies": {
+ "@eth-optimism/contracts": "^0.3.0",
+ "@eth-optimism/core-utils": "^0.4.2",
+ "@eth-optimism/hardhat-ovm": "^0.2.0",
+ "@eth-optimism/watcher": "^0.0.1-alpha.9",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "chai": "^4.3.4",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.1.4",
+ "hardhat": "^2.2.1",
+ "hardhat-deploy": "^0.7.5",
+ "mocha": "^8.4.0",
+ "rimraf": "^3.0.2"
+ }
+}
\ No newline at end of file
diff --git a/examples/standard-bridge-tokens/test/example.test.js b/examples/standard-bridge-tokens/test/example.test.js
new file mode 100644
index 000000000000..80928f250e5e
--- /dev/null
+++ b/examples/standard-bridge-tokens/test/example.test.js
@@ -0,0 +1,173 @@
+/* External Imports */
+const { ethers } = require('hardhat')
+const { expect } = require('chai')
+const { Watcher } = require('@eth-optimism/watcher')
+
+/* Internal Imports */
+const factory = (name, ovm = false) => {
+ const artifact = require(`../artifacts${ovm ? '-ovm' : ''}/contracts/${name}.sol/${name}.json`)
+ return new ethers.ContractFactory(artifact.abi, artifact.bytecode)
+}
+const factory__L1_ERC20 = factory('ERC20')
+const factory__L2_ERC20 = factory('L2StandardERC20', true)
+const factory__L1StandardBridge = factory('OVM_L1StandardBridge')
+const factory__L2StandardBridge = factory('OVM_L2StandardBridge', true)
+
+describe(`L1 <> L2 Deposit and Withdrawal`, () => {
+ // Set up our RPC provider connections.
+ const l1RpcProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9545')
+ const l2RpcProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545')
+
+ // Constructor arguments for `ERC20.sol`
+ const INITIAL_SUPPLY = 1234
+ const L1_ERC20_NAME = 'L1 ERC20'
+ const L1_ERC20_SYMBOL = 'L1 ERC20'
+
+ // L1 standard bridge address depends on the deployment, this is default for our local deployment.
+ const L1StandardBridgeAddress = '0x851356ae760d987E095750cCeb3bC6014560891C'
+ // L2 standard bridge address is always the same.
+ const L2StandardBridgeAddress = '0x4200000000000000000000000000000000000010'
+ // L1 messenger address depends on the deployment, this is default for our local deployment.
+ const l1MessengerAddress = '0x59b670e9fA9D0A427751Af201D676719a970857b'
+ // L2 messenger address is always the same.
+ const l2MessengerAddress = '0x4200000000000000000000000000000000000007'
+
+ const L2_ERC20_NAME = 'L2 ERC20'
+ const L2_ERC20_SYMBOL = 'L2 ERC20'
+
+ // Set up our wallets (using a default private key with 10k ETH allocated to it).
+ // Need two wallets objects, one for interacting with L1 and one for interacting with L2.
+ // Both will use the same private key.
+ const key = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+ const l1Wallet = new ethers.Wallet(key, l1RpcProvider)
+ const l2Wallet = new ethers.Wallet(key, l2RpcProvider)
+
+ // Tool that helps watches and waits for messages to be relayed between L1 and L2.
+ const watcher = new Watcher({
+ l1: {
+ provider: l1RpcProvider,
+ messengerAddress: l1MessengerAddress
+ },
+ l2: {
+ provider: l2RpcProvider,
+ messengerAddress: l2MessengerAddress
+ }
+ })
+
+ const L1StandardBridge = factory__L1StandardBridge.connect(l1Wallet).attach(L1StandardBridgeAddress)
+ const L2StandardBridge = factory__L2StandardBridge.connect(l2Wallet).attach(L2StandardBridgeAddress)
+ let L1_ERC20, L2_ERC20, L1GasLimit = 9999999, L2GasLimit = 9999999;
+
+ before(`deploy contracts`, async () => {
+ // Deploy an ERC20 token on L1.
+ L1_ERC20 = await factory__L1_ERC20.connect(l1Wallet).deploy(
+ INITIAL_SUPPLY,
+ L1_ERC20_NAME,
+ L1_ERC20_SYMBOL,
+ {
+ gasPrice: 0
+ }
+ )
+
+ await L1_ERC20.deployTransaction.wait()
+
+ // Deploy the paired ERC20 token to L2.
+ L2_ERC20 = await factory__L2_ERC20.connect(l2Wallet).deploy(
+ L2StandardBridgeAddress,
+ L1_ERC20.address,
+ L2_ERC20_NAME,
+ L2_ERC20_SYMBOL,
+ {
+ gasPrice: 0
+ }
+ )
+
+ await L2_ERC20.deployTransaction.wait()
+ })
+
+ describe('Initialization and initial balances', async () => {
+ it(`should have initial L1 balance of 1234 and initial L2 balance of 0`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(1234)
+ expect(l2Balance).to.eq(0)
+ })
+ })
+
+ describe('L1 to L2 deposit', async () => {
+ let l1Tx1
+
+ it(`should approve 1234 tokens for ERC20 bridge`, async () => {
+ const tx = await L1_ERC20.approve(L1StandardBridge.address, 1234)
+ await tx.wait()
+ const txHashPrefix = tx.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should deposit 1234 tokens into L2 ERC20`, async () => {
+ l1Tx1 = await L1StandardBridge.depositERC20(
+ L1_ERC20.address,
+ L2_ERC20.address,
+ 1234,
+ L2GasLimit,
+ ethers.utils.formatBytes32String('0'),
+ { gasPrice: 0 }
+ )
+ await l1Tx1.wait()
+ const txHashPrefix = l1Tx1.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should relay deposit message to L2`, async () => {
+ // Wait for the message to be relayed to L2.
+ const [ msgHash1 ] = await watcher.getMessageHashesFromL1Tx(l1Tx1.hash)
+ const l2TxReceipt = await watcher.getL2TransactionReceipt(msgHash1)
+ expect(l2TxReceipt.to).to.eq(l2MessengerAddress)
+ })
+
+ it(`should have changed L1 balance to 0 and L2 balance to 1234`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(0)
+ expect(l2Balance).to.eq(1234)
+ })
+ })
+
+ describe('L2 to L1 withdrawal', async () => {
+ let l2Tx1
+
+ it(`should approve 1234 tokens for ERC20 bridge`, async () => {
+ const tx = await L2_ERC20.approve(L2StandardBridge.address, 1234)
+ await tx.wait()
+ const txHashPrefix = tx.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should withdraw tokens back to L1 ERC20 and relay the message`, async () => {
+ // Burn the tokens on L2 and ask the L1 contract to unlock on our behalf.
+ l2Tx1 = await L2StandardBridge.withdraw(
+ L2_ERC20.address,
+ 1234,
+ L1GasLimit,
+ ethers.utils.formatBytes32String('0'),
+ { gasPrice: 0 }
+ )
+ await l2Tx1.wait()
+ const txHashPrefix = l2Tx1.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should relay withdrawal message to L1`, async () => {
+ const [ msgHash2 ] = await watcher.getMessageHashesFromL2Tx(l2Tx1.hash)
+ const l1TxReceipt = await watcher.getL1TransactionReceipt(msgHash2)
+ expect(l1TxReceipt.to).to.eq(l1MessengerAddress)
+ })
+
+ it(`should have changed L1 balance back to 1234 and L2 balance back to 0`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(1234)
+ expect(l2Balance).to.eq(0)
+ })
+ })
+})
diff --git a/examples/standard-bridge-tokens/yarn.lock b/examples/standard-bridge-tokens/yarn.lock
new file mode 100644
index 000000000000..fac9980bdd57
--- /dev/null
+++ b/examples/standard-bridge-tokens/yarn.lock
@@ -0,0 +1,8061 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ensdomains/ens@^0.4.4":
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc"
+ integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==
+ dependencies:
+ bluebird "^3.5.2"
+ eth-ens-namehash "^2.0.8"
+ solc "^0.4.20"
+ testrpc "0.0.1"
+ web3-utils "^1.0.0-beta.31"
+
+"@ensdomains/resolver@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
+ integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
+
+"@eth-optimism/contracts@^0.3.0":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.3.5.tgz#f63ff93bffde7310a5b990aea599dbb8395d2c0e"
+ integrity sha512-tjRadNBjbB/5uj5Boidl0d8f3k6pB+N7jP0JH6LQOk59aAGL4oY1F4Tetr0Igz+r7PZMjulen5rSP1UbCHPbNw==
+ dependencies:
+ "@eth-optimism/core-utils" "^0.4.5"
+ "@ethersproject/abstract-provider" "^5.0.8"
+ "@ethersproject/abstract-signer" "^5.1.0"
+ "@ethersproject/contracts" "^5.0.5"
+ glob "^7.1.6"
+
+"@eth-optimism/core-utils@^0.4.2", "@eth-optimism/core-utils@^0.4.5":
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.4.6.tgz#a404b6ae5eefddc5a25a99ea4226de1bd9d142f9"
+ integrity sha512-8aGutXNDKsyxdGVQAZ5QL6NVlQkt60rExgyZ9EXOZOuKbpWjNwCJevn0H7agCAPqH6r9pjw2AoxbvI7YW+3ZJw==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.0.9"
+ ethers "^5.0.31"
+ lodash "^4.17.21"
+
+"@eth-optimism/hardhat-ovm@^0.2.0":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.2.2.tgz#55fafaa6b8277447abaf132602c1c6d14a2a18a2"
+ integrity sha512-QLzqawYCzC/m6K/Oaj/tCZQlu6kZTgnleg1cJad8kVYA5E+JWZQ6ZJrcStoJoJrco9RIroPUjAFEhFM8YiCc7Q==
+ dependencies:
+ node-fetch "^2.6.1"
+
+"@eth-optimism/watcher@^0.0.1-alpha.9":
+ version "0.0.1-alpha.9"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/watcher/-/watcher-0.0.1-alpha.9.tgz#3a68eb9292acd28cdd589b8275eed3308356b028"
+ integrity sha512-FSMinaayA/nTQzSPv21tOUqok8gMfEB1UcIdLJkImt9NUzT4QjhGbrsPH6Q2hBlQkAApgTECMShUYZVMpZ7oOw==
+ dependencies:
+ ethers "5.0.0"
+
+"@ethereum-waffle/chai@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.0.tgz#2477877410a96bf370edd64df905b04fb9aba9d5"
+ integrity sha512-GVaFKuFbFUclMkhHtQTDnWBnBQMJc/pAbfbFj/nnIK237WPLsO3KDDslA7m+MNEyTAOFrcc0CyfruAGGXAQw3g==
+ dependencies:
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.0"
+
+"@ethereum-waffle/compiler@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz#68917321212563544913de33e408327745cb1284"
+ integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw==
+ dependencies:
+ "@resolver-engine/imports" "^0.3.3"
+ "@resolver-engine/imports-fs" "^0.3.3"
+ "@typechain/ethers-v5" "^2.0.0"
+ "@types/mkdirp" "^0.5.2"
+ "@types/node-fetch" "^2.5.5"
+ ethers "^5.0.1"
+ mkdirp "^0.5.1"
+ node-fetch "^2.6.1"
+ solc "^0.6.3"
+ ts-generator "^0.1.1"
+ typechain "^3.0.0"
+
+"@ethereum-waffle/ens@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.3.0.tgz#d54f4c8e6b7bcafdc13ab294433f45416b2b2791"
+ integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw==
+ dependencies:
+ "@ensdomains/ens" "^0.4.4"
+ "@ensdomains/resolver" "^0.2.4"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/mock-contract@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz#7b331f1c95c5d46ee9478f7a6be2869f707d307a"
+ integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw==
+ dependencies:
+ "@ethersproject/abi" "^5.0.1"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/provider@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.0.tgz#a36a0890d4fbc230e807870c8d3b683594efef00"
+ integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ==
+ dependencies:
+ "@ethereum-waffle/ens" "^3.3.0"
+ ethers "^5.0.1"
+ ganache-core "^2.13.2"
+ patch-package "^6.2.2"
+ postinstall-postinstall "^2.1.0"
+
+"@ethereumjs/block@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.3.0.tgz#a1b3baec831c71c0d9e7f6145f25e919cff4939c"
+ integrity sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA==
+ dependencies:
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/tx" "^3.2.0"
+ ethereumjs-util "^7.0.10"
+ merkle-patricia-tree "^4.2.0"
+
+"@ethereumjs/blockchain@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.3.0.tgz#206936e30a4320d87a26e58d157eadef21ef6ff1"
+ integrity sha512-B0Y5QDZcRDQISPilv3m8nzk97QmC98DnSE9WxzGpCxfef22Mw7xhwGipci5Iy0dVC2Np2Cr5d3F6bHAR7+yVmQ==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/ethash" "^1.0.0"
+ debug "^2.2.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.3.1.tgz#d692e3aff5adb35dd587dd1e6caab69e0ed2fa0b"
+ integrity sha512-V8hrULExoq0H4HFs3cCmdRGbgmipmlNzak6Xg34nHYfQyqkSdrCuflvYjyWmsNpI8GtrcZhzifAbgX/1C1Cjwg==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.0.10"
+
+"@ethereumjs/ethash@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
+ integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.7"
+ miller-rabin "^4.0.0"
+
+"@ethereumjs/tx@^3.2.0", "@ethereumjs/tx@^3.2.1":
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.2.1.tgz#65f5f1c11541764f08377a94ba4b0dcbbd67739e"
+ integrity sha512-i9V39OtKvwWos1uVNZxdVhd7zFOyzFLjgt69CoiOY0EmXugS0HjO3uxpLBSglDKFMRriuGqw6ddKEv+RP1UNEw==
+ dependencies:
+ "@ethereumjs/common" "^2.3.1"
+ ethereumjs-util "^7.0.10"
+
+"@ethereumjs/vm@^5.3.2":
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.4.1.tgz#62d9f64aa5a2fb334ad630418683c9654f683a5a"
+ integrity sha512-cpQcg5CtjzXJBn8QNiobaiWckeN/ZQwsDHLYa9df2wBEUvzuEZgFWK48YEXSpx3CnUY9fNT/lgA9CzKdq8HTzQ==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/blockchain" "^5.3.0"
+ "@ethereumjs/common" "^2.3.1"
+ "@ethereumjs/tx" "^3.2.1"
+ async-eventemitter "^0.2.4"
+ core-js-pure "^3.0.1"
+ debug "^2.2.0"
+ ethereumjs-util "^7.0.10"
+ functional-red-black-tree "^1.0.1"
+ mcl-wasm "^0.7.1"
+ merkle-patricia-tree "^4.2.0"
+ rustbn.js "~0.2.0"
+ util.promisify "^1.0.1"
+
+"@ethersproject/abi@5.0.0-beta.153":
+ version "5.0.0-beta.153"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
+ integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==
+ dependencies:
+ "@ethersproject/address" ">=5.0.0-beta.128"
+ "@ethersproject/bignumber" ">=5.0.0-beta.130"
+ "@ethersproject/bytes" ">=5.0.0-beta.129"
+ "@ethersproject/constants" ">=5.0.0-beta.128"
+ "@ethersproject/hash" ">=5.0.0-beta.128"
+ "@ethersproject/keccak256" ">=5.0.0-beta.127"
+ "@ethersproject/logger" ">=5.0.0-beta.129"
+ "@ethersproject/properties" ">=5.0.0-beta.131"
+ "@ethersproject/strings" ">=5.0.0-beta.130"
+
+"@ethersproject/abi@5.3.1", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.3.0":
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.1.tgz#69a1a496729d3a83521675a57cbe21f3cc27241c"
+ integrity sha512-F98FWTJG7nWWAQ4DcV6R0cSlrj67MWK3ylahuFbzkumem5cLWg1p7fZ3vIdRoS1c7TEf55Lvyx0w7ICR47IImw==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.0.8", "@ethersproject/abstract-provider@^5.0.9", "@ethersproject/abstract-provider@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz#f4c0ae4a4cef9f204d7781de805fd44b72756c81"
+ integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+
+"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.1.0", "@ethersproject/abstract-signer@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz#05172b653e15b535ed5854ef5f6a72f4b441052d"
+ integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/address@5.3.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.3.0.tgz#e53b69eacebf332e8175de814c5e6507d6932518"
+ integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+
+"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.3.0.tgz#b831fb35418b42ad24d943c557259062b8640824"
+ integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+
+"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.3.0.tgz#02dea3ab8559ae625c6d548bc11773432255c916"
+ integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db"
+ integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9"
+ integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/constants@5.3.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77"
+ integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+
+"@ethersproject/contracts@5.3.0", "@ethersproject/contracts@^5.0.0", "@ethersproject/contracts@^5.0.5":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.3.0.tgz#ad699a3abaae30bfb6422cf31813a663b2d4099c"
+ integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==
+ dependencies:
+ "@ethersproject/abi" "^5.3.0"
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+
+"@ethersproject/hash@5.3.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.3.0.tgz#f65e3bf3db3282df4da676db6cfa049535dd3643"
+ integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.3.0.tgz#26fed65ffd5c25463fddff13f5fb4e5617553c94"
+ integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.0.0", "@ethersproject/json-wallets@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz#7b1a5ff500c12aa8597ae82c8939837b0449376e"
+ integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be"
+ integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@5.3.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0"
+ integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==
+
+"@ethersproject/networks@5.3.1", "@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.3.0":
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.1.tgz#78fe08324cee289ce239acf8c746121934b2ef61"
+ integrity sha512-6uQKHkYChlsfeiZhQ8IHIqGE/sQsf25o9ZxAYpMxi15dLPzz3IxOEF5KiSD32aHwsjXVBKBSlo+teAXLlYJybw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz#8adbb41489c3c9f319cc44bc7d3e6095fd468dc8"
+ integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+
+"@ethersproject/properties@5.3.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.3.0.tgz#feef4c4babeb7c10a6b3449575016f4ad2c092b2"
+ integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/providers@5.3.1", "@ethersproject/providers@^5.0.0":
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.3.1.tgz#a12c6370e8cbc0968c9744641b8ef90b0dd5ec2b"
+ integrity sha512-HC63vENTrur6/JKEhcQbA8PRDj1FAesdpX98IW+xAAo3EAkf70ou5fMIA3KCGzJDLNTeYA4C2Bonz849tVLekg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.3.0", "@ethersproject/random@^5.0.0", "@ethersproject/random@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.3.0.tgz#7c46bf36e50cb0d0550bc8c666af8e1d4496dc1a"
+ integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.0.0", "@ethersproject/rlp@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.3.0.tgz#7cb93a7b5dfa69163894153c9d4b0d936f333188"
+ integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366"
+ integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.0.0", "@ethersproject/signing-key@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.3.0.tgz#a96c88f8173e1abedfa35de32d3e5db7c48e5259"
+ integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.3.0", "@ethersproject/solidity@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93"
+ integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/strings@5.3.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0"
+ integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.3.0.tgz#49b86f2bafa4d0bdf8e596578fc795ee47c50458"
+ integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+
+"@ethersproject/units@5.3.0", "@ethersproject/units@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.3.0.tgz#c4d1493532ad3d4ddf6e2bc4f8c94a2db933a8f5"
+ integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/wallet@5.3.0", "@ethersproject/wallet@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.3.0.tgz#91946b470bd279e39ade58866f21f92749d062af"
+ integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/json-wallets" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/web@5.3.0", "@ethersproject/web@^5.0.0", "@ethersproject/web@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.3.0.tgz#7959c403f6476c61515008d8f92da51c553a8ee1"
+ integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==
+ dependencies:
+ "@ethersproject/base64" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.3.0.tgz#45a0205f5178c1de33d316cb2ab7ed5eac3c06c5"
+ integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@nomiclabs/hardhat-ethers@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
+ integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
+
+"@nomiclabs/hardhat-waffle@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2"
+ integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==
+ dependencies:
+ "@types/sinon-chai" "^3.2.3"
+ "@types/web3" "1.0.19"
+
+"@resolver-engine/core@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967"
+ integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==
+ dependencies:
+ debug "^3.1.0"
+ is-url "^1.2.4"
+ request "^2.85.0"
+
+"@resolver-engine/fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973"
+ integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports-fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b"
+ integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==
+ dependencies:
+ "@resolver-engine/fs" "^0.3.3"
+ "@resolver-engine/imports" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc"
+ integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+ hosted-git-info "^2.6.0"
+ path-browserify "^1.0.0"
+ url "^0.11.0"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/hub" "5.30.0"
+ "@sentry/tracing" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^7.1.0":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@solidity-parser/parser@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add"
+ integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@typechain/ethers-v5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810"
+ integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==
+ dependencies:
+ ethers "^5.0.2"
+
+"@types/abstract-leveldown@*":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e"
+ integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ==
+
+"@types/bn.js@*", "@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai@*":
+ version "4.2.19"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.19.tgz#80f286b515897413c7a35bdda069cc80f2344233"
+ integrity sha512-jRJgpRBuY+7izT7/WNXP/LsMO9YonsstuL+xuvycDyESpoDoIAsMd7suwpB4h9oEWB+ZlPTqJJ8EHomzNhwTPQ==
+
+"@types/levelup@^4.3.0":
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.1.tgz#7a53b9fd510716e11b2065332790fdf5f9b950b9"
+ integrity sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A==
+ dependencies:
+ "@types/abstract-leveldown" "*"
+ "@types/node" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03"
+ integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==
+
+"@types/mkdirp@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+ integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node-fetch@^2.5.5":
+ version "2.5.10"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132"
+ integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "15.12.4"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26"
+ integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==
+
+"@types/node@^12.12.6":
+ version "12.20.15"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.15.tgz#10ee6a6a3f971966fddfa3f6e89ef7a73ec622df"
+ integrity sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.0.tgz#2e8332cc7363f887d32ec5496b207d26ba8052bb"
+ integrity sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==
+
+"@types/resolve@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d"
+ integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==
+ dependencies:
+ "@types/node" "*"
+
+"@types/sinon-chai@^3.2.3":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48"
+ integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*":
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4"
+ integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==
+ dependencies:
+ "@sinonjs/fake-timers" "^7.1.0"
+
+"@types/underscore@*":
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.2.tgz#9441e0f6402bbcb72dbee771582fa57c5a1dedd3"
+ integrity sha512-Ls2ylbo7++ITrWk2Yc3G/jijwSq5V3GT0tlgVXEl2kKYXY3ImrtmTCoE2uyTWFRI5owMBriloZFWbE1SXOsE7w==
+
+"@types/web3@1.0.19":
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924"
+ integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==
+ dependencies:
+ "@types/bn.js" "*"
+ "@types/underscore" "*"
+
+"@ungap/promise-all-settled@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
+ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
+
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
+ integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
+ integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
+ integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
+ansi-colors@4.1.1, ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.1, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
+ integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
+ dependencies:
+ typical "^2.6.0"
+
+array-back@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022"
+ integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
+ dependencies:
+ typical "^2.6.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-eventemitter@^0.2.2, async-eventemitter@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
+ integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+ dependencies:
+ lodash "^4.17.11"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.14, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ 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"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
+ dependencies:
+ 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@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+ integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+ integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+ integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
+ dependencies:
+ 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@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
+ dependencies:
+ 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@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
+ dependencies:
+ 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@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ 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@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ 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@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babelify@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+ integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ 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"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bip39@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
+ integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
+ dependencies:
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ unorm "^1.3.3"
+
+blakejs@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+ integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+bluebird@^3.5.0, bluebird@^3.5.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer-xor@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289"
+ integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+bytewise-core@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
+ integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+ dependencies:
+ typewise-core "^1.2"
+
+bytewise@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e"
+ integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
+ dependencies:
+ bytewise-core "^1.2.2"
+ typewise "^1.0.3"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ 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"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+cachedown@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15"
+ integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+ dependencies:
+ abstract-leveldown "^2.4.1"
+ lru-cache "^3.2.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30001239"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz#66e8669985bb2cb84ccb10f68c25ce6dd3e4d2b8"
+ integrity sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chai@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
+ integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.1"
+ type-detect "^4.0.5"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
+chokidar@3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
+chokidar@^3.4.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@2.1.2, clone@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46"
+ integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
+ dependencies:
+ array-back "^2.0.0"
+ find-replace "^1.0.3"
+ typical "^2.6.1"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.5.1:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-pure@^3.0.1:
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.1.tgz#8356f6576fa2aa8e54ca6fe02620968ff010eed7"
+ integrity sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+crc-32@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+ integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
+ dependencies:
+ exit-on-epipe "~1.0.1"
+ printj "~1.1.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@4, debug@4.3.1, debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
+ integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ inherits "^2.0.3"
+
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotignore@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
+ integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
+ dependencies:
+ minimatch "^3.0.4"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.47:
+ version "1.3.756"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.756.tgz#942cee59cd64d19f576d8d5804eef09cb423740c"
+ integrity sha512-WsmJym1TMeHVndjPjczTFbnRR/c4sbzg8fBFtuhlb2Sru3i/S1VGpzDSrv/It8ctMU2bj8G7g7/O3FzYMGw6eA==
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@5.0.4, encoding-down@~5.0.0:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614"
+ integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
+ dependencies:
+ abstract-leveldown "^5.0.0"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+ xtend "^4.0.1"
+
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
+encoding@^0.1.11:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enquirer@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
+ integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
+ dependencies:
+ 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-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f"
+ integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==
+ dependencies:
+ cross-fetch "^2.1.1"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
+ integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==
+ dependencies:
+ 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"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-sig-util@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e"
+ integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==
+ dependencies:
+ 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-sig-util@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
+ integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
+ dependencies:
+ ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
+ ethereumjs-util "^5.1.1"
+
+eth-sig-util@^2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5"
+ integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==
+ dependencies:
+ ethereumjs-abi "0.6.8"
+ ethereumjs-util "^5.1.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.0"
+
+eth-tx-summary@^3.1.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
+ integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
+ dependencies:
+ 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"
+
+ethashjs@~0.0.7:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9"
+ integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==
+ dependencies:
+ async "^2.1.2"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.2"
+ miller-rabin "^4.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-waffle@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720"
+ integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ==
+ dependencies:
+ "@ethereum-waffle/chai" "^3.4.0"
+ "@ethereum-waffle/compiler" "^3.4.0"
+ "@ethereum-waffle/mock-contract" "^3.3.0"
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.1"
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.8"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9"
+ integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
+ dependencies:
+ ethereumjs-util "^6.0.0"
+ rlp "^2.2.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-blockchain@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f"
+ integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==
+ dependencies:
+ async "^2.6.1"
+ ethashjs "~0.0.7"
+ ethereumjs-block "~2.2.2"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.1.0"
+ flow-stoplight "^1.0.0"
+ level-mem "^3.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.2"
+ semaphore "^1.1.0"
+
+ethereumjs-common@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd"
+ integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==
+
+ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
+ integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
+
+ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0"
+ integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7:
+ version "7.0.10"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
+ integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab"
+ integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.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"
+ util.promisify "^1.0.0"
+
+ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
+ integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474"
+ integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^6.0.0"
+ randombytes "^2.0.6"
+ safe-buffer "^5.1.2"
+ scryptsy "^1.2.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.0.tgz#76558a3020766f310a49f4e1a4c6c1e331761abd"
+ integrity sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==
+ dependencies:
+ "@ethersproject/abi" "^5.0.0"
+ "@ethersproject/abstract-provider" "^5.0.0"
+ "@ethersproject/abstract-signer" "^5.0.0"
+ "@ethersproject/address" "^5.0.0"
+ "@ethersproject/base64" "^5.0.0"
+ "@ethersproject/bignumber" "^5.0.0"
+ "@ethersproject/bytes" "^5.0.0"
+ "@ethersproject/constants" "^5.0.0"
+ "@ethersproject/contracts" "^5.0.0"
+ "@ethersproject/hash" "^5.0.0"
+ "@ethersproject/hdnode" "^5.0.0"
+ "@ethersproject/json-wallets" "^5.0.0"
+ "@ethersproject/keccak256" "^5.0.0"
+ "@ethersproject/logger" "^5.0.0"
+ "@ethersproject/networks" "^5.0.0"
+ "@ethersproject/pbkdf2" "^5.0.0"
+ "@ethersproject/properties" "^5.0.0"
+ "@ethersproject/providers" "^5.0.0"
+ "@ethersproject/random" "^5.0.0"
+ "@ethersproject/rlp" "^5.0.0"
+ "@ethersproject/sha2" "^5.0.0"
+ "@ethersproject/signing-key" "^5.0.0"
+ "@ethersproject/solidity" "^5.0.0"
+ "@ethersproject/strings" "^5.0.0"
+ "@ethersproject/transactions" "^5.0.0"
+ "@ethersproject/units" "^5.0.0"
+ "@ethersproject/wallet" "^5.0.0"
+ "@ethersproject/web" "^5.0.0"
+ "@ethersproject/wordlists" "^5.0.0"
+
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.0.31, ethers@^5.1.4:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.1.tgz#1f018f0aeb651576cd84fd987a45f0b99646d761"
+ integrity sha512-xCKmC0gsZ9gks89ZfK3B1y6LlPdvX5fxDtu9SytnpdDJR1M7pmJI+4H0AxQPMgUYr7GtQdmECLR0gWdJQ+lZYw==
+ dependencies:
+ "@ethersproject/abi" "5.3.1"
+ "@ethersproject/abstract-provider" "5.3.0"
+ "@ethersproject/abstract-signer" "5.3.0"
+ "@ethersproject/address" "5.3.0"
+ "@ethersproject/base64" "5.3.0"
+ "@ethersproject/basex" "5.3.0"
+ "@ethersproject/bignumber" "5.3.0"
+ "@ethersproject/bytes" "5.3.0"
+ "@ethersproject/constants" "5.3.0"
+ "@ethersproject/contracts" "5.3.0"
+ "@ethersproject/hash" "5.3.0"
+ "@ethersproject/hdnode" "5.3.0"
+ "@ethersproject/json-wallets" "5.3.0"
+ "@ethersproject/keccak256" "5.3.0"
+ "@ethersproject/logger" "5.3.0"
+ "@ethersproject/networks" "5.3.1"
+ "@ethersproject/pbkdf2" "5.3.0"
+ "@ethersproject/properties" "5.3.0"
+ "@ethersproject/providers" "5.3.1"
+ "@ethersproject/random" "5.3.0"
+ "@ethersproject/rlp" "5.3.0"
+ "@ethersproject/sha2" "5.3.0"
+ "@ethersproject/signing-key" "5.3.0"
+ "@ethersproject/solidity" "5.3.0"
+ "@ethersproject/strings" "5.3.0"
+ "@ethersproject/transactions" "5.3.0"
+ "@ethersproject/units" "5.3.0"
+ "@ethersproject/wallet" "5.3.0"
+ "@ethersproject/web" "5.3.0"
+ "@ethersproject/wordlists" "5.3.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exit-on-epipe@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+ integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ 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"
+
+express@^4.14.0:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ 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"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-replace@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
+ integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+flow-stoplight@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
+ integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+
+follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3, for-each@~0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2, fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fsevents@~2.3.1, fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1, function-bind@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+ganache-core@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3"
+ integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==
+ dependencies:
+ abstract-leveldown "3.0.0"
+ async "2.6.2"
+ bip39 "2.5.0"
+ cachedown "1.0.0"
+ clone "2.1.2"
+ debug "3.2.6"
+ encoding-down "5.0.4"
+ eth-sig-util "3.0.0"
+ ethereumjs-abi "0.6.8"
+ ethereumjs-account "3.0.0"
+ ethereumjs-block "2.2.2"
+ ethereumjs-common "1.5.0"
+ ethereumjs-tx "2.1.2"
+ ethereumjs-util "6.2.1"
+ ethereumjs-vm "4.2.0"
+ heap "0.2.6"
+ keccak "3.0.1"
+ level-sublevel "6.6.4"
+ levelup "3.1.1"
+ lodash "4.17.20"
+ lru-cache "5.1.1"
+ merkle-patricia-tree "3.0.0"
+ patch-package "6.2.2"
+ seedrandom "3.0.1"
+ source-map-support "0.5.12"
+ tmp "0.1.0"
+ web3-provider-engine "14.2.1"
+ websocket "1.0.32"
+ optionalDependencies:
+ ethereumjs-wallet "0.6.5"
+ web3 "1.2.11"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@~5.1.0, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ 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@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ 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@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hardhat@^2.2.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.4.1.tgz#2cd1e86ee6ca3a6a473eeb0f55bd3124c8c59250"
+ integrity sha512-vwllrFypukeE/Q+4ZfWj7j7nUo4ncUhRpsAYUM0Ruuuk6pQlKmRa0A6c0kxRSvvVgQsMud6j+/weYhbMX1wPmQ==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/blockchain" "^5.3.0"
+ "@ethereumjs/common" "^2.3.1"
+ "@ethereumjs/tx" "^3.2.1"
+ "@ethereumjs/vm" "^5.3.2"
+ "@ethersproject/abi" "^5.1.2"
+ "@sentry/node" "^5.18.1"
+ "@solidity-parser/parser" "^0.11.0"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ abort-controller "^3.0.0"
+ adm-zip "^0.4.16"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ eth-sig-util "^2.5.2"
+ ethereum-cryptography "^0.1.2"
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^7.0.10"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "^7.1.3"
+ https-proxy-agent "^5.0.0"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ lodash "^4.17.11"
+ merkle-patricia-tree "^4.2.0"
+ mnemonist "^0.38.0"
+ mocha "^7.1.2"
+ node-fetch "^2.6.0"
+ qs "^6.7.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ slash "^3.0.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ "true-case-path" "^2.2.1"
+ tsort "0.0.1"
+ uuid "^3.3.2"
+ ws "^7.4.6"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3, has@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+immutable@^4.0.0-rc.12:
+ version "4.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
+ integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-regex@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+ integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+ dependencies:
+ has "^1.0.3"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
+ integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
+ dependencies:
+ argparse "^2.0.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9"
+ integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
+ dependencies:
+ 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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
+ integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
+ dependencies:
+ inherits "^2.0.1"
+
+json-rpc-random-id@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+ integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@3.0.1, keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
+ integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
+ integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4"
+ integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.5"
+ xtend "^4.0.0"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
+ integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ xtend "^4.0.0"
+
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
+level-mem@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
+ integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
+ dependencies:
+ level-packager "~4.0.0"
+ memdown "~3.0.0"
+
+level-mem@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d"
+ integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==
+ dependencies:
+ level-packager "^5.0.3"
+ memdown "^5.0.0"
+
+level-packager@^5.0.3:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
+level-packager@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
+ integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
+ dependencies:
+ encoding-down "~5.0.0"
+ levelup "^3.0.0"
+
+level-post@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0"
+ integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
+ dependencies:
+ ltgt "^2.1.2"
+
+level-sublevel@6.6.4:
+ version "6.6.4"
+ resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba"
+ integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==
+ dependencies:
+ 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"
+
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level-ws@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b"
+ integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.8"
+ xtend "^4.0.1"
+
+level-ws@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339"
+ integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^3.1.0"
+ xtend "^4.0.1"
+
+levelup@3.1.1, levelup@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
+ integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
+ dependencies:
+ deferred-leveldown "~4.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~3.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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"
+
+levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash@4.17.20:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+log-symbols@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+looper@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
+ integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
+
+looper@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749"
+ integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@5.1.1, lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+ integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
+ dependencies:
+ pseudomap "^1.0.1"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
+ltgt@^2.1.2, ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+ltgt@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
+ integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+mcl-wasm@^0.7.1:
+ version "0.7.8"
+ resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.8.tgz#4d0dc5a92f7bd20892fd3fcd41764acf86fd1e6e"
+ integrity sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw==
+ dependencies:
+ typescript "^4.3.4"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memdown@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb"
+ integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.2.0"
+
+memdown@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
+ integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.1.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merkle-patricia-tree@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8"
+ integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==
+ dependencies:
+ async "^2.6.1"
+ ethereumjs-util "^5.2.0"
+ level-mem "^3.0.1"
+ level-ws "^1.0.0"
+ readable-stream "^3.0.6"
+ rlp "^2.0.0"
+ semaphore ">=1.0.1"
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
+ integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
+ dependencies:
+ 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"
+
+merkle-patricia-tree@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1"
+ integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ level-ws "^2.0.0"
+ readable-stream "^3.6.0"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mnemonist@^0.38.0:
+ version "0.38.3"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d"
+ integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==
+ dependencies:
+ obliterator "^1.6.1"
+
+mocha@^7.1.2:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+ dependencies:
+ ansi-colors "3.2.3"
+ browser-stdout "1.3.1"
+ chokidar "3.3.0"
+ debug "3.2.6"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ find-up "3.0.0"
+ glob "7.1.3"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ mkdirp "0.5.5"
+ ms "2.1.1"
+ node-environment-flags "1.0.6"
+ object.assign "4.1.0"
+ strip-json-comments "2.0.1"
+ supports-color "6.0.0"
+ which "1.3.1"
+ wide-align "1.1.3"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
+mocha@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
+ integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+ dependencies:
+ "@ungap/promise-all-settled" "1.1.2"
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.5.1"
+ debug "4.3.1"
+ diff "5.0.0"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "4.0.0"
+ log-symbols "4.0.0"
+ minimatch "3.0.4"
+ ms "2.1.3"
+ nanoid "3.1.20"
+ serialize-javascript "5.0.1"
+ strip-json-comments "3.1.1"
+ supports-color "8.1.1"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.1.0"
+ yargs "16.2.0"
+ yargs-parser "20.2.4"
+ yargs-unparser "2.0.0"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanoid@3.1.20:
+ version "3.1.20"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
+ integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ 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"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
+ dependencies:
+ object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-inspect@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+obliterator@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3"
+ integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==
+
+oboe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
+ integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+patch-package@6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+patch-package@^6.2.2:
+ version "6.4.7"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
+ integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+path-browserify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.1.2:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6"
+ integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==
+
+printj@~1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+ integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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@^1.1.9:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b"
+ integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
+
+pull-defer@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113"
+ integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
+
+pull-level@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac"
+ integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==
+ dependencies:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5"
+ integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
+ dependencies:
+ pull-cat "^1.1.9"
+ pull-stream "^3.4.0"
+
+pull-pushable@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
+ integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
+
+pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
+ version "3.6.14"
+ resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee"
+ integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
+
+pull-window@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0"
+ integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
+ dependencies:
+ looper "^2.0.0"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.7.0:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerate@^1.2.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+ integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
+
+require-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@1.17.0, resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.10.0, resolve@^1.8.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+resumer@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+ integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
+ dependencies:
+ through "~2.3.4"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.2.8, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+scryptsy@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
+ integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
+ dependencies:
+ pbkdf2 "^3.0.3"
+
+secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
+ integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+
+semaphore-async-await@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa"
+ integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=
+
+semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+serialize-javascript@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ 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"
+
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@^0.4.20:
+ version "0.4.26"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5"
+ integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
+
+solc@^0.6.3:
+ version "0.6.12"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e"
+ integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.12:
+ version "0.5.12"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
+ integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.13:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-to-pull-stream@^1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece"
+ integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
+ dependencies:
+ looper "^3.0.0"
+ pull-stream "^3.2.3"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trim@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
+ integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+strip-json-comments@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
+ integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tape@^4.6.3:
+ version "4.13.3"
+ resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278"
+ integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==
+ dependencies:
+ deep-equal "~1.1.1"
+ defined "~1.0.0"
+ dotignore "~0.1.2"
+ for-each "~0.3.3"
+ function-bind "~1.1.1"
+ glob "~7.1.6"
+ has "~1.0.3"
+ inherits "~2.0.4"
+ is-regex "~1.0.5"
+ minimist "~1.2.5"
+ object-inspect "~1.7.0"
+ resolve "~1.17.0"
+ resumer "~0.0.0"
+ string.prototype.trim "~1.2.1"
+ through "~2.3.8"
+
+tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
+ integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+testrpc@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed"
+ integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==
+
+through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@~2.3.4, through@~2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+"true-case-path@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf"
+ integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==
+
+ts-essentials@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
+ integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
+
+ts-essentials@^6.0.3:
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6"
+ integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
+
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
+ dependencies:
+ "@types/mkdirp" "^0.5.2"
+ "@types/prettier" "^2.1.1"
+ "@types/resolve" "^0.0.8"
+ chalk "^2.4.1"
+ glob "^7.1.2"
+ mkdirp "^0.5.1"
+ prettier "^2.1.2"
+ resolve "^1.8.1"
+ ts-essentials "^1.0.0"
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.0:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+tweetnacl@^1.0.0, tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typechain@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e"
+ integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==
+ dependencies:
+ command-line-args "^4.0.7"
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ ts-essentials "^6.0.3"
+ ts-generator "^0.1.1"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typescript@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc"
+ integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==
+
+typewise-core@^1.2, typewise-core@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
+ integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+
+typewise@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651"
+ integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+ dependencies:
+ typewise-core "^1.2.0"
+
+typewiselite@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e"
+ integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+
+typical@^2.6.0, typical@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
+ integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+underscore@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unorm@^1.3.3:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0, util.promisify@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f"
+ integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.9.1"
+
+web3-core-helpers@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99"
+ integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==
+ dependencies:
+ underscore "1.9.1"
+ web3-eth-iban "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-method@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6"
+ integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-promievent@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf"
+ integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a"
+ integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==
+ dependencies:
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-providers-http "1.2.11"
+ web3-providers-ipc "1.2.11"
+ web3-providers-ws "1.2.11"
+
+web3-core-subscriptions@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd"
+ integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-core@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7"
+ integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-requestmanager "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-abi@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0"
+ integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==
+ dependencies:
+ "@ethersproject/abi" "5.0.0-beta.153"
+ underscore "1.9.1"
+ web3-utils "1.2.11"
+
+web3-eth-accounts@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520"
+ integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.9.1"
+ uuid "3.3.2"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-contract@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90"
+ integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-ens@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532"
+ integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-iban@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef"
+ integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.2.11"
+
+web3-eth-personal@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70"
+ integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793"
+ integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==
+ dependencies:
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-accounts "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-eth-ens "1.2.11"
+ web3-eth-iban "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-net@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b"
+ integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-provider-engine@14.2.1:
+ version "14.2.1"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95"
+ integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==
+ dependencies:
+ 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"
+
+web3-providers-http@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6"
+ integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==
+ dependencies:
+ web3-core-helpers "1.2.11"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21"
+ integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==
+ dependencies:
+ oboe "2.1.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-providers-ws@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb"
+ integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ websocket "^1.0.31"
+
+web3-shh@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f"
+ integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-net "1.2.11"
+
+web3-utils@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82"
+ integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@^1.0.0-beta.31:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10"
+ integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975"
+ integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==
+ dependencies:
+ web3-bzz "1.2.11"
+ web3-core "1.2.11"
+ web3-eth "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-shh "1.2.11"
+ web3-utils "1.2.11"
+
+websocket@1.0.32:
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+websocket@^1.0.31:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1.3.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+workerpool@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
+ integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
+ integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^7.4.6:
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691"
+ integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@20.2.4:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
+
+yargs-unparser@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yargs@^4.7.1:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+ integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA=
+ dependencies:
+ 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"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/examples/truffle/.gitignore b/examples/truffle/.gitignore
new file mode 100644
index 000000000000..9f9cc50acd92
--- /dev/null
+++ b/examples/truffle/.gitignore
@@ -0,0 +1,112 @@
+# Project specific
+build
+build-ovm
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# Next.js build output
+.next
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and *not* Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+.DS_Store
+
+build/
diff --git a/packages/hardhat-ovm/LICENSE.txt b/examples/truffle/LICENSE
similarity index 97%
rename from packages/hardhat-ovm/LICENSE.txt
rename to examples/truffle/LICENSE
index db5c80bc4af3..6a7da5218bb2 100644
--- a/packages/hardhat-ovm/LICENSE.txt
+++ b/examples/truffle/LICENSE
@@ -1,6 +1,6 @@
(The MIT License)
-Copyright 2020 Optimism
+Copyright 2020-2021 Optimism
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/examples/truffle/README.md b/examples/truffle/README.md
new file mode 100644
index 000000000000..456b09acb3a6
--- /dev/null
+++ b/examples/truffle/README.md
@@ -0,0 +1,3 @@
+# Getting Started with Optimistic Ethereum: Simple ERC20 Token Truffle Tutorial
+
+### For the full README, please see the [guided repository, `Truffle-ER20-Example`](https://github.com/ethereum-optimism/Truffle-ERC20-Example)
\ No newline at end of file
diff --git a/examples/truffle/contracts/ERC20.sol b/examples/truffle/contracts/ERC20.sol
new file mode 100644
index 000000000000..dca01f264b98
--- /dev/null
+++ b/examples/truffle/contracts/ERC20.sol
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: MIT LICENSE
+/* Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md */
+pragma solidity ^0.7.6;
+
+import "./IERC20.sol";
+
+contract ERC20 is IERC20 {
+ uint256 private constant MAX_UINT256 = 2**256 - 1;
+ mapping(address => uint256) public balances;
+ mapping(address => mapping(address => uint256)) public allowed;
+ /*
+ NOTE:
+ The following variables are OPTIONAL vanities. One does not have to include them.
+ They allow one to customise the token contract & in no way influences the core functionality.
+ Some wallets/interfaces might not even bother to look at this information.
+ */
+ string public name;
+ uint8 public decimals;
+ string public symbol;
+ uint256 public totalSupply;
+
+ constructor(
+ uint256 _initialAmount,
+ string memory _tokenName,
+ uint8 _decimalUnits,
+ string memory _tokenSymbol
+ ) {
+ balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
+ totalSupply = _initialAmount; // Update total supply
+ name = _tokenName; // Set the name for display purposes
+ decimals = _decimalUnits; // Amount of decimals for display purposes
+ symbol = _tokenSymbol; // Set the symbol for display purposes
+ }
+
+ function transfer(address _to, uint256 _value)
+ public
+ override
+ returns (bool success)
+ {
+ require(balances[msg.sender] >= _value);
+ balances[msg.sender] -= _value;
+ balances[_to] += _value;
+ emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
+ return true;
+ }
+
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _value
+ ) public override returns (bool success) {
+ uint256 allowance_ = allowed[_from][msg.sender];
+ require(balances[_from] >= _value && allowance_ >= _value);
+ balances[_to] += _value;
+ balances[_from] -= _value;
+ if (allowance_ < MAX_UINT256) {
+ allowed[_from][msg.sender] -= _value;
+ }
+ emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
+ return true;
+ }
+
+ function balanceOf(address _owner)
+ public
+ view
+ override
+ returns (uint256 balance)
+ {
+ return balances[_owner];
+ }
+
+ function approve(address _spender, uint256 _value)
+ public
+ override
+ returns (bool success)
+ {
+ allowed[msg.sender][_spender] = _value;
+ emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
+ return true;
+ }
+
+ function allowance(address _owner, address _spender)
+ public
+ view
+ override
+ returns (uint256 remaining)
+ {
+ return allowed[_owner][_spender];
+ }
+}
diff --git a/examples/truffle/contracts/IERC20.sol b/examples/truffle/contracts/IERC20.sol
new file mode 100644
index 000000000000..111d6ebe2fa2
--- /dev/null
+++ b/examples/truffle/contracts/IERC20.sol
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: MIT LICENSE
+// Abstract contract for the full ERC20 Token standard
+// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
+pragma solidity ^0.7.6;
+
+interface IERC20 {
+ /// @param _owner The address from which the balance will be retrieved
+ /// @return balance The balance
+ function balanceOf(address _owner) external view returns (uint256 balance);
+
+ /// @notice send `_value` token to `_to` from `msg.sender`
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return success Whether the transfer was successful or not
+ function transfer(address _to, uint256 _value)
+ external
+ returns (bool success);
+
+ /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
+ /// @param _from The address of the sender
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return success Whether the transfer was successful or not
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _value
+ ) external returns (bool success);
+
+ /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @param _value The amount of tokens to be approved for transfer
+ /// @return success Whether the approval was successful or not
+ function approve(address _spender, uint256 _value)
+ external
+ returns (bool success);
+
+ /// @param _owner The address of the account owning tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @return remaining Amount of remaining tokens allowed to spent
+ function allowance(address _owner, address _spender)
+ external
+ view
+ returns (uint256 remaining);
+
+ // solhint-disable-next-line no-simple-event-func-name
+ event Transfer(address indexed _from, address indexed _to, uint256 _value);
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+}
diff --git a/examples/truffle/migrations/1_deploy_ERC20_contract.js b/examples/truffle/migrations/1_deploy_ERC20_contract.js
new file mode 100644
index 000000000000..346ebcab9346
--- /dev/null
+++ b/examples/truffle/migrations/1_deploy_ERC20_contract.js
@@ -0,0 +1,17 @@
+const ERC20 = artifacts.require('ERC20')
+
+module.exports = function (deployer, accounts) {
+ const tokenName = 'My Optimistic Coin'
+ const tokenSymbol = 'OPT'
+ const tokenDecimals = 1
+
+ // deployment steps
+ deployer.deploy(
+ ERC20,
+ 10000,
+ tokenName,
+ tokenDecimals,
+ tokenSymbol,
+ { gasPrice: 0 }
+ )
+}
diff --git a/examples/truffle/package.json b/examples/truffle/package.json
new file mode 100644
index 000000000000..4579a04e9e47
--- /dev/null
+++ b/examples/truffle/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "@ethereum-optimism/Truffle-ERC20-Example",
+ "private": true,
+ "version": "1.0.0-alpha.1",
+ "description": "Example of using Optimistic Ethereum compiler & local Optimistic Ethereum nodes with Truffle to run a full ERC20 test suite",
+ "scripts": {
+ "clean": "rimraf build build-ovm",
+ "compile": "truffle compile",
+ "compile:ovm": "truffle compile --config truffle-config-ovm.js",
+ "test:integration": "truffle test",
+ "test:integration:ovm": "truffle test --network optimism --config truffle-config-ovm.js",
+ "deploy": "truffle migrate --network ethereum --config truffle-config",
+ "deploy:ovm": "truffle migrate --network optimism --config truffle-config-ovm.js"
+ },
+ "keywords": [
+ "optimism",
+ "rollup",
+ "optimistic",
+ "ethereum",
+ "truffle",
+ "ovm",
+ "example",
+ "ERC20",
+ "token"
+ ],
+ "homepage": "https://github.com/ethereum-optimism/Truffle-ERC20-Example#readme",
+ "license": "MIT",
+ "author": "Optimism PBC",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ethereum-optimism/Truffle-ERC20-Example.git"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "dependencies": {
+ "@eth-optimism/solc": "0.7.6-alpha.1",
+ "rimraf": "^3.0.2",
+ "truffle": "^5.3.6",
+ "@truffle/hdwallet-provider": "^1.4.0"
+ }
+}
\ No newline at end of file
diff --git a/examples/truffle/test/erc20.spec.js b/examples/truffle/test/erc20.spec.js
new file mode 100644
index 000000000000..1258d0be7d4e
--- /dev/null
+++ b/examples/truffle/test/erc20.spec.js
@@ -0,0 +1,245 @@
+let token
+
+const ERC20 = artifacts.require('ERC20')
+
+contract('ERC20', (accounts) => {
+ const tokenName = 'My Optimistic Coin'
+ const tokenSymbol = 'OPT'
+ const tokenDecimals = 1
+
+ beforeEach(async () => {
+ token = await ERC20.new(10000, tokenName, tokenDecimals, tokenSymbol, { from: accounts[ 0 ], gasPrice: 0 })
+ })
+
+ it('creation: should create an initial balance of 10000 for the creator', async () => {
+ const balance = await token.balanceOf.call(accounts[ 0 ], {
+ gasPrice: 0
+ })
+ assert.strictEqual(balance.toNumber(), 10000)
+ })
+
+ it('creation: test correct setting of vanity information', async () => {
+ const name = await token.name.call()
+ assert.strictEqual(name, tokenName)
+
+ const decimals = await token.decimals.call()
+ assert.strictEqual(decimals.toNumber(), tokenDecimals)
+
+ const symbol = await token.symbol.call()
+ assert.strictEqual(symbol, tokenSymbol)
+ })
+
+ it('creation: should succeed in creating over 2^256 - 1 (max) tokens', async () => {
+ // 2^256 - 1
+ const token2 = await ERC20.new('115792089237316195423570985008687907853269984665640564039457584007913129639935', 'Simon Bucks', 1, 'SBX', { from: accounts[ 0 ], gasPrice: 0 })
+ const totalSupply = await token2.totalSupply()
+ assert.strictEqual(totalSupply.toString(), '115792089237316195423570985008687907853269984665640564039457584007913129639935')
+ })
+
+ // TRANSERS
+ // normal transfers without approvals
+ it('transfers: ether transfer should be reversed.', async () => {
+ const balanceBefore = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balanceBefore.toNumber(), 10000)
+
+ let threw = false
+ try {
+ await web3.eth.sendTransaction({ from: accounts[ 0 ], to: token.address, value: web3.utils.toWei('10', 'Ether'), gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+
+ const balanceAfter = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balanceAfter.toNumber(), 10000)
+ })
+
+ it('transfers: should transfer 10000 to accounts[1] with accounts[0] having 10000', async () => {
+ await token.transfer(accounts[ 1 ], 10000, { from: accounts[ 0 ], gasPrice: 0 })
+ const balance = await token.balanceOf.call(accounts[ 1 ])
+ assert.strictEqual(balance.toNumber(), 10000)
+ })
+
+ it('transfers: should fail when trying to transfer 10001 to accounts[1] with accounts[0] having 10000', async () => {
+ let threw = false
+ try {
+ await token.transfer.call(accounts[ 1 ], 10001, { from: accounts[ 0 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('transfers: should handle zero-transfers normally', async () => {
+ assert(await token.transfer.call(accounts[ 1 ], 0, { from: accounts[ 0 ], gasPrice: 0 }), 'zero-transfer has failed')
+ })
+
+ // NOTE: testing uint256 wrapping is impossible since you can't supply > 2^256 -1
+ // todo: transfer max amounts
+
+ // APPROVALS
+ it('approvals: msg.sender should approve 100 to accounts[1]', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance.toNumber(), 100)
+ })
+
+ // bit overkill. But is for testing a bug
+ it('approvals: msg.sender approves accounts[1] of 100 & withdraws 20 once.', async () => {
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 10000)
+
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) // 100
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 0, 'balance2 not correct')
+
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) // -20
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toNumber(), 80) // =80
+
+ const balance22 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance22.toNumber(), 20)
+
+ const balance02 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance02.toNumber(), 9980)
+ })
+
+ // should approve 100 of msg.sender & withdraw 50, twice. (should succeed)
+ it('approvals: msg.sender approves accounts[1] of 100 & withdraws 20 twice.', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toNumber(), 100)
+
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance012 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance012.toNumber(), 80)
+
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 20)
+
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 9980)
+
+ // FIRST tx done.
+ // onto next.
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance013 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance013.toNumber(), 60)
+
+ const balance22 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance22.toNumber(), 40)
+
+ const balance02 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance02.toNumber(), 9960)
+ })
+
+ // should approve 100 of msg.sender & withdraw 50 & 60 (should fail).
+ it('approvals: msg.sender approves accounts[1] of 100 & withdraws 50 & 60 (2nd tx should fail)', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toNumber(), 100)
+
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 50, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance012 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance012.toNumber(), 50)
+
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 50)
+
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 9950)
+
+ // FIRST tx done.
+ // onto next.
+ let threw = false
+ try {
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('approvals: attempt withdrawal from account with no allowance (should fail)', async () => {
+ let threw = false
+ try {
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('approvals: allow accounts[1] 100 to withdraw from accounts[0]. Withdraw 60 and then approve 0 & attempt transfer.', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 })
+ await token.approve(accounts[ 1 ], 0, { from: accounts[ 0 ], gasPrice: 0 })
+ let threw = false
+ try {
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 10, { from: accounts[ 1 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('approvals: approve max (2^256 - 1)', async () => {
+ await token.approve(accounts[ 1 ], '115792089237316195423570985008687907853269984665640564039457584007913129639935', { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance = await token.allowance(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance.toString(), '115792089237316195423570985008687907853269984665640564039457584007913129639935')
+ })
+
+ // should approve max of msg.sender & withdraw 20 without changing allowance (should succeed).
+ it('approvals: msg.sender approves accounts[1] of max (2^256 - 1) & withdraws 20', async () => {
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 10000)
+
+ const max = '115792089237316195423570985008687907853269984665640564039457584007913129639935'
+ await token.approve(accounts[ 1 ], max, { from: accounts[ 0 ], gasPrice: 0 })
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 0, 'balance2 not correct')
+
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toString(), max)
+
+ const balance22 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance22.toNumber(), 20)
+
+ const balance02 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance02.toNumber(), 9980)
+ })
+
+ it('events: should fire Transfer event properly', async () => {
+ const res = await token.transfer(accounts[ 1 ], '2666', { from: accounts[ 0 ], gasPrice: 0 })
+ const transferLog = res.logs.find(
+ element => element.event.match('Transfer') &&
+ element.address.match(token.address)
+ )
+ assert.strictEqual(transferLog.args._from, accounts[ 0 ])
+ // L2 ETH transfer also emits a transfer event
+ assert.strictEqual(transferLog.args._to, accounts[ 1 ])
+ assert.strictEqual(transferLog.args._value.toString(), '2666')
+ })
+
+ it('events: should fire Transfer event normally on a zero transfer', async () => {
+ const res = await token.transfer(accounts[ 1 ], '0', { from: accounts[ 0 ], gasPrice: 0 })
+ const transferLog = res.logs.find(
+ element => element.event.match('Transfer') &&
+ element.address.match(token.address)
+ )
+ assert.strictEqual(transferLog.args._from, accounts[ 0 ])
+ assert.strictEqual(transferLog.args._to, accounts[ 1 ])
+ assert.strictEqual(transferLog.args._value.toString(), '0')
+ })
+
+ it('events: should fire Approval event properly', async () => {
+ const res = await token.approve(accounts[ 1 ], '2666', { from: accounts[ 0 ], gasPrice: 0 })
+ const approvalLog = res.logs.find(element => element.event.match('Approval'))
+ assert.strictEqual(approvalLog.args._owner, accounts[ 0 ])
+ assert.strictEqual(approvalLog.args._spender, accounts[ 1 ])
+ assert.strictEqual(approvalLog.args._value.toString(), '2666')
+ })
+})
diff --git a/examples/truffle/truffle-config-ovm.js b/examples/truffle/truffle-config-ovm.js
new file mode 100644
index 000000000000..4b81421b11b2
--- /dev/null
+++ b/examples/truffle/truffle-config-ovm.js
@@ -0,0 +1,35 @@
+const mnemonicPhrase = "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat"
+const HDWalletProvider = require('@truffle/hdwallet-provider')
+
+module.exports = {
+ contracts_build_directory: './build-ovm',
+ networks: {
+ optimism: {
+ provider: function () {
+ return new HDWalletProvider({
+ mnemonic: {
+ phrase: mnemonicPhrase
+ },
+ providerOrUrl: 'http://127.0.0.1:8545'
+ })
+ },
+ network_id: 28,
+ host: '127.0.0.1',
+ port: 8545,
+ gasPrice: 0,
+ gas: 54180127,
+ }
+ },
+ compilers: {
+ solc: {
+ // Add path to the optimism solc fork
+ version: './node_modules/@eth-optimism/solc',
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 1
+ },
+ }
+ }
+ }
+}
diff --git a/examples/truffle/truffle-config.js b/examples/truffle/truffle-config.js
new file mode 100644
index 000000000000..06820670cb40
--- /dev/null
+++ b/examples/truffle/truffle-config.js
@@ -0,0 +1,17 @@
+module.exports = {
+ contracts_build_directory: './build',
+ networks: {
+ ethereum: {
+ network_id: 31337,
+ host: '127.0.0.1',
+ port: 9545,
+ gasPrice: 0,
+ },
+ },
+ // Configure your compilers
+ compilers: {
+ solc: {
+ version: "0.7.6", // Fetch exact version from solc-bin (default: truffle's version)
+ }
+ }
+}
diff --git a/examples/waffle/LICENSE b/examples/waffle/LICENSE
index de42dad73d28..6a7da5218bb2 100644
--- a/examples/waffle/LICENSE
+++ b/examples/waffle/LICENSE
@@ -1,21 +1,22 @@
-MIT License
+(The MIT License)
-Copyright (c) 2021 OptimismPBC
+Copyright 2020-2021 Optimism
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/examples/waffle/test/erc20.spec.js b/examples/waffle/test/erc20.spec.js
index 6d71783a3543..78469492111a 100644
--- a/examples/waffle/test/erc20.spec.js
+++ b/examples/waffle/test/erc20.spec.js
@@ -9,30 +9,26 @@ const { getArtifact } = require('./getArtifact')
use(solidity)
+const config = {
+ l2Url: process.env.L2_URL || 'http://127.0.0.1:8545',
+ l1Url: process.env.L1_URL || 'http://127.0.0.1:9545',
+ useL2: process.env.TARGET === 'OVM',
+ privateKey: process.env.PRIVATE_KEY || '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+}
+
describe('ERC20 smart contract', () => {
let ERC20,
- provider,
- wallet,
- walletTo,
- walletEmpty,
- walletAddress,
- walletToAddress,
- walletEmptyAddress
-
- const privateKey = ethers.Wallet.createRandom().privateKey
- const privateKeyEmpty = ethers.Wallet.createRandom().privateKey
- const useL2 = process.env.TARGET === 'OVM'
-
- if (useL2 == true) {
- provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545')
+ provider
+
+ if (config.useL2) {
+ provider = new ethers.providers.JsonRpcProvider(config.l2Url)
provider.pollingInterval = 100
provider.getGasPrice = async () => ethers.BigNumber.from(0)
} else {
- provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9545')
+ provider = new ethers.providers.JsonRpcProvider(config.l1Url)
}
- walletTo = new ethers.Wallet(privateKey, provider)
- walletEmpty = new ethers.Wallet(privateKeyEmpty, provider)
+ const wallet = new ethers.Wallet(config.privateKey).connect(provider)
// parameters to use for our test coin
const COIN_NAME = 'OVM Test Coin'
@@ -41,12 +37,7 @@ describe('ERC20 smart contract', () => {
describe('when using a deployed contract instance', () => {
before(async () => {
- wallet = await provider.getSigner(0)
- walletAddress = await wallet.getAddress()
- walletToAddress = await walletTo.getAddress()
- walletEmptyAddress = await walletEmpty.getAddress()
-
- const Artifact__ERC20 = getArtifact(useL2)
+ const Artifact__ERC20 = getArtifact(config.useL2)
const Factory__ERC20 = new ethers.ContractFactory(
Artifact__ERC20.abi,
Artifact__ERC20.bytecode,
@@ -64,7 +55,8 @@ describe('ERC20 smart contract', () => {
})
it('should assigns initial balance', async () => {
- expect(await ERC20.balanceOf(walletAddress)).to.equal(1000)
+ const address = await wallet.getAddress()
+ expect(await ERC20.balanceOf(address)).to.equal(1000)
})
it('should correctly set vanity information', async () => {
@@ -79,29 +71,35 @@ describe('ERC20 smart contract', () => {
})
it('should transfer amount to destination account', async () => {
- const tx = await ERC20.connect(wallet).transfer(walletToAddress, 7)
+ const freshWallet = ethers.Wallet.createRandom()
+ const destination = await freshWallet.getAddress()
+ const tx = await ERC20.connect(wallet).transfer(destination, 7)
await tx.wait()
- const walletToBalance = await ERC20.balanceOf(walletToAddress)
+ const walletToBalance = await ERC20.balanceOf(destination)
expect(walletToBalance.toString()).to.equal('7')
})
it('should emit Transfer event', async () => {
- const tx = ERC20.connect(wallet).transfer(walletToAddress, 7)
+ const address = await wallet.getAddress()
+ const tx = ERC20.connect(wallet).transfer(address, 7)
await expect(tx)
.to.emit(ERC20, 'Transfer')
- .withArgs(walletAddress, walletToAddress, 7)
+ .withArgs(address, address, 7)
})
it('should not transfer above the amount', async () => {
- const walletToBalanceBefore = await ERC20.balanceOf(walletToAddress)
- await expect(ERC20.transfer(walletToAddress, 1007)).to.be.reverted
- const walletToBalanceAfter = await ERC20.balanceOf(walletToAddress)
+ const address = await wallet.getAddress()
+ const walletToBalanceBefore = await ERC20.balanceOf(address)
+ await expect(ERC20.transfer(address, 1007)).to.be.reverted
+ const walletToBalanceAfter = await ERC20.balanceOf(address)
expect(walletToBalanceBefore).to.eq(walletToBalanceAfter)
})
it('should not transfer from empty account', async () => {
- const ERC20FromOtherWallet = ERC20.connect(walletEmpty)
- await expect(ERC20FromOtherWallet.transfer(walletEmptyAddress, 1)).to.be
+ const emptyWallet = ethers.Wallet.createRandom()
+ const address = await emptyWallet.getAddress()
+ const ERC20FromOtherWallet = ERC20.connect(emptyWallet)
+ await expect(ERC20FromOtherWallet.transfer(address, 1)).to.be
.reverted
})
})
diff --git a/examples/waffle/waffle-ovm.json b/examples/waffle/waffle-ovm.json
index 859837e1e04f..ff5dd2cb9893 100644
--- a/examples/waffle/waffle-ovm.json
+++ b/examples/waffle/waffle-ovm.json
@@ -1,5 +1,5 @@
{
- "compilerVersion": "./../../node_modules/@eth-optimism/solc",
+ "compilerVersion": "./node_modules/@eth-optimism/solc",
"sourceDirectory": "./contracts",
"outputDirectory": "./build-ovm"
}
\ No newline at end of file
diff --git a/examples/waffle/waffle.json b/examples/waffle/waffle.json
index 9703deb0c8f7..b8bb19420f45 100644
--- a/examples/waffle/waffle.json
+++ b/examples/waffle/waffle.json
@@ -1,5 +1,5 @@
{
- "compilerVersion": "./../../node_modules/solc",
+ "compilerVersion": "./node_modules/solc",
"sourceDirectory": "./contracts",
"outputDirectory": "./build"
-}
+}
\ No newline at end of file
diff --git a/go/gas-oracle/.gitignore b/go/gas-oracle/.gitignore
new file mode 100644
index 000000000000..af79c9887461
--- /dev/null
+++ b/go/gas-oracle/.gitignore
@@ -0,0 +1 @@
+gas-oracle
diff --git a/go/gas-oracle/CHANGELOG.md b/go/gas-oracle/CHANGELOG.md
new file mode 100644
index 000000000000..7cca22c2a233
--- /dev/null
+++ b/go/gas-oracle/CHANGELOG.md
@@ -0,0 +1,6 @@
+# @eth-optimism/gas-oracle
+
+## 0.0.2
+### Patch Changes
+
+- ce3c353b: Initial implementation of the `gas-oracle`
diff --git a/go/gas-oracle/Makefile b/go/gas-oracle/Makefile
new file mode 100644
index 000000000000..6512d4dc6351
--- /dev/null
+++ b/go/gas-oracle/Makefile
@@ -0,0 +1,38 @@
+SHELL := /bin/bash
+
+GITCOMMIT := $(shell git rev-parse HEAD)
+GITDATE := $(shell git show -s --format='%ct')
+GITVERSION := $(shell cat package.json | jq .version)
+
+LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
+LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
+LDFLAGSSTRING +=-X main.GitVersion=$(GITVERSION)
+LDFLAGS :=-ldflags "$(LDFLAGSSTRING)"
+
+gas-oracle:
+ env GO111MODULE=on go build $(LDFLAGS)
+
+clean:
+ rm gas-oracle
+
+test:
+ go test -v ./...
+
+lint:
+ golangci-lint run ./...
+
+binding:
+ $(eval temp := $(shell mktemp))
+
+ cat abis/OVM_GasPriceOracle.json \
+ | jq -r .bin > $(temp)
+
+ cat abis/OVM_GasPriceOracle.json \
+ | jq .abi \
+ | abigen --pkg bindings \
+ --abi - \
+ --out bindings/gaspriceoracle.go \
+ --type GasPriceOracle \
+ --bin $(temp)
+
+ rm $(temp)
diff --git a/go/gas-oracle/README.md b/go/gas-oracle/README.md
new file mode 100644
index 000000000000..6720f5beced4
--- /dev/null
+++ b/go/gas-oracle/README.md
@@ -0,0 +1,89 @@
+# gas-oracle
+
+This service is responsible for sending transactions to the Sequencer to update
+the L2 gas price over time. It consists of a set of functions found in the
+`gasprices` package that define the parameters of how the gas prices are updated
+and then the `oracle` package is responsible for observing the Sequencer over
+time and send transactions that actually do update the gas prices.
+
+### Generating the Bindings
+
+Note: this only needs to happen if the ABI of the `OVM_GasPriceOracle` is
+updated.
+
+This project uses `abigen` to automatically create smart contract bindings in
+Go. To generate the bindings, be sure that the latest ABI and bytecode are
+committed into the repository in the `abis` directory.
+
+Use the following command to generate the bindings:
+
+```bash
+$ make binding
+```
+
+Be sure to use `abigen` built with the same version of `go-ethereum` as what is
+in the `go.mod` file.
+
+### Building the service
+
+The service can be built with the `Makefile`. A binary will be produced
+called the `gas-oracle`.
+
+```bash
+$ make gas-oracle
+```
+
+### Running the service
+
+Use the `--help` flag when running the `gas-oracle` to see it's configuration
+options.
+
+```
+NAME:
+ gas-oracle - Remotely Control the Optimistic Ethereum Gas Price
+
+USAGE:
+ gas-oracle [global options] command [command options] [arguments...]
+
+VERSION:
+ 0.0.0-1.10.4-stable
+
+DESCRIPTION:
+ Configure with a private key and an Optimistic Ethereum HTTP endpoint to send transactions that update the L2 gas price.
+
+COMMANDS:
+ help, h Shows a list of commands or help for one command
+
+GLOBAL OPTIONS:
+ --ethereum-http-url value Sequencer HTTP Endpoint (default: "http://127.0.0.1:8545") [$GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL]
+ --chain-id value L2 Chain ID (default: 0) [$GAS_PRICE_ORACLE_CHAIN_ID]
+ --gas-price-oracle-address value Address of OVM_GasPriceOracle (default: "0x420000000000000000000000000000000000000F") [$GAS_PRICE_ORACLE_GAS_PRICE_ORACLE_ADDRESS]
+ --private-key value Private Key corresponding to OVM_GasPriceOracle Owner [$GAS_PRICE_ORACLE_PRIVATE_KEY]
+ --transaction-gas-price value Hardcoded tx.gasPrice, not setting it uses gas estimation (default: 0) [$GAS_PRICE_ORACLE_TRANSACTION_GAS_PRICE]
+ --loglevel value log level to emit to the screen (default: 3) [$GAS_PRICE_ORACLE_LOG_LEVEL]
+ --floor-price value gas price floor (default: 1) [$GAS_PRICE_ORACLE_FLOOR_PRICE]
+ --target-gas-per-second value target gas per second (default: 11000000) [$GAS_PRICE_ORACLE_TARGET_GAS_PER_SECOND]
+ --max-percent-change-per-epoch value max percent change of gas price per second (default: 0.1) [$GAS_PRICE_ORACLE_MAX_PERCENT_CHANGE_PER_EPOCH]
+ --average-block-gas-limit-per-epoch value average block gas limit per epoch (default: 1.1e+07) [$GAS_PRICE_ORACLE_AVERAGE_BLOCK_GAS_LIMIT_PER_EPOCH]
+ --epoch-length-seconds value length of epochs in seconds (default: 10) [$GAS_PRICE_ORACLE_EPOCH_LENGTH_SECONDS]
+ --significant-factor value only update when the gas price changes by more than this factor (default: 0.05) [$GAS_PRICE_ORACLE_SIGNIFICANT_FACTOR]
+ --wait-for-receipt wait for receipts when sending transactions [$GAS_PRICE_ORACLE_WAIT_FOR_RECEIPT]
+ --metrics Enable metrics collection and reporting [$GAS_PRICE_ORACLE_METRICS_ENABLE]
+ --metrics.addr value Enable stand-alone metrics HTTP server listening interface (default: "127.0.0.1") [$GAS_PRICE_ORACLE_METRICS_HTTP]
+ --metrics.port value Metrics HTTP server listening port (default: 6060) [$GAS_PRICE_ORACLE_METRICS_PORT]
+ --metrics.influxdb Enable metrics export/push to an external InfluxDB database [$GAS_PRICE_ORACLE_METRICS_ENABLE_INFLUX_DB]
+ --metrics.influxdb.endpoint value InfluxDB API endpoint to report metrics to (default: "http://localhost:8086") [$GAS_PRICE_ORACLE_METRICS_INFLUX_DB_ENDPOINT]
+ --metrics.influxdb.database value InfluxDB database name to push reported metrics to (default: "gas-oracle") [$GAS_PRICE_ORACLE_METRICS_INFLUX_DB_DATABASE]
+ --metrics.influxdb.username value Username to authorize access to the database (default: "test") [$GAS_PRICE_ORACLE_METRICS_INFLUX_DB_USERNAME]
+ --metrics.influxdb.password value Password to authorize access to the database (default: "test") [$GAS_PRICE_ORACLE_METRICS_INFLUX_DB_PASSWORD]
+ --help, -h show help
+ --version, -v print the version
+```
+
+### Testing the service
+
+The service can be tested with the `Makefile`
+
+```
+$ make test
+```
diff --git a/go/gas-oracle/abis/OVM_GasPriceOracle.json b/go/gas-oracle/abis/OVM_GasPriceOracle.json
new file mode 100644
index 000000000000..f7f9fd87492a
--- /dev/null
+++ b/go/gas-oracle/abis/OVM_GasPriceOracle.json
@@ -0,0 +1,99 @@
+{
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_initialGasPrice",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "gasPrice",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "_gasPrice",
+ "type": "uint256"
+ }
+ ],
+ "name": "setGasPrice",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bin": "0x608060405234801561001057600080fd5b5060405161061d38038061061d8339818101604052604081101561003357600080fd5b5080516020909101516000610046610097565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350916000805160206105fd833981519152908290a3506100878161009b565b61009082610102565b5050610201565b3390565b6100a3610097565b6001600160a01b03166100b46101f2565b6001600160a01b0316146100fd576040805162461bcd60e51b815260206004820181905260248201526000805160206105dd833981519152604482015290519081900360640190fd5b600155565b61010a610097565b6001600160a01b031661011b6101f2565b6001600160a01b031614610164576040805162461bcd60e51b815260206004820181905260248201526000805160206105dd833981519152604482015290519081900360640190fd5b6001600160a01b0381166101a95760405162461bcd60e51b81526004018080602001828103825260268152602001806105b76026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216916000805160206105fd83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b6103a7806102106000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b14610066578063bf1fe4201461008a578063f2fde38b146100a7578063fe173b97146100cd575b600080fd5b6100646100e7565b005b61006e6101a5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360208110156100a057600080fd5b50356101b4565b610064600480360360208110156100bd57600080fd5b50356001600160a01b031661022d565b6100d5610341565b60408051918252519081900360200190f35b6100ef610347565b6001600160a01b03166101006101a5565b6001600160a01b03161461015b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6101bc610347565b6001600160a01b03166101cd6101a5565b6001600160a01b031614610228576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600155565b610235610347565b6001600160a01b03166102466101a5565b6001600160a01b0316146102a1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166102e65760405162461bcd60e51b815260040180806020018281038252602681526020018061034c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015481565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212205ffb3c08a20124b777934c7f2adbd124e8d73ee3f782032330e9b5c98715395a64736f6c634300070600334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"
+}
diff --git a/go/gas-oracle/bindings/gaspriceoracle.go b/go/gas-oracle/bindings/gaspriceoracle.go
new file mode 100644
index 000000000000..addd05e60831
--- /dev/null
+++ b/go/gas-oracle/bindings/gaspriceoracle.go
@@ -0,0 +1,467 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+)
+
+// GasPriceOracleABI is the input ABI used to generate the binding from.
+const GasPriceOracleABI = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_initialGasPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"gasPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasPrice\",\"type\":\"uint256\"}],\"name\":\"setGasPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"
+
+// GasPriceOracleBin is the compiled bytecode used for deploying new contracts.
+var GasPriceOracleBin = "0x608060405234801561001057600080fd5b5060405161061d38038061061d8339818101604052604081101561003357600080fd5b5080516020909101516000610046610097565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350916000805160206105fd833981519152908290a3506100878161009b565b61009082610102565b5050610201565b3390565b6100a3610097565b6001600160a01b03166100b46101f2565b6001600160a01b0316146100fd576040805162461bcd60e51b815260206004820181905260248201526000805160206105dd833981519152604482015290519081900360640190fd5b600155565b61010a610097565b6001600160a01b031661011b6101f2565b6001600160a01b031614610164576040805162461bcd60e51b815260206004820181905260248201526000805160206105dd833981519152604482015290519081900360640190fd5b6001600160a01b0381166101a95760405162461bcd60e51b81526004018080602001828103825260268152602001806105b76026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216916000805160206105fd83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b6103a7806102106000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063715018a61461005c5780638da5cb5b14610066578063bf1fe4201461008a578063f2fde38b146100a7578063fe173b97146100cd575b600080fd5b6100646100e7565b005b61006e6101a5565b604080516001600160a01b039092168252519081900360200190f35b610064600480360360208110156100a057600080fd5b50356101b4565b610064600480360360208110156100bd57600080fd5b50356001600160a01b031661022d565b6100d5610341565b60408051918252519081900360200190f35b6100ef610347565b6001600160a01b03166101006101a5565b6001600160a01b03161461015b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6101bc610347565b6001600160a01b03166101cd6101a5565b6001600160a01b031614610228576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600155565b610235610347565b6001600160a01b03166102466101a5565b6001600160a01b0316146102a1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166102e65760405162461bcd60e51b815260040180806020018281038252602681526020018061034c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015481565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212205ffb3c08a20124b777934c7f2adbd124e8d73ee3f782032330e9b5c98715395a64736f6c634300070600334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"
+
+// DeployGasPriceOracle deploys a new Ethereum contract, binding an instance of GasPriceOracle to it.
+func DeployGasPriceOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _owner common.Address, _initialGasPrice *big.Int) (common.Address, *types.Transaction, *GasPriceOracle, error) {
+ parsed, err := abi.JSON(strings.NewReader(GasPriceOracleABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(GasPriceOracleBin), backend, _owner, _initialGasPrice)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &GasPriceOracle{GasPriceOracleCaller: GasPriceOracleCaller{contract: contract}, GasPriceOracleTransactor: GasPriceOracleTransactor{contract: contract}, GasPriceOracleFilterer: GasPriceOracleFilterer{contract: contract}}, nil
+}
+
+// GasPriceOracle is an auto generated Go binding around an Ethereum contract.
+type GasPriceOracle struct {
+ GasPriceOracleCaller // Read-only binding to the contract
+ GasPriceOracleTransactor // Write-only binding to the contract
+ GasPriceOracleFilterer // Log filterer for contract events
+}
+
+// GasPriceOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
+type GasPriceOracleCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// GasPriceOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type GasPriceOracleTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// GasPriceOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type GasPriceOracleFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// GasPriceOracleSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type GasPriceOracleSession struct {
+ Contract *GasPriceOracle // Generic contract binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// GasPriceOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type GasPriceOracleCallerSession struct {
+ Contract *GasPriceOracleCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// GasPriceOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type GasPriceOracleTransactorSession struct {
+ Contract *GasPriceOracleTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// GasPriceOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
+type GasPriceOracleRaw struct {
+ Contract *GasPriceOracle // Generic contract binding to access the raw methods on
+}
+
+// GasPriceOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type GasPriceOracleCallerRaw struct {
+ Contract *GasPriceOracleCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// GasPriceOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type GasPriceOracleTransactorRaw struct {
+ Contract *GasPriceOracleTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewGasPriceOracle creates a new instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracle(address common.Address, backend bind.ContractBackend) (*GasPriceOracle, error) {
+ contract, err := bindGasPriceOracle(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &GasPriceOracle{GasPriceOracleCaller: GasPriceOracleCaller{contract: contract}, GasPriceOracleTransactor: GasPriceOracleTransactor{contract: contract}, GasPriceOracleFilterer: GasPriceOracleFilterer{contract: contract}}, nil
+}
+
+// NewGasPriceOracleCaller creates a new read-only instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracleCaller(address common.Address, caller bind.ContractCaller) (*GasPriceOracleCaller, error) {
+ contract, err := bindGasPriceOracle(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &GasPriceOracleCaller{contract: contract}, nil
+}
+
+// NewGasPriceOracleTransactor creates a new write-only instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*GasPriceOracleTransactor, error) {
+ contract, err := bindGasPriceOracle(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &GasPriceOracleTransactor{contract: contract}, nil
+}
+
+// NewGasPriceOracleFilterer creates a new log filterer instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*GasPriceOracleFilterer, error) {
+ contract, err := bindGasPriceOracle(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &GasPriceOracleFilterer{contract: contract}, nil
+}
+
+// bindGasPriceOracle binds a generic wrapper to an already deployed contract.
+func bindGasPriceOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(GasPriceOracleABI))
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_GasPriceOracle *GasPriceOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _GasPriceOracle.Contract.GasPriceOracleCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_GasPriceOracle *GasPriceOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.GasPriceOracleTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_GasPriceOracle *GasPriceOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.GasPriceOracleTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_GasPriceOracle *GasPriceOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _GasPriceOracle.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_GasPriceOracle *GasPriceOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_GasPriceOracle *GasPriceOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.contract.Transact(opts, method, params...)
+}
+
+// GasPrice is a free data retrieval call binding the contract method 0xfe173b97.
+//
+// Solidity: function gasPrice() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) GasPrice(opts *bind.CallOpts) (*big.Int, error) {
+ var out []interface{}
+ err := _GasPriceOracle.contract.Call(opts, &out, "gasPrice")
+
+ if err != nil {
+ return *new(*big.Int), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+ return out0, err
+
+}
+
+// GasPrice is a free data retrieval call binding the contract method 0xfe173b97.
+//
+// Solidity: function gasPrice() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) GasPrice() (*big.Int, error) {
+ return _GasPriceOracle.Contract.GasPrice(&_GasPriceOracle.CallOpts)
+}
+
+// GasPrice is a free data retrieval call binding the contract method 0xfe173b97.
+//
+// Solidity: function gasPrice() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) GasPrice() (*big.Int, error) {
+ return _GasPriceOracle.Contract.GasPrice(&_GasPriceOracle.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_GasPriceOracle *GasPriceOracleCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _GasPriceOracle.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_GasPriceOracle *GasPriceOracleSession) Owner() (common.Address, error) {
+ return _GasPriceOracle.Contract.Owner(&_GasPriceOracle.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_GasPriceOracle *GasPriceOracleCallerSession) Owner() (common.Address, error) {
+ return _GasPriceOracle.Contract.Owner(&_GasPriceOracle.CallOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_GasPriceOracle *GasPriceOracleTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _GasPriceOracle.contract.Transact(opts, "renounceOwnership")
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_GasPriceOracle *GasPriceOracleSession) RenounceOwnership() (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.RenounceOwnership(&_GasPriceOracle.TransactOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_GasPriceOracle *GasPriceOracleTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.RenounceOwnership(&_GasPriceOracle.TransactOpts)
+}
+
+// SetGasPrice is a paid mutator transaction binding the contract method 0xbf1fe420.
+//
+// Solidity: function setGasPrice(uint256 _gasPrice) returns()
+func (_GasPriceOracle *GasPriceOracleTransactor) SetGasPrice(opts *bind.TransactOpts, _gasPrice *big.Int) (*types.Transaction, error) {
+ return _GasPriceOracle.contract.Transact(opts, "setGasPrice", _gasPrice)
+}
+
+// SetGasPrice is a paid mutator transaction binding the contract method 0xbf1fe420.
+//
+// Solidity: function setGasPrice(uint256 _gasPrice) returns()
+func (_GasPriceOracle *GasPriceOracleSession) SetGasPrice(_gasPrice *big.Int) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.SetGasPrice(&_GasPriceOracle.TransactOpts, _gasPrice)
+}
+
+// SetGasPrice is a paid mutator transaction binding the contract method 0xbf1fe420.
+//
+// Solidity: function setGasPrice(uint256 _gasPrice) returns()
+func (_GasPriceOracle *GasPriceOracleTransactorSession) SetGasPrice(_gasPrice *big.Int) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.SetGasPrice(&_GasPriceOracle.TransactOpts, _gasPrice)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_GasPriceOracle *GasPriceOracleTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+ return _GasPriceOracle.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_GasPriceOracle *GasPriceOracleSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.TransferOwnership(&_GasPriceOracle.TransactOpts, newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_GasPriceOracle *GasPriceOracleTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+ return _GasPriceOracle.Contract.TransferOwnership(&_GasPriceOracle.TransactOpts, newOwner)
+}
+
+// GasPriceOracleOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the GasPriceOracle contract.
+type GasPriceOracleOwnershipTransferredIterator struct {
+ Event *GasPriceOracleOwnershipTransferred // Event containing the contract specifics and raw log
+
+ contract *bind.BoundContract // Generic contract to use for unpacking event data
+ event string // Event name to use for unpacking event data
+
+ logs chan types.Log // Log channel receiving the found contract events
+ sub ethereum.Subscription // Subscription for errors, completion and termination
+ done bool // Whether the subscription completed delivering logs
+ fail error // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *GasPriceOracleOwnershipTransferredIterator) Next() bool {
+ // If the iterator failed, stop iterating
+ if it.fail != nil {
+ return false
+ }
+ // If the iterator completed, deliver directly whatever's available
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(GasPriceOracleOwnershipTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+ // Iterator still in progress, wait for either a data or an error event
+ select {
+ case log := <-it.logs:
+ it.Event = new(GasPriceOracleOwnershipTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *GasPriceOracleOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *GasPriceOracleOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// GasPriceOracleOwnershipTransferred represents a OwnershipTransferred event raised by the GasPriceOracle contract.
+type GasPriceOracleOwnershipTransferred struct {
+ PreviousOwner common.Address
+ NewOwner common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_GasPriceOracle *GasPriceOracleFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*GasPriceOracleOwnershipTransferredIterator, error) {
+
+ var previousOwnerRule []interface{}
+ for _, previousOwnerItem := range previousOwner {
+ previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+ }
+ var newOwnerRule []interface{}
+ for _, newOwnerItem := range newOwner {
+ newOwnerRule = append(newOwnerRule, newOwnerItem)
+ }
+
+ logs, sub, err := _GasPriceOracle.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &GasPriceOracleOwnershipTransferredIterator{contract: _GasPriceOracle.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_GasPriceOracle *GasPriceOracleFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *GasPriceOracleOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+ var previousOwnerRule []interface{}
+ for _, previousOwnerItem := range previousOwner {
+ previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+ }
+ var newOwnerRule []interface{}
+ for _, newOwnerItem := range newOwner {
+ newOwnerRule = append(newOwnerRule, newOwnerItem)
+ }
+
+ logs, sub, err := _GasPriceOracle.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+ // New log arrived, parse the event and forward to the user
+ event := new(GasPriceOracleOwnershipTransferred)
+ if err := _GasPriceOracle.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_GasPriceOracle *GasPriceOracleFilterer) ParseOwnershipTransferred(log types.Log) (*GasPriceOracleOwnershipTransferred, error) {
+ event := new(GasPriceOracleOwnershipTransferred)
+ if err := _GasPriceOracle.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
diff --git a/go/gas-oracle/flags/flags.go b/go/gas-oracle/flags/flags.go
new file mode 100644
index 000000000000..8a45006d2f97
--- /dev/null
+++ b/go/gas-oracle/flags/flags.go
@@ -0,0 +1,152 @@
+package flags
+
+import (
+ "github.com/urfave/cli"
+)
+
+var (
+ EthereumHttpUrlFlag = cli.StringFlag{
+ Name: "ethereum-http-url",
+ Value: "http://127.0.0.1:8545",
+ Usage: "Sequencer HTTP Endpoint",
+ EnvVar: "GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL",
+ }
+ ChainIDFlag = cli.Uint64Flag{
+ Name: "chain-id",
+ Usage: "L2 Chain ID",
+ EnvVar: "GAS_PRICE_ORACLE_CHAIN_ID",
+ }
+ GasPriceOracleAddressFlag = cli.StringFlag{
+ Name: "gas-price-oracle-address",
+ Usage: "Address of OVM_GasPriceOracle",
+ Value: "0x420000000000000000000000000000000000000F",
+ EnvVar: "GAS_PRICE_ORACLE_GAS_PRICE_ORACLE_ADDRESS",
+ }
+ PrivateKeyFlag = cli.StringFlag{
+ Name: "private-key",
+ Usage: "Private Key corresponding to OVM_GasPriceOracle Owner",
+ EnvVar: "GAS_PRICE_ORACLE_PRIVATE_KEY",
+ }
+ TransactionGasPriceFlag = cli.Uint64Flag{
+ Name: "transaction-gas-price",
+ Usage: "Hardcoded tx.gasPrice, not setting it uses gas estimation",
+ EnvVar: "GAS_PRICE_ORACLE_TRANSACTION_GAS_PRICE",
+ }
+ LogLevelFlag = cli.IntFlag{
+ Name: "loglevel",
+ Value: 3,
+ Usage: "log level to emit to the screen",
+ EnvVar: "GAS_PRICE_ORACLE_LOG_LEVEL",
+ }
+ FloorPriceFlag = cli.Uint64Flag{
+ Name: "floor-price",
+ Value: 1,
+ Usage: "gas price floor",
+ EnvVar: "GAS_PRICE_ORACLE_FLOOR_PRICE",
+ }
+ TargetGasPerSecondFlag = cli.Uint64Flag{
+ Name: "target-gas-per-second",
+ Value: 11_000_000,
+ Usage: "target gas per second",
+ EnvVar: "GAS_PRICE_ORACLE_TARGET_GAS_PER_SECOND",
+ }
+ MaxPercentChangePerEpochFlag = cli.Float64Flag{
+ Name: "max-percent-change-per-epoch",
+ Value: 0.1,
+ Usage: "max percent change of gas price per second",
+ EnvVar: "GAS_PRICE_ORACLE_MAX_PERCENT_CHANGE_PER_EPOCH",
+ }
+ AverageBlockGasLimitPerEpochFlag = cli.Float64Flag{
+ Name: "average-block-gas-limit-per-epoch",
+ Value: 11_000_000,
+ Usage: "average block gas limit per epoch",
+ EnvVar: "GAS_PRICE_ORACLE_AVERAGE_BLOCK_GAS_LIMIT_PER_EPOCH",
+ }
+ EpochLengthSecondsFlag = cli.Uint64Flag{
+ Name: "epoch-length-seconds",
+ Value: 10,
+ Usage: "length of epochs in seconds",
+ EnvVar: "GAS_PRICE_ORACLE_EPOCH_LENGTH_SECONDS",
+ }
+ SignificanceFactorFlag = cli.Float64Flag{
+ Name: "significant-factor",
+ Value: 0.05,
+ Usage: "only update when the gas price changes by more than this factor",
+ EnvVar: "GAS_PRICE_ORACLE_SIGNIFICANT_FACTOR",
+ }
+ WaitForReceiptFlag = cli.BoolFlag{
+ Name: "wait-for-receipt",
+ Usage: "wait for receipts when sending transactions",
+ EnvVar: "GAS_PRICE_ORACLE_WAIT_FOR_RECEIPT",
+ }
+ MetricsEnabledFlag = cli.BoolFlag{
+ Name: "metrics",
+ Usage: "Enable metrics collection and reporting",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_ENABLE",
+ }
+ MetricsHTTPFlag = cli.StringFlag{
+ Name: "metrics.addr",
+ Usage: "Enable stand-alone metrics HTTP server listening interface",
+ Value: "127.0.0.1",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_HTTP",
+ }
+ MetricsPortFlag = cli.IntFlag{
+ Name: "metrics.port",
+ Usage: "Metrics HTTP server listening port",
+ Value: 6060,
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_PORT",
+ }
+ MetricsEnableInfluxDBFlag = cli.BoolFlag{
+ Name: "metrics.influxdb",
+ Usage: "Enable metrics export/push to an external InfluxDB database",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_ENABLE_INFLUX_DB",
+ }
+ MetricsInfluxDBEndpointFlag = cli.StringFlag{
+ Name: "metrics.influxdb.endpoint",
+ Usage: "InfluxDB API endpoint to report metrics to",
+ Value: "http://localhost:8086",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_INFLUX_DB_ENDPOINT",
+ }
+ MetricsInfluxDBDatabaseFlag = cli.StringFlag{
+ Name: "metrics.influxdb.database",
+ Usage: "InfluxDB database name to push reported metrics to",
+ Value: "gas-oracle",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_INFLUX_DB_DATABASE",
+ }
+ MetricsInfluxDBUsernameFlag = cli.StringFlag{
+ Name: "metrics.influxdb.username",
+ Usage: "Username to authorize access to the database",
+ Value: "test",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_INFLUX_DB_USERNAME",
+ }
+ MetricsInfluxDBPasswordFlag = cli.StringFlag{
+ Name: "metrics.influxdb.password",
+ Usage: "Password to authorize access to the database",
+ Value: "test",
+ EnvVar: "GAS_PRICE_ORACLE_METRICS_INFLUX_DB_PASSWORD",
+ }
+)
+
+var Flags = []cli.Flag{
+ EthereumHttpUrlFlag,
+ ChainIDFlag,
+ GasPriceOracleAddressFlag,
+ PrivateKeyFlag,
+ TransactionGasPriceFlag,
+ LogLevelFlag,
+ FloorPriceFlag,
+ TargetGasPerSecondFlag,
+ MaxPercentChangePerEpochFlag,
+ AverageBlockGasLimitPerEpochFlag,
+ EpochLengthSecondsFlag,
+ SignificanceFactorFlag,
+ WaitForReceiptFlag,
+ MetricsEnabledFlag,
+ MetricsHTTPFlag,
+ MetricsPortFlag,
+ MetricsEnableInfluxDBFlag,
+ MetricsInfluxDBEndpointFlag,
+ MetricsInfluxDBDatabaseFlag,
+ MetricsInfluxDBUsernameFlag,
+ MetricsInfluxDBPasswordFlag,
+}
diff --git a/go/gas-oracle/gasprices/gas_price_updater.go b/go/gas-oracle/gasprices/gas_price_updater.go
new file mode 100644
index 000000000000..558e6202474e
--- /dev/null
+++ b/go/gas-oracle/gasprices/gas_price_updater.go
@@ -0,0 +1,92 @@
+package gasprices
+
+import (
+ "errors"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/log"
+)
+
+type GetLatestBlockNumberFn func() (uint64, error)
+type UpdateL2GasPriceFn func(uint64) error
+
+type GasPriceUpdater struct {
+ mu *sync.RWMutex
+ gasPricer *GasPricer
+ epochStartBlockNumber uint64
+ averageBlockGasLimit float64
+ epochLengthSeconds uint64
+ getLatestBlockNumberFn GetLatestBlockNumberFn
+ updateL2GasPriceFn UpdateL2GasPriceFn
+}
+
+func GetAverageGasPerSecond(
+ epochStartBlockNumber uint64,
+ latestBlockNumber uint64,
+ epochLengthSeconds uint64,
+ averageBlockGasLimit uint64,
+) float64 {
+ blocksPassed := latestBlockNumber - epochStartBlockNumber
+ return float64(blocksPassed * averageBlockGasLimit / epochLengthSeconds)
+}
+
+func NewGasPriceUpdater(
+ gasPricer *GasPricer,
+ epochStartBlockNumber uint64,
+ averageBlockGasLimit float64,
+ epochLengthSeconds uint64,
+ getLatestBlockNumberFn GetLatestBlockNumberFn,
+ updateL2GasPriceFn UpdateL2GasPriceFn,
+) (*GasPriceUpdater, error) {
+ if averageBlockGasLimit < 1 {
+ return nil, errors.New("averageBlockGasLimit cannot be less than 1 gas")
+ }
+ if epochLengthSeconds < 1 {
+ return nil, errors.New("epochLengthSeconds cannot be less than 1 second")
+ }
+ return &GasPriceUpdater{
+ mu: new(sync.RWMutex),
+ gasPricer: gasPricer,
+ epochStartBlockNumber: epochStartBlockNumber,
+ epochLengthSeconds: epochLengthSeconds,
+ averageBlockGasLimit: averageBlockGasLimit,
+ getLatestBlockNumberFn: getLatestBlockNumberFn,
+ updateL2GasPriceFn: updateL2GasPriceFn,
+ }, nil
+}
+
+func (g *GasPriceUpdater) UpdateGasPrice() error {
+ g.mu.Lock()
+ defer g.mu.Unlock()
+
+ latestBlockNumber, err := g.getLatestBlockNumberFn()
+ if err != nil {
+ return err
+ }
+ if latestBlockNumber < uint64(g.epochStartBlockNumber) {
+ return errors.New("Latest block number less than the last epoch's block number")
+ }
+ averageGasPerSecond := GetAverageGasPerSecond(
+ g.epochStartBlockNumber,
+ latestBlockNumber,
+ uint64(g.epochLengthSeconds),
+ uint64(g.averageBlockGasLimit),
+ )
+ log.Debug("UpdateGasPrice", "averageGasPerSecond", averageGasPerSecond, "current-price", g.gasPricer.curPrice)
+ _, err = g.gasPricer.CompleteEpoch(averageGasPerSecond)
+ if err != nil {
+ return err
+ }
+ g.epochStartBlockNumber = latestBlockNumber
+ err = g.updateL2GasPriceFn(g.gasPricer.curPrice)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (g *GasPriceUpdater) GetGasPrice() uint64 {
+ g.mu.RLock()
+ defer g.mu.RUnlock()
+ return g.gasPricer.curPrice
+}
diff --git a/go/gas-oracle/gasprices/gas_price_updater_test.go b/go/gas-oracle/gasprices/gas_price_updater_test.go
new file mode 100644
index 000000000000..4ba73150e604
--- /dev/null
+++ b/go/gas-oracle/gasprices/gas_price_updater_test.go
@@ -0,0 +1,176 @@
+package gasprices
+
+import (
+ "testing"
+)
+
+type MockEpoch struct {
+ numBlocks uint64
+ repeatCount uint64
+ postHook func(prevGasPrice uint64, gasPriceUpdater *GasPriceUpdater)
+}
+
+func TestGetAverageGasPerSecond(t *testing.T) {
+ // Let's sanity check this function with some simple inputs.
+ // A 10 block epoch
+ epochStartBlockNumber := 10
+ latestBlockNumber := 20
+ // That lasts 10 seconds (1 block per second)
+ epochLengthSeconds := 10
+ // And each block has a gas limit of 1
+ averageBlockGasLimit := 1
+ // We expect a gas per second to be 1!
+ expectedGps := 1.0
+ gps := GetAverageGasPerSecond(uint64(epochStartBlockNumber), uint64(latestBlockNumber), uint64(epochLengthSeconds), uint64(averageBlockGasLimit))
+ if gps != expectedGps {
+ t.Fatalf("Gas per second not calculated correctly. Got: %v expected: %v", gps, expectedGps)
+ }
+}
+
+// Return a gas pricer that targets 3 blocks per epoch & 10% max change per epoch.
+func makeTestGasPricerAndUpdater(curPrice uint64) (*GasPricer, *GasPriceUpdater, func(uint64), error) {
+ gpsTarget := 3300000.0
+ getGasTarget := func() float64 { return gpsTarget }
+ epochLengthSeconds := uint64(10)
+ averageBlockGasLimit := 11000000.0
+ // Based on our 10 second epoch, we are targetting 3 blocks per epoch.
+ gasPricer, err := NewGasPricer(curPrice, 1, getGasTarget, 10)
+ if err != nil {
+ return nil, nil, nil, err
+ }
+
+ curBlock := uint64(10)
+ incrementCurrentBlock := func(newBlockNum uint64) { curBlock += newBlockNum }
+ getLatestBlockNumber := func() (uint64, error) { return curBlock, nil }
+ updateL2GasPrice := func(x uint64) error {
+ return nil
+ }
+
+ startBlock, _ := getLatestBlockNumber()
+ gasUpdater, err := NewGasPriceUpdater(
+ gasPricer,
+ startBlock,
+ averageBlockGasLimit,
+ epochLengthSeconds,
+ getLatestBlockNumber,
+ updateL2GasPrice,
+ )
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ return gasPricer, gasUpdater, incrementCurrentBlock, nil
+}
+
+func TestUpdateGasPriceCallsUpdateL2GasPriceFn(t *testing.T) {
+ _, gasUpdater, incrementCurrentBlock, err := makeTestGasPricerAndUpdater(1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ wasCalled := false
+ gasUpdater.updateL2GasPriceFn = func(gasPrice uint64) error {
+ wasCalled = true
+ return nil
+ }
+ incrementCurrentBlock(3)
+ if err := gasUpdater.UpdateGasPrice(); err != nil {
+ t.Fatal(err)
+ }
+ if wasCalled != true {
+ t.Fatalf("Expected updateL2GasPrice to be called.")
+ }
+}
+
+func TestUpdateGasPriceCorrectlyUpdatesAZeroBlockEpoch(t *testing.T) {
+ gasPricer, gasUpdater, _, err := makeTestGasPricerAndUpdater(100)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gasPriceBefore := gasPricer.curPrice
+ gasPriceAfter := gasPricer.curPrice
+ gasUpdater.updateL2GasPriceFn = func(gasPrice uint64) error {
+ gasPriceAfter = gasPrice
+ return nil
+ }
+ if err := gasUpdater.UpdateGasPrice(); err != nil {
+ t.Fatal(err)
+ }
+ if gasPriceBefore < gasPriceAfter {
+ t.Fatalf("Expected gasPrice to go down because we had fewer than 3 blocks in the epoch.")
+ }
+}
+
+func TestUpdateGasPriceFailsIfBlockNumberGoesBackwards(t *testing.T) {
+ _, gasUpdater, _, err := makeTestGasPricerAndUpdater(1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gasUpdater.epochStartBlockNumber = 10
+ gasUpdater.getLatestBlockNumberFn = func() (uint64, error) { return 0, nil }
+ err = gasUpdater.UpdateGasPrice()
+ if err == nil {
+ t.Fatalf("Expected UpdateGasPrice to fail when block number goes backwards.")
+ }
+}
+
+func TestUsageOfGasPriceUpdater(t *testing.T) {
+ _, gasUpdater, incrementCurrentBlock, err := makeTestGasPricerAndUpdater(1000)
+ if err != nil {
+ t.Fatal(err)
+ }
+ // In these mock epochs the gas price shold go up and then down again after the time has passed
+ mockEpochs := []MockEpoch{
+ // First jack up the price to show that it will grow over time
+ MockEpoch{
+ numBlocks: 10,
+ repeatCount: 3,
+ // Make sure the gas price is increasing
+ postHook: func(prevGasPrice uint64, gasPriceUpdater *GasPriceUpdater) {
+ curPrice := gasPriceUpdater.gasPricer.curPrice
+ if prevGasPrice >= curPrice {
+ t.Fatalf("Expected gas price to increase.")
+ }
+ },
+ },
+ // Then stabilize around the GPS we want
+ MockEpoch{
+ numBlocks: 3,
+ repeatCount: 5,
+ postHook: func(prevGasPrice uint64, gasPriceUpdater *GasPriceUpdater) {},
+ },
+ MockEpoch{
+ numBlocks: 3,
+ repeatCount: 0,
+ postHook: func(prevGasPrice uint64, gasPriceUpdater *GasPriceUpdater) {
+ curPrice := gasPriceUpdater.gasPricer.curPrice
+ if prevGasPrice != curPrice {
+ t.Fatalf("Expected gas price to stablize.")
+ }
+ },
+ },
+ // Then reduce the demand to show the fee goes back down to the floor
+ MockEpoch{
+ numBlocks: 1,
+ repeatCount: 5,
+ postHook: func(prevGasPrice uint64, gasPriceUpdater *GasPriceUpdater) {
+ curPrice := gasPriceUpdater.gasPricer.curPrice
+ if prevGasPrice <= curPrice && curPrice != gasPriceUpdater.gasPricer.floorPrice {
+ t.Fatalf("Expected gas price either reduce or be at the floor.")
+ }
+ },
+ },
+ }
+ loop := func(epoch MockEpoch) {
+ prevGasPrice := gasUpdater.gasPricer.curPrice
+ incrementCurrentBlock(epoch.numBlocks)
+ err = gasUpdater.UpdateGasPrice()
+ if err != nil {
+ t.Fatal(err)
+ }
+ epoch.postHook(prevGasPrice, gasUpdater)
+ }
+ for _, epoch := range mockEpochs {
+ for i := 0; i < int(epoch.repeatCount)+1; i++ {
+ loop(epoch)
+ }
+ }
+}
diff --git a/go/gas-oracle/gasprices/l2_gas_pricer.go b/go/gas-oracle/gasprices/l2_gas_pricer.go
new file mode 100644
index 000000000000..71babe1eb13d
--- /dev/null
+++ b/go/gas-oracle/gasprices/l2_gas_pricer.go
@@ -0,0 +1,86 @@
+package gasprices
+
+import (
+ "errors"
+ "fmt"
+ "math"
+
+ "github.com/ethereum/go-ethereum/log"
+)
+
+type GetTargetGasPerSecond func() float64
+
+type GasPricer struct {
+ curPrice uint64
+ floorPrice uint64
+ getTargetGasPerSecond GetTargetGasPerSecond
+ maxChangePerEpoch float64
+}
+
+// LinearInterpolation can be used to dynamically update target gas per second
+func GetLinearInterpolationFn(getX func() float64, x1 float64, x2 float64, y1 float64, y2 float64) func() float64 {
+ return func() float64 {
+ return y1 + ((getX()-x1)/(x2-x1))*(y2-y1)
+ }
+}
+
+// NewGasPricer creates a GasPricer and checks its config beforehand
+func NewGasPricer(curPrice, floorPrice uint64, getTargetGasPerSecond GetTargetGasPerSecond, maxPercentChangePerEpoch float64) (*GasPricer, error) {
+ if floorPrice < 1 {
+ return nil, errors.New("floorPrice must be greater than or equal to 1")
+ }
+ if maxPercentChangePerEpoch <= 0 {
+ return nil, errors.New("maxPercentChangePerEpoch must be between (0,100]")
+ }
+ return &GasPricer{
+ curPrice: max(curPrice, floorPrice),
+ floorPrice: floorPrice,
+ getTargetGasPerSecond: getTargetGasPerSecond,
+ maxChangePerEpoch: maxPercentChangePerEpoch,
+ }, nil
+}
+
+// CalcNextEpochGasPrice calculates the next gas price given some average
+// gas per second over the last epoch
+func (p *GasPricer) CalcNextEpochGasPrice(avgGasPerSecondLastEpoch float64) (uint64, error) {
+ targetGasPerSecond := p.getTargetGasPerSecond()
+ if avgGasPerSecondLastEpoch < 0 {
+ return 0.0, fmt.Errorf("avgGasPerSecondLastEpoch cannot be negative, got %f", avgGasPerSecondLastEpoch)
+ }
+ if targetGasPerSecond < 1 {
+ return 0.0, fmt.Errorf("gasPerSecond cannot be less than 1, got %f", targetGasPerSecond)
+ }
+ // The percent difference between our current average gas & our target gas
+ proportionOfTarget := avgGasPerSecondLastEpoch / targetGasPerSecond
+ log.Trace("Calculating next epoch gas price", "proportionOfTarget", proportionOfTarget,
+ "avgGasPerSecondLastEpoch", avgGasPerSecondLastEpoch, "targetGasPerSecond", targetGasPerSecond)
+ // The percent that we should adjust the gas price to reach our target gas
+ proportionToChangeBy := 0.0
+ if proportionOfTarget >= 1 { // If average avgGasPerSecondLastEpoch is GREATER than our target
+ proportionToChangeBy = math.Min(proportionOfTarget, 1+p.maxChangePerEpoch)
+ } else {
+ proportionToChangeBy = math.Max(proportionOfTarget, 1-p.maxChangePerEpoch)
+ }
+ updated := float64(max(1, p.curPrice)) * proportionToChangeBy
+ result := max(p.floorPrice, uint64(math.Ceil(updated)))
+ log.Debug("Calculated next epoch gas price", "proportionToChangeBy", proportionToChangeBy,
+ "proportionOfTarget", proportionOfTarget, "result", result)
+ return result, nil
+}
+
+// CompleteEpoch ends the current epoch and updates the current gas price for the next epoch
+func (p *GasPricer) CompleteEpoch(avgGasPerSecondLastEpoch float64) (uint64, error) {
+ gp, err := p.CalcNextEpochGasPrice(avgGasPerSecondLastEpoch)
+ if err != nil {
+ return gp, err
+ }
+ p.curPrice = gp
+ return gp, nil
+}
+
+func max(a, b uint64) uint64 {
+ if a >= b {
+ return a
+ }
+ return b
+}
diff --git a/go/gas-oracle/gasprices/l2_gas_pricer_test.go b/go/gas-oracle/gasprices/l2_gas_pricer_test.go
new file mode 100644
index 000000000000..3f731f71d646
--- /dev/null
+++ b/go/gas-oracle/gasprices/l2_gas_pricer_test.go
@@ -0,0 +1,172 @@
+package gasprices
+
+import (
+ "math"
+ "testing"
+)
+
+type CalcGasPriceTestCase struct {
+ name string
+ avgGasPerSecondLastEpoch float64
+ expectedNextGasPrice uint64
+}
+
+func returnConstFn(retVal uint64) func() float64 {
+ return func() float64 { return float64(retVal) }
+}
+
+func runCalcGasPriceTests(gp GasPricer, tcs []CalcGasPriceTestCase, t *testing.T) {
+ for _, tc := range tcs {
+ nextEpochGasPrice, err := gp.CalcNextEpochGasPrice(tc.avgGasPerSecondLastEpoch)
+ if tc.expectedNextGasPrice != nextEpochGasPrice || err != nil {
+ t.Fatalf("failed on test: %s", tc.name)
+ }
+ }
+}
+
+func TestCalcGasPriceFarFromFloor(t *testing.T) {
+ gp := GasPricer{
+ curPrice: 100,
+ floorPrice: 1,
+ getTargetGasPerSecond: returnConstFn(10),
+ maxChangePerEpoch: 0.5,
+ }
+ tcs := []CalcGasPriceTestCase{
+ // No change
+ {
+ name: "No change expected when already at target",
+ avgGasPerSecondLastEpoch: 10,
+ expectedNextGasPrice: 100,
+ },
+ // Price reduction
+ {
+ name: "Max % change bounds the reduction in price",
+ avgGasPerSecondLastEpoch: 1,
+ expectedNextGasPrice: 50,
+ },
+ {
+ // We're half of our target, so reduce by half
+ name: "Reduce fee by half if at 50% capacity",
+ avgGasPerSecondLastEpoch: 5,
+ expectedNextGasPrice: 50,
+ },
+ {
+ name: "Reduce fee by 75% if at 75% capacity",
+ avgGasPerSecondLastEpoch: 7.5,
+ expectedNextGasPrice: 75,
+ },
+ // Price increase
+ {
+ name: "Max % change bounds the increase in price",
+ avgGasPerSecondLastEpoch: 100,
+ expectedNextGasPrice: 150,
+ },
+ {
+ name: "Increase fee by 25% if at 125% capacity",
+ avgGasPerSecondLastEpoch: 12.5,
+ expectedNextGasPrice: 125,
+ },
+ }
+ runCalcGasPriceTests(gp, tcs, t)
+}
+
+func TestCalcGasPriceAtFloor(t *testing.T) {
+ gp := GasPricer{
+ curPrice: 100,
+ floorPrice: 100,
+ getTargetGasPerSecond: returnConstFn(10),
+ maxChangePerEpoch: 0.5,
+ }
+ tcs := []CalcGasPriceTestCase{
+ // No change
+ {
+ name: "No change expected when already at target",
+ avgGasPerSecondLastEpoch: 10,
+ expectedNextGasPrice: 100,
+ },
+ // Price reduction
+ {
+ name: "No change expected when at floorPrice",
+ avgGasPerSecondLastEpoch: 1,
+ expectedNextGasPrice: 100,
+ },
+ // Price increase
+ {
+ name: "Max % change bounds the increase in price",
+ avgGasPerSecondLastEpoch: 100,
+ expectedNextGasPrice: 150,
+ },
+ }
+ runCalcGasPriceTests(gp, tcs, t)
+}
+
+func TestGasPricerUpdates(t *testing.T) {
+ gp := GasPricer{
+ curPrice: 100,
+ floorPrice: 100,
+ getTargetGasPerSecond: returnConstFn(10),
+ maxChangePerEpoch: 0.5,
+ }
+ _, err := gp.CompleteEpoch(12.5)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if gp.curPrice != 125 {
+ t.Fatalf("gp.curPrice not updated correctly. Got: %v, expected: %v", gp.curPrice, 125)
+ }
+}
+
+func TestGetLinearInterpolationFn(t *testing.T) {
+ mockTimestamp := float64(0) // start at timestamp 0
+ // TargetGasPerSecond is dynamic based on the current "mocktimestamp"
+ mockTimeNow := func() float64 {
+ return mockTimestamp
+ }
+ l := GetLinearInterpolationFn(mockTimeNow, 0, 10, 0, 100)
+ for expected := 0.0; expected < 100; expected += 10 {
+ mockTimestamp = expected / 10 // To prove this is not identity function, divide by 10
+ got := l()
+ if got != expected {
+ t.Fatalf("linear interpolation incorrect. Got: %v expected: %v", got, expected)
+ }
+ }
+}
+
+func TestGasPricerDynamicTarget(t *testing.T) {
+ // In prod we will be committing to a gas per second schedule in order to
+ // meter usage over time. This linear interpolation between a start time, end time,
+ // start gas per second, and end gas per second is an example of how we can introduce
+ // acceleration in our gas pricer
+ startTimestamp := float64(0)
+ startGasPerSecond := float64(10)
+ endTimestamp := float64(100)
+ endGasPerSecond := float64(100)
+
+ mockTimestamp := float64(0) // start at timestamp 0
+ // TargetGasPerSecond is dynamic based on the current "mocktimestamp"
+ mockTimeNow := func() float64 {
+ return mockTimestamp
+ }
+ // TargetGasPerSecond is dynamic based on the current "mocktimestamp"
+ dynamicGetTarget := GetLinearInterpolationFn(mockTimeNow, startTimestamp, endTimestamp, startGasPerSecond, endGasPerSecond)
+
+ gp := GasPricer{
+ curPrice: 100,
+ floorPrice: 1,
+ getTargetGasPerSecond: dynamicGetTarget,
+ maxChangePerEpoch: 0.5,
+ }
+ gasPerSecondDemanded := returnConstFn(15)
+ for i := 0; i < 10; i++ {
+ mockTimestamp = float64(i * 10)
+ expectedPrice := math.Ceil(float64(gp.curPrice) * math.Max(0.5, gasPerSecondDemanded()/dynamicGetTarget()))
+
+ _, err := gp.CompleteEpoch(gasPerSecondDemanded())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if gp.curPrice != uint64(expectedPrice) {
+ t.Fatalf("gp.curPrice not updated correctly. Got: %v expected: %v", gp.curPrice, expectedPrice)
+ }
+ }
+}
diff --git a/go/gas-oracle/go.mod b/go/gas-oracle/go.mod
new file mode 100644
index 000000000000..19f1ed300285
--- /dev/null
+++ b/go/gas-oracle/go.mod
@@ -0,0 +1,9 @@
+module github.com/ethereum-optimism/optimism/go/gas-oracle
+
+go 1.16
+
+require (
+ github.com/ethereum/go-ethereum v1.10.4
+ github.com/urfave/cli v1.20.0
+ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
+)
diff --git a/go/gas-oracle/go.sum b/go/gas-oracle/go.sum
new file mode 100644
index 000000000000..79b1a07f3af6
--- /dev/null
+++ b/go/gas-oracle/go.sum
@@ -0,0 +1,571 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
+github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc=
+github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4=
+github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
+github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
+github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
+github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
+github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
+github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
+github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
+github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
+github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw=
+github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
+github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
+github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
+github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
+github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo=
+github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y=
+github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8=
+github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4=
+github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0=
+github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM=
+github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
+github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
+github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw=
+github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
+github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
+github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
+github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
+github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
+github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
+github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
+github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
+github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
+github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
+github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
+github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
+github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0=
+github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
+github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
+github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
+github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/ethereum/go-ethereum v1.10.4 h1:JPZPL2MHbegfFStcaOrrggMVIcf57OQHQ0J3UhjQ+xQ=
+github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
+github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
+github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
+github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
+github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
+github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I=
+github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
+github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
+github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
+github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM=
+github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88 h1:bcAj8KroPf552TScjFPIakjH2/tdIrIH8F+cc4v4SRo=
+github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo=
+github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
+github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8=
+github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
+github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
+github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
+github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
+github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
+github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
+github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
+github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA=
+github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
+github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
+github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
+github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
+github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw=
+github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
+github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
+github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o=
+github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
+github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 h1:USWjF42jDCSEeikX/G1g40ZWnsPXN5WkZ4jMHZWyBK4=
+github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
+github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
+github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
+github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
+github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM=
+github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
+github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
+github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
+github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
+github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
+github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
+github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
+github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
+github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg=
+github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs=
+github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM=
+github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
+github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4=
+github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
+github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
+github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
+github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4=
+github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
+github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
+github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988 h1:EjgCl+fVlIaPJSori0ikSz3uV0DOHKWOJFpv1sAAhBM=
+golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
+golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
+gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
+gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0=
+gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/go/gas-oracle/main.go b/go/gas-oracle/main.go
new file mode 100644
index 000000000000..fe81949b0910
--- /dev/null
+++ b/go/gas-oracle/main.go
@@ -0,0 +1,80 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "time"
+
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/flags"
+ ometrics "github.com/ethereum-optimism/optimism/go/gas-oracle/metrics"
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/oracle"
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/metrics/influxdb"
+ "github.com/ethereum/go-ethereum/params"
+ "github.com/urfave/cli"
+)
+
+var (
+ GitVersion = ""
+ GitCommit = ""
+ GitDate = ""
+)
+
+func main() {
+ app := cli.NewApp()
+ app.Flags = flags.Flags
+
+ app.Version = GitVersion + "-" + params.VersionWithCommit(GitCommit, GitDate)
+ app.Name = "gas-oracle"
+ app.Usage = "Remotely Control the Optimistic Ethereum Gas Price"
+ app.Description = "Configure with a private key and an Optimistic Ethereum HTTP endpoint " +
+ "to send transactions that update the L2 gas price."
+
+ // Configure the logging
+ app.Before = func(ctx *cli.Context) error {
+ loglevel := ctx.GlobalUint64(flags.LogLevelFlag.Name)
+ log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(loglevel), log.StreamHandler(os.Stdout, log.TerminalFormat(true))))
+ return nil
+ }
+
+ // Define the functionality of the application
+ app.Action = func(ctx *cli.Context) error {
+ if args := ctx.Args(); len(args) > 0 {
+ return fmt.Errorf("invalid command: %q", args[0])
+ }
+
+ config := oracle.NewConfig(ctx)
+ gpo, err := oracle.NewGasPriceOracle(config)
+ if err != nil {
+ return err
+ }
+
+ if err := gpo.Start(); err != nil {
+ return err
+ }
+
+ if config.MetricsEnabled {
+ address := fmt.Sprintf("%s:%d", config.MetricsHTTP, config.MetricsPort)
+ log.Info("Enabling stand-alone metrics HTTP endpoint", "address", address)
+ ometrics.Setup(address)
+ }
+
+ if config.MetricsEnableInfluxDB {
+ endpoint := config.MetricsInfluxDBEndpoint
+ database := config.MetricsInfluxDBDatabase
+ username := config.MetricsInfluxDBUsername
+ password := config.MetricsInfluxDBPassword
+ log.Info("Enabling metrics export to InfluxDB", "endpoint", endpoint, "username", username, "database", database)
+ go influxdb.InfluxDBWithTags(ometrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", make(map[string]string))
+ }
+
+ gpo.Wait()
+
+ return nil
+ }
+
+ err := app.Run(os.Args)
+ if err != nil {
+ log.Crit("application failed", "message", err)
+ }
+}
diff --git a/go/gas-oracle/metrics/handler.go b/go/gas-oracle/metrics/handler.go
new file mode 100644
index 000000000000..c8305ee1683d
--- /dev/null
+++ b/go/gas-oracle/metrics/handler.go
@@ -0,0 +1,188 @@
+package metrics
+
+// Do not edit this file as it was copied from go-ethereum
+
+import (
+ "expvar"
+ "fmt"
+ "net/http"
+ "sync"
+
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/metrics"
+ "github.com/ethereum/go-ethereum/metrics/prometheus"
+)
+
+var DefaultRegistry = metrics.NewRegistry()
+
+type exp struct {
+ expvarLock sync.Mutex // expvar panics if you try to register the same var twice, so we must probe it safely
+ registry metrics.Registry
+}
+
+func (exp *exp) expHandler(w http.ResponseWriter, r *http.Request) {
+ // load our variables into expvar
+ exp.syncToExpvar()
+
+ // now just run the official expvar handler code (which is not publicly callable, so pasted inline)
+ w.Header().Set("Content-Type", "application/json; charset=utf-8")
+ fmt.Fprintf(w, "{\n")
+ first := true
+ expvar.Do(func(kv expvar.KeyValue) {
+ if !first {
+ fmt.Fprintf(w, ",\n")
+ }
+ first = false
+ fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value)
+ })
+ fmt.Fprintf(w, "\n}\n")
+}
+
+// Exp will register an expvar powered metrics handler with http.DefaultServeMux on "/debug/vars"
+func Exp(r metrics.Registry) {
+ h := ExpHandler(r)
+ // this would cause a panic:
+ // panic: http: multiple registrations for /debug/vars
+ // http.HandleFunc("/debug/vars", e.expHandler)
+ // haven't found an elegant way, so just use a different endpoint
+ http.Handle("/debug/metrics", h)
+ http.Handle("/debug/metrics/prometheus", prometheus.Handler(r))
+}
+
+// ExpHandler will return an expvar powered metrics handler.
+func ExpHandler(r metrics.Registry) http.Handler {
+ e := exp{sync.Mutex{}, r}
+ return http.HandlerFunc(e.expHandler)
+}
+
+// Setup starts a dedicated metrics server at the given address.
+// This function enables metrics reporting separate from pprof.
+func Setup(address string) {
+ m := http.NewServeMux()
+ m.Handle("/debug/metrics", ExpHandler(DefaultRegistry))
+ m.Handle("/debug/metrics/prometheus", prometheus.Handler(DefaultRegistry))
+ log.Info("Starting metrics server", "addr", fmt.Sprintf("http://%s/debug/metrics", address))
+ go func() {
+ if err := http.ListenAndServe(address, m); err != nil {
+ log.Error("Failure in running metrics server", "err", err)
+ }
+ }()
+}
+
+func (exp *exp) getInt(name string) *expvar.Int {
+ var v *expvar.Int
+ exp.expvarLock.Lock()
+ p := expvar.Get(name)
+ if p != nil {
+ v = p.(*expvar.Int)
+ } else {
+ v = new(expvar.Int)
+ expvar.Publish(name, v)
+ }
+ exp.expvarLock.Unlock()
+ return v
+}
+
+func (exp *exp) getFloat(name string) *expvar.Float {
+ var v *expvar.Float
+ exp.expvarLock.Lock()
+ p := expvar.Get(name)
+ if p != nil {
+ v = p.(*expvar.Float)
+ } else {
+ v = new(expvar.Float)
+ expvar.Publish(name, v)
+ }
+ exp.expvarLock.Unlock()
+ return v
+}
+
+func (exp *exp) publishCounter(name string, metric metrics.Counter) {
+ v := exp.getInt(name)
+ v.Set(metric.Count())
+}
+
+func (exp *exp) publishGauge(name string, metric metrics.Gauge) {
+ v := exp.getInt(name)
+ v.Set(metric.Value())
+}
+func (exp *exp) publishGaugeFloat64(name string, metric metrics.GaugeFloat64) {
+ exp.getFloat(name).Set(metric.Value())
+}
+
+func (exp *exp) publishHistogram(name string, metric metrics.Histogram) {
+ h := metric.Snapshot()
+ ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
+ exp.getInt(name + ".count").Set(h.Count())
+ exp.getFloat(name + ".min").Set(float64(h.Min()))
+ exp.getFloat(name + ".max").Set(float64(h.Max()))
+ exp.getFloat(name + ".mean").Set(h.Mean())
+ exp.getFloat(name + ".std-dev").Set(h.StdDev())
+ exp.getFloat(name + ".50-percentile").Set(ps[0])
+ exp.getFloat(name + ".75-percentile").Set(ps[1])
+ exp.getFloat(name + ".95-percentile").Set(ps[2])
+ exp.getFloat(name + ".99-percentile").Set(ps[3])
+ exp.getFloat(name + ".999-percentile").Set(ps[4])
+}
+
+func (exp *exp) publishMeter(name string, metric metrics.Meter) {
+ m := metric.Snapshot()
+ exp.getInt(name + ".count").Set(m.Count())
+ exp.getFloat(name + ".one-minute").Set(m.Rate1())
+ exp.getFloat(name + ".five-minute").Set(m.Rate5())
+ exp.getFloat(name + ".fifteen-minute").Set(m.Rate15())
+ exp.getFloat(name + ".mean").Set(m.RateMean())
+}
+
+func (exp *exp) publishTimer(name string, metric metrics.Timer) {
+ t := metric.Snapshot()
+ ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
+ exp.getInt(name + ".count").Set(t.Count())
+ exp.getFloat(name + ".min").Set(float64(t.Min()))
+ exp.getFloat(name + ".max").Set(float64(t.Max()))
+ exp.getFloat(name + ".mean").Set(t.Mean())
+ exp.getFloat(name + ".std-dev").Set(t.StdDev())
+ exp.getFloat(name + ".50-percentile").Set(ps[0])
+ exp.getFloat(name + ".75-percentile").Set(ps[1])
+ exp.getFloat(name + ".95-percentile").Set(ps[2])
+ exp.getFloat(name + ".99-percentile").Set(ps[3])
+ exp.getFloat(name + ".999-percentile").Set(ps[4])
+ exp.getFloat(name + ".one-minute").Set(t.Rate1())
+ exp.getFloat(name + ".five-minute").Set(t.Rate5())
+ exp.getFloat(name + ".fifteen-minute").Set(t.Rate15())
+ exp.getFloat(name + ".mean-rate").Set(t.RateMean())
+}
+
+func (exp *exp) publishResettingTimer(name string, metric metrics.ResettingTimer) {
+ t := metric.Snapshot()
+ ps := t.Percentiles([]float64{50, 75, 95, 99})
+ exp.getInt(name + ".count").Set(int64(len(t.Values())))
+ exp.getFloat(name + ".mean").Set(t.Mean())
+ exp.getInt(name + ".50-percentile").Set(ps[0])
+ exp.getInt(name + ".75-percentile").Set(ps[1])
+ exp.getInt(name + ".95-percentile").Set(ps[2])
+ exp.getInt(name + ".99-percentile").Set(ps[3])
+}
+
+func (exp *exp) syncToExpvar() {
+ exp.registry.Each(func(name string, i interface{}) {
+ switch i := i.(type) {
+ case metrics.Counter:
+ exp.publishCounter(name, i)
+ case metrics.Gauge:
+ exp.publishGauge(name, i)
+ case metrics.GaugeFloat64:
+ exp.publishGaugeFloat64(name, i)
+ case metrics.Histogram:
+ exp.publishHistogram(name, i)
+ case metrics.Meter:
+ exp.publishMeter(name, i)
+ case metrics.Timer:
+ exp.publishTimer(name, i)
+ case metrics.ResettingTimer:
+ exp.publishResettingTimer(name, i)
+ default:
+ panic(fmt.Sprintf("unsupported type for '%s': %T", name, i))
+ }
+ })
+}
diff --git a/go/gas-oracle/oracle/config.go b/go/gas-oracle/oracle/config.go
new file mode 100644
index 000000000000..252891abe23b
--- /dev/null
+++ b/go/gas-oracle/oracle/config.go
@@ -0,0 +1,90 @@
+package oracle
+
+import (
+ "crypto/ecdsa"
+ "fmt"
+ "math/big"
+ "strings"
+
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/flags"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/urfave/cli"
+)
+
+// Config represents the configuration options for the gas oracle
+type Config struct {
+ chainID *big.Int
+ ethereumHttpUrl string
+ gasPriceOracleAddress common.Address
+ privateKey *ecdsa.PrivateKey
+ gasPrice *big.Int
+ waitForReceipt bool
+ floorPrice uint64
+ targetGasPerSecond uint64
+ maxPercentChangePerEpoch float64
+ averageBlockGasLimitPerEpoch float64
+ epochLengthSeconds uint64
+ significanceFactor float64
+ // Metrics config
+ MetricsEnabled bool
+ MetricsHTTP string
+ MetricsPort int
+ MetricsEnableInfluxDB bool
+ MetricsInfluxDBEndpoint string
+ MetricsInfluxDBDatabase string
+ MetricsInfluxDBUsername string
+ MetricsInfluxDBPassword string
+}
+
+// NewConfig creates a new Config
+func NewConfig(ctx *cli.Context) *Config {
+ cfg := Config{}
+ cfg.ethereumHttpUrl = ctx.GlobalString(flags.EthereumHttpUrlFlag.Name)
+ addr := ctx.GlobalString(flags.GasPriceOracleAddressFlag.Name)
+ cfg.gasPriceOracleAddress = common.HexToAddress(addr)
+ cfg.targetGasPerSecond = ctx.GlobalUint64(flags.TargetGasPerSecondFlag.Name)
+ cfg.maxPercentChangePerEpoch = ctx.GlobalFloat64(flags.MaxPercentChangePerEpochFlag.Name)
+ cfg.averageBlockGasLimitPerEpoch = ctx.GlobalFloat64(flags.AverageBlockGasLimitPerEpochFlag.Name)
+ cfg.epochLengthSeconds = ctx.GlobalUint64(flags.EpochLengthSecondsFlag.Name)
+ cfg.significanceFactor = ctx.GlobalFloat64(flags.SignificanceFactorFlag.Name)
+ cfg.floorPrice = ctx.GlobalUint64(flags.FloorPriceFlag.Name)
+
+ if ctx.GlobalIsSet(flags.PrivateKeyFlag.Name) {
+ hex := ctx.GlobalString(flags.PrivateKeyFlag.Name)
+ hex = strings.TrimPrefix(hex, "0x")
+ key, err := crypto.HexToECDSA(hex)
+ if err != nil {
+ log.Error(fmt.Sprintf("Option %q: %v", flags.PrivateKeyFlag.Name, err))
+ }
+ cfg.privateKey = key
+ } else {
+ log.Crit("No private key configured")
+ }
+
+ if ctx.GlobalIsSet(flags.ChainIDFlag.Name) {
+ chainID := ctx.GlobalUint64(flags.ChainIDFlag.Name)
+ cfg.chainID = new(big.Int).SetUint64(chainID)
+ }
+
+ if ctx.GlobalIsSet(flags.TransactionGasPriceFlag.Name) {
+ gasPrice := ctx.GlobalUint64(flags.TransactionGasPriceFlag.Name)
+ cfg.gasPrice = new(big.Int).SetUint64(gasPrice)
+ }
+
+ if ctx.GlobalIsSet(flags.WaitForReceiptFlag.Name) {
+ cfg.waitForReceipt = true
+ }
+
+ cfg.MetricsEnabled = ctx.GlobalBool(flags.MetricsEnabledFlag.Name)
+ cfg.MetricsHTTP = ctx.GlobalString(flags.MetricsHTTPFlag.Name)
+ cfg.MetricsPort = ctx.GlobalInt(flags.MetricsPortFlag.Name)
+ cfg.MetricsEnableInfluxDB = ctx.GlobalBool(flags.MetricsEnableInfluxDBFlag.Name)
+ cfg.MetricsInfluxDBEndpoint = ctx.GlobalString(flags.MetricsInfluxDBEndpointFlag.Name)
+ cfg.MetricsInfluxDBDatabase = ctx.GlobalString(flags.MetricsInfluxDBDatabaseFlag.Name)
+ cfg.MetricsInfluxDBUsername = ctx.GlobalString(flags.MetricsInfluxDBUsernameFlag.Name)
+ cfg.MetricsInfluxDBPassword = ctx.GlobalString(flags.MetricsInfluxDBPasswordFlag.Name)
+
+ return &cfg
+}
diff --git a/go/gas-oracle/oracle/gas_price_oracle.go b/go/gas-oracle/oracle/gas_price_oracle.go
new file mode 100644
index 000000000000..a81066cf9a3c
--- /dev/null
+++ b/go/gas-oracle/oracle/gas_price_oracle.go
@@ -0,0 +1,256 @@
+package oracle
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "math/big"
+ "time"
+
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/bindings"
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/gasprices"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethclient"
+ "github.com/ethereum/go-ethereum/log"
+)
+
+// errInvalidSigningKey represents the error when the signing key used
+// is not the Owner of the contract and therefore cannot update the gasprice
+var errInvalidSigningKey = errors.New("invalid signing key")
+
+// errNoChainID represents the error when the chain id is not provided
+// and it cannot be remotely fetched
+var errNoChainID = errors.New("no chain id provided")
+
+// errNoPrivateKey represents the error when the private key is not provided to
+// the application
+var errNoPrivateKey = errors.New("no private key provided")
+
+// errWrongChainID represents the error when the configured chain id is not
+// correct
+var errWrongChainID = errors.New("wrong chain id provided")
+
+// GasPriceOracle manages a hot key that can update the L2 Gas Price
+type GasPriceOracle struct {
+ chainID *big.Int
+ ctx context.Context
+ stop chan struct{}
+ contract *bindings.GasPriceOracle
+ backend DeployContractBackend
+ gasPriceUpdater *gasprices.GasPriceUpdater
+ config *Config
+}
+
+// Start runs the GasPriceOracle
+func (g *GasPriceOracle) Start() error {
+ if g.config.chainID == nil {
+ return errNoChainID
+ }
+ if g.config.privateKey == nil {
+ return errNoPrivateKey
+ }
+
+ address := crypto.PubkeyToAddress(g.config.privateKey.PublicKey)
+ log.Info("Starting Gas Price Oracle", "chain-id", g.chainID, "address", address.Hex())
+
+ price, err := g.contract.GasPrice(&bind.CallOpts{
+ Context: context.Background(),
+ })
+ if err != nil {
+ return err
+ }
+ gasPriceGauge.Update(int64(price.Uint64()))
+
+ go g.Loop()
+
+ return nil
+}
+
+func (g *GasPriceOracle) Stop() {
+ close(g.stop)
+}
+
+func (g *GasPriceOracle) Wait() {
+ <-g.stop
+}
+
+// ensure makes sure that the configured private key is the owner
+// of the `OVM_GasPriceOracle`. If it is not the owner, then it will
+// not be able to make updates to the L2 gas price.
+func (g *GasPriceOracle) ensure() error {
+ owner, err := g.contract.Owner(&bind.CallOpts{
+ Context: g.ctx,
+ })
+ if err != nil {
+ return err
+ }
+ address := crypto.PubkeyToAddress(g.config.privateKey.PublicKey)
+ if address != owner {
+ log.Error("Signing key does not match contract owner", "signer", address.Hex(), "owner", owner.Hex())
+ return errInvalidSigningKey
+ }
+ return nil
+}
+
+// Loop is the main logic of the gas-oracle
+func (g *GasPriceOracle) Loop() {
+ timer := time.NewTicker(time.Duration(g.config.epochLengthSeconds) * time.Second)
+ for {
+ select {
+ case <-timer.C:
+ log.Trace("polling", "time", time.Now())
+ if err := g.Update(); err != nil {
+ log.Error("cannot update gas price", "message", err)
+ }
+
+ case <-g.ctx.Done():
+ g.Stop()
+ }
+ }
+}
+
+// Update will update the gas price
+func (g *GasPriceOracle) Update() error {
+ l2GasPrice, err := g.contract.GasPrice(&bind.CallOpts{
+ Context: g.ctx,
+ })
+ if err != nil {
+ return fmt.Errorf("cannot get gas price: %w", err)
+ }
+
+ if err := g.gasPriceUpdater.UpdateGasPrice(); err != nil {
+ return fmt.Errorf("cannot update gas price: %w", err)
+ }
+
+ newGasPrice, err := g.contract.GasPrice(&bind.CallOpts{
+ Context: g.ctx,
+ })
+ if err != nil {
+ return fmt.Errorf("cannot get gas price: %w", err)
+ }
+
+ local := g.gasPriceUpdater.GetGasPrice()
+ log.Info("Update", "original", l2GasPrice, "current", newGasPrice, "local", local)
+ return nil
+}
+
+// NewGasPriceOracle creates a new GasPriceOracle based on a Config
+func NewGasPriceOracle(cfg *Config) (*GasPriceOracle, error) {
+ client, err := ethclient.Dial(cfg.ethereumHttpUrl)
+ if err != nil {
+ return nil, err
+ }
+
+ // Ensure that we can actually connect
+ t := time.NewTicker(5 * time.Second)
+ for ; true; <-t.C {
+ _, err := client.ChainID(context.Background())
+ if err == nil {
+ t.Stop()
+ break
+ }
+ log.Error("Unable to connect to remote node", "addr", cfg.ethereumHttpUrl)
+ }
+
+ address := cfg.gasPriceOracleAddress
+ contract, err := bindings.NewGasPriceOracle(address, client)
+ if err != nil {
+ return nil, err
+ }
+
+ // Fetch the current gas price to use as the current price
+ currentPrice, err := contract.GasPrice(&bind.CallOpts{
+ Context: context.Background(),
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ // Create a gas pricer for the gas price updater
+ log.Info("Creating GasPricer", "currentPrice", currentPrice,
+ "floorPrice", cfg.floorPrice, "targetGasPerSecond", cfg.targetGasPerSecond,
+ "maxPercentChangePerEpoch", cfg.maxPercentChangePerEpoch)
+
+ gasPricer, err := gasprices.NewGasPricer(
+ currentPrice.Uint64(),
+ cfg.floorPrice,
+ func() float64 {
+ return float64(cfg.targetGasPerSecond)
+ },
+ cfg.maxPercentChangePerEpoch,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ chainID, err := client.ChainID(context.Background())
+ if err != nil {
+ return nil, err
+ }
+
+ // If the chainid is passed in, exit if the chain id is
+ // not correct
+ if cfg.chainID != nil {
+ if cfg.chainID.Cmp(chainID) != 0 {
+ return nil, fmt.Errorf("%w: configured with %d and got %d", errWrongChainID, cfg.chainID, chainID)
+ }
+ } else {
+ cfg.chainID = chainID
+ }
+
+ if cfg.privateKey == nil {
+ return nil, errNoPrivateKey
+ }
+
+ tip, err := client.HeaderByNumber(context.Background(), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ // Start at the tip
+ epochStartBlockNumber := tip.Number.Uint64()
+ // getLatestBlockNumberFn is used by the GasPriceUpdater
+ // to get the latest block number
+ getLatestBlockNumberFn := wrapGetLatestBlockNumberFn(client)
+ // updateL2GasPriceFn is used by the GasPriceUpdater to
+ // update the gas price
+ updateL2GasPriceFn, err := wrapUpdateL2GasPriceFn(client, cfg)
+ if err != nil {
+ return nil, err
+ }
+
+ log.Info("Creating GasPriceUpdater", "epochStartBlockNumber", epochStartBlockNumber,
+ "averageBlockGasLimitPerEpoch", cfg.averageBlockGasLimitPerEpoch,
+ "epochLengthSeconds", cfg.epochLengthSeconds)
+
+ gasPriceUpdater, err := gasprices.NewGasPriceUpdater(
+ gasPricer,
+ epochStartBlockNumber,
+ cfg.averageBlockGasLimitPerEpoch,
+ cfg.epochLengthSeconds,
+ getLatestBlockNumberFn,
+ updateL2GasPriceFn,
+ )
+
+ if err != nil {
+ return nil, err
+ }
+
+ gpo := GasPriceOracle{
+ chainID: chainID,
+ ctx: context.Background(),
+ stop: make(chan struct{}),
+ contract: contract,
+ gasPriceUpdater: gasPriceUpdater,
+ config: cfg,
+ backend: client,
+ }
+
+ if err := gpo.ensure(); err != nil {
+ return nil, err
+ }
+
+ return &gpo, nil
+}
diff --git a/go/gas-oracle/oracle/updater_interface.go b/go/gas-oracle/oracle/updater_interface.go
new file mode 100644
index 000000000000..91ad6560da1b
--- /dev/null
+++ b/go/gas-oracle/oracle/updater_interface.go
@@ -0,0 +1,200 @@
+package oracle
+
+import (
+ "context"
+ "errors"
+ "math/big"
+ "time"
+
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/bindings"
+ ometrics "github.com/ethereum-optimism/optimism/go/gas-oracle/metrics"
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/metrics"
+)
+
+var (
+ txSendCounter = metrics.NewRegisteredCounter("tx/send", ometrics.DefaultRegistry)
+ txNotSignificantCounter = metrics.NewRegisteredCounter("tx/not-significant", ometrics.DefaultRegistry)
+ gasPriceGauge = metrics.NewRegisteredGauge("gas-price", ometrics.DefaultRegistry)
+ txConfTimer = metrics.NewRegisteredTimer("tx/confirmed", ometrics.DefaultRegistry)
+ txSendTimer = metrics.NewRegisteredTimer("tx/send", ometrics.DefaultRegistry)
+)
+
+// getLatestBlockNumberFn is used by the GasPriceUpdater
+// to get the latest block number. The outer function binds the
+// inner function to a `bind.ContractBackend` which is implemented
+// by the `ethclient.Client`
+func wrapGetLatestBlockNumberFn(backend bind.ContractBackend) func() (uint64, error) {
+ return func() (uint64, error) {
+ tip, err := backend.HeaderByNumber(context.Background(), nil)
+ if err != nil {
+ return 0, err
+ }
+ return tip.Number.Uint64(), nil
+ }
+}
+
+// DeployContractBackend represents the union of the
+// DeployBackend and the ContractBackend
+type DeployContractBackend interface {
+ bind.DeployBackend
+ bind.ContractBackend
+}
+
+// updateL2GasPriceFn is used by the GasPriceUpdater
+// to update the L2 gas price
+// perhaps this should take an options struct along with the backend?
+// how can this continue to be decomposed?
+func wrapUpdateL2GasPriceFn(backend DeployContractBackend, cfg *Config) (func(uint64) error, error) {
+ if cfg.privateKey == nil {
+ return nil, errNoPrivateKey
+ }
+ if cfg.chainID == nil {
+ return nil, errNoChainID
+ }
+
+ opts, err := bind.NewKeyedTransactorWithChainID(cfg.privateKey, cfg.chainID)
+ if err != nil {
+ return nil, err
+ }
+ // Once https://github.com/ethereum/go-ethereum/pull/23062 is released
+ // then we can remove setting the context here
+ if opts.Context == nil {
+ opts.Context = context.Background()
+ }
+ // Don't send the transaction using the `contract` so that we can inspect
+ // it beforehand
+ opts.NoSend = true
+
+ // Create a new contract bindings in scope of the updateL2GasPriceFn
+ // that is returned from this function
+ contract, err := bindings.NewGasPriceOracle(cfg.gasPriceOracleAddress, backend)
+ if err != nil {
+ return nil, err
+ }
+
+ return func(updatedGasPrice uint64) error {
+ log.Trace("UpdateL2GasPriceFn", "gas-price", updatedGasPrice)
+ if cfg.gasPrice == nil {
+ // Set the gas price manually to use legacy transactions
+ gasPrice, err := backend.SuggestGasPrice(context.Background())
+ if err != nil {
+ log.Error("cannot fetch gas price", "message", err)
+ return err
+ }
+ log.Trace("fetched L2 tx.gasPrice", "gas-price", gasPrice)
+ opts.GasPrice = gasPrice
+ } else {
+ // Allow a configurable gas price to be set
+ opts.GasPrice = cfg.gasPrice
+ }
+
+ // Query the current L2 gas price
+ currentPrice, err := contract.GasPrice(&bind.CallOpts{
+ Context: context.Background(),
+ })
+ if err != nil {
+ log.Error("cannot fetch current gas price", "message", err)
+ return err
+ }
+
+ // no need to update when they are the same
+ if currentPrice.Uint64() == updatedGasPrice {
+ log.Info("gas price did not change", "gas-price", updatedGasPrice)
+ txNotSignificantCounter.Inc(1)
+ return nil
+ }
+
+ // Only update the gas price when it must be changed by at least
+ // a paramaterizable amount.
+ if !isDifferenceSignificant(currentPrice.Uint64(), updatedGasPrice, cfg.significanceFactor) {
+ log.Info("gas price did not significantly change", "min-factor", cfg.significanceFactor,
+ "current-price", currentPrice, "next-price", updatedGasPrice)
+ txNotSignificantCounter.Inc(1)
+ return nil
+ }
+
+ // Set the gas price by sending a transaction
+ tx, err := contract.SetGasPrice(opts, new(big.Int).SetUint64(updatedGasPrice))
+ if err != nil {
+ return err
+ }
+
+ log.Debug("sending transaction", "tx.gasPrice", tx.GasPrice(), "tx.gasLimit", tx.Gas(),
+ "tx.data", hexutil.Encode(tx.Data()), "tx.to", tx.To().Hex(), "tx.nonce", tx.Nonce())
+ pre := time.Now()
+ if err := backend.SendTransaction(context.Background(), tx); err != nil {
+ return err
+ }
+ txSendTimer.Update(time.Since(pre))
+ log.Info("transaction sent", "hash", tx.Hash().Hex())
+
+ gasPriceGauge.Update(int64(updatedGasPrice))
+ txSendCounter.Inc(1)
+
+ if cfg.waitForReceipt {
+ // Keep track of the time it takes to confirm the transaction
+ pre := time.Now()
+ // Wait for the receipt
+ receipt, err := waitForReceipt(backend, tx)
+ if err != nil {
+ return err
+ }
+ txConfTimer.Update(time.Since(pre))
+
+ log.Info("transaction confirmed", "hash", tx.Hash().Hex(),
+ "gas-used", receipt.GasUsed, "blocknumber", receipt.BlockNumber)
+ }
+ return nil
+ }, nil
+}
+
+// Only update the gas price when it must be changed by at least
+// a paramaterizable amount. If the param is greater than the result
+// of 1 - (min/max) where min and max are the gas prices then do not
+// update the gas price
+func isDifferenceSignificant(a, b uint64, c float64) bool {
+ max := max(a, b)
+ min := min(a, b)
+ factor := 1 - (float64(min) / float64(max))
+ return c <= factor
+}
+
+// Wait for the receipt by polling the backend
+func waitForReceipt(backend DeployContractBackend, tx *types.Transaction) (*types.Receipt, error) {
+ t := time.NewTicker(300 * time.Millisecond)
+ receipt := new(types.Receipt)
+ var err error
+ for range t.C {
+ receipt, err = backend.TransactionReceipt(context.Background(), tx.Hash())
+ if errors.Is(err, ethereum.NotFound) {
+ continue
+ }
+ if err != nil {
+ return nil, err
+ }
+ if receipt != nil {
+ t.Stop()
+ break
+ }
+ }
+ return receipt, nil
+}
+
+func max(a, b uint64) uint64 {
+ if a >= b {
+ return a
+ }
+ return b
+}
+
+func min(a, b uint64) uint64 {
+ if a >= b {
+ return b
+ }
+ return a
+}
diff --git a/go/gas-oracle/oracle/updater_interface_test.go b/go/gas-oracle/oracle/updater_interface_test.go
new file mode 100644
index 000000000000..3f471dd6a85a
--- /dev/null
+++ b/go/gas-oracle/oracle/updater_interface_test.go
@@ -0,0 +1,202 @@
+package oracle
+
+import (
+ "context"
+ "crypto/ecdsa"
+ "math/big"
+ "testing"
+
+ "github.com/ethereum-optimism/optimism/go/gas-oracle/bindings"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/rawdb"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethdb"
+)
+
+func TestWrapGetLatestBlockNumberFn(t *testing.T) {
+ key, _ := crypto.GenerateKey()
+ sim, db := newSimulatedBackend(key)
+ chain := sim.Blockchain()
+
+ getLatest := wrapGetLatestBlockNumberFn(sim)
+
+ // Generate a valid chain of 10 blocks
+ blocks, _ := core.GenerateChain(chain.Config(), chain.CurrentBlock(), chain.Engine(), db, 10, nil)
+
+ // Check that the latest is 0 to start
+ latest, err := getLatest()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if latest != 0 {
+ t.Fatal("not zero")
+ }
+
+ // Insert the blocks one by one and assert that they are incrementing
+ for i, block := range blocks {
+ if _, err := chain.InsertChain([]*types.Block{block}); err != nil {
+ t.Fatal(err)
+ }
+ latest, err := getLatest()
+ if err != nil {
+ t.Fatal(err)
+ }
+ // Handle zero index by adding 1
+ if latest != uint64(i+1) {
+ t.Fatal("mismatch")
+ }
+ }
+}
+
+func TestWrapUpdateL2GasPriceFn(t *testing.T) {
+ key, _ := crypto.GenerateKey()
+ sim, _ := newSimulatedBackend(key)
+
+ opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
+ addr, _, gpo, err := bindings.DeployGasPriceOracle(opts, sim, opts.From, big.NewInt(0))
+ if err != nil {
+ t.Fatal(err)
+ }
+ sim.Commit()
+
+ cfg := &Config{
+ privateKey: key,
+ chainID: big.NewInt(1337),
+ gasPriceOracleAddress: addr,
+ gasPrice: big.NewInt(676167759),
+ }
+
+ updateL2GasPriceFn, err := wrapUpdateL2GasPriceFn(sim, cfg)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ for i := uint64(0); i < 10; i++ {
+ err := updateL2GasPriceFn(i)
+ if err != nil {
+ t.Fatal(err)
+ }
+ sim.Commit()
+ gasPrice, err := gpo.GasPrice(&bind.CallOpts{Context: context.Background()})
+ if err != nil {
+ t.Fatal(err)
+ }
+ if gasPrice.Uint64() != i {
+ t.Fatal("mismatched gas price")
+ }
+ }
+}
+
+func TestWrapUpdateL2GasPriceFnNoUpdates(t *testing.T) {
+ key, _ := crypto.GenerateKey()
+ sim, _ := newSimulatedBackend(key)
+
+ opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
+ // Deploy the contract
+ addr, _, gpo, err := bindings.DeployGasPriceOracle(opts, sim, opts.From, big.NewInt(0))
+ if err != nil {
+ t.Fatal(err)
+ }
+ sim.Commit()
+
+ cfg := &Config{
+ privateKey: key,
+ chainID: big.NewInt(1337),
+ gasPriceOracleAddress: addr,
+ gasPrice: big.NewInt(772763153),
+ // the new gas price must change be 50% for it to actually update
+ significanceFactor: 0.5,
+ }
+ updateL2GasPriceFn, err := wrapUpdateL2GasPriceFn(sim, cfg)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Create a function to do the assertions
+ tryUpdate := func(price uint64, shouldUpdate bool) {
+ // Get a reference to the original gas price
+ original, err := gpo.GasPrice(&bind.CallOpts{Context: context.Background()})
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Call the updateL2GasPriceFn and commit the state
+ if err := updateL2GasPriceFn(price); err != nil {
+ t.Fatal(err)
+ }
+ sim.Commit()
+
+ // Get a reference to the potentially updated state
+ updated, err := gpo.GasPrice(&bind.CallOpts{Context: context.Background()})
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // the assertion differs depending on if it is expected that the
+ // update occurs or not
+ switch shouldUpdate {
+ case true:
+ // the price passed in should equal updated
+ if updated.Uint64() != price {
+ t.Fatalf("mismatched gas price, expect %d - got %d - should update (%t)", updated, price, shouldUpdate)
+ }
+ case false:
+ // the original should match the updated
+ if original.Uint64() != updated.Uint64() {
+ t.Fatalf("mismatched gas price, expect %d - got %d - should update (%t)", original, updated, shouldUpdate)
+ }
+ }
+ }
+
+ // tryUpdate(newGasPrice, shouldUpdate)
+ // The gas price starts out at 0
+ // try to update it to 0 and it should not update
+ tryUpdate(0, false)
+ // update it to 2 and it should update
+ tryUpdate(2, true)
+ // it should not update to 3
+ tryUpdate(3, false)
+ // it should update to 4
+ tryUpdate(4, true)
+ // it should not update back down to 3
+ tryUpdate(3, false)
+ // it should update to 1
+ tryUpdate(1, true)
+}
+
+func TestIsDifferenceSignificant(t *testing.T) {
+ tests := []struct {
+ name string
+ a uint64
+ b uint64
+ sig float64
+ expect bool
+ }{
+ {name: "test 1", a: 1, b: 1, sig: 0.05, expect: false},
+ {name: "test 2", a: 4, b: 1, sig: 0.25, expect: true},
+ {name: "test 3", a: 3, b: 1, sig: 0.1, expect: true},
+ {name: "test 4", a: 4, b: 1, sig: 0.9, expect: false},
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ result := isDifferenceSignificant(tc.a, tc.b, tc.sig)
+ if result != tc.expect {
+ t.Fatalf("mismatch %s", tc.name)
+ }
+ })
+ }
+}
+
+func newSimulatedBackend(key *ecdsa.PrivateKey) (*backends.SimulatedBackend, ethdb.Database) {
+ var gasLimit uint64 = 9_000_000
+ auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
+ genAlloc := make(core.GenesisAlloc)
+ genAlloc[auth.From] = core.GenesisAccount{Balance: big.NewInt(9223372036854775807)}
+ db := rawdb.NewMemoryDatabase()
+ sim := backends.NewSimulatedBackendWithDatabase(db, genAlloc, gasLimit)
+ return sim, db
+}
diff --git a/go/gas-oracle/package.json b/go/gas-oracle/package.json
new file mode 100644
index 000000000000..9a2db12d4383
--- /dev/null
+++ b/go/gas-oracle/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@eth-optimism/gas-oracle",
+ "version": "0.0.2",
+ "private": true,
+ "devDependencies": {}
+}
diff --git a/go/op_exporter/.gitignore b/go/op_exporter/.gitignore
new file mode 100644
index 000000000000..10cfd60097ae
--- /dev/null
+++ b/go/op_exporter/.gitignore
@@ -0,0 +1,2 @@
+op_exporter
+.env
\ No newline at end of file
diff --git a/go/op_exporter/Makefile b/go/op_exporter/Makefile
new file mode 100644
index 000000000000..101880c07ad3
--- /dev/null
+++ b/go/op_exporter/Makefile
@@ -0,0 +1,21 @@
+SHELL := /bin/bash
+
+VERSION := `git describe --abbrev=0`
+GITCOMMIT := `git rev-parse HEAD`
+BUILDDATE := `date +%Y-%m-%d`
+BUILDUSER := `whoami`
+
+LDFLAGSSTRING :=-X github.com/ethereum-optimism/optimism/go/op_exporter/version.Version=$(VERSION)
+LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/go/op_exporter/version.GitCommit=$(GITCOMMIT)
+LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/go/op_exporter/version.BuildDate=$(BUILDDATE)
+LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/go/op_exporter/version.BuildUser=$(BUILDUSER)
+
+LDFLAGS :=-ldflags "$(LDFLAGSSTRING)"
+
+.PHONY: all build
+
+all: build
+
+# Build binary
+build:
+ CGO_ENABLED=0 go build $(LDFLAGS)
\ No newline at end of file
diff --git a/go/op_exporter/README.md b/go/op_exporter/README.md
new file mode 100644
index 000000000000..5ec4d7bfdb78
--- /dev/null
+++ b/go/op_exporter/README.md
@@ -0,0 +1,27 @@
+# op_exporter
+
+A prometheus exporter to collect information from an Optimistic Ethereum node and serve metrics for collection
+
+## Usage
+
+```
+make build && ./op_exporter --rpc.provider="https://kovan-sequencer.optimism.io" --label.network="kovan"
+```
+
+## Health endpoint `/health`
+
+Returns json describing the health of the sequencer based on the time since a block height update.
+
+```
+$ curl http://localhost:9100/health
+{ "healthy": "false" }
+```
+
+## Metrics endpoint `/metrics`
+
+```
+# HELP op_gasPrice Gas price.
+# TYPE op_gasPrice gauge
+op_gasPrice{layer="layer1",network="kovan"} 6.9e+09
+op_gasPrice{layer="layer2",network="kovan"} 1
+```
diff --git a/go/op_exporter/collector.go b/go/op_exporter/collector.go
new file mode 100644
index 000000000000..b74a105d1287
--- /dev/null
+++ b/go/op_exporter/collector.go
@@ -0,0 +1,34 @@
+package main
+
+import (
+ "github.com/prometheus/client_golang/prometheus"
+)
+
+//Define the metrics we wish to expose
+var (
+ gasPrice = prometheus.NewGaugeVec(
+ prometheus.GaugeOpts{
+ Name: "op_gasPrice",
+ Help: "Gas price."},
+ []string{"network", "layer"},
+ )
+ blockNumber = prometheus.NewGaugeVec(
+ prometheus.GaugeOpts{
+ Name: "op_blocknumber",
+ Help: "Current block number."},
+ []string{"network", "layer"},
+ )
+ healthySequencer = prometheus.NewGaugeVec(
+ prometheus.GaugeOpts{
+ Name: "op_healthy_sequencer",
+ Help: "Is the sequencer healthy?"},
+ []string{"network"},
+ )
+)
+
+func init() {
+ //Register metrics with prometheus
+ prometheus.MustRegister(gasPrice)
+ prometheus.MustRegister(blockNumber)
+ prometheus.MustRegister(healthySequencer)
+}
diff --git a/go/op_exporter/go.mod b/go/op_exporter/go.mod
new file mode 100644
index 000000000000..8d7ace3a1e4e
--- /dev/null
+++ b/go/op_exporter/go.mod
@@ -0,0 +1,11 @@
+module github.com/ethereum-optimism/optimism/go/op_exporter
+
+go 1.16
+
+require (
+ github.com/ethereum/go-ethereum v1.10.4
+ github.com/prometheus/client_golang v1.4.0
+ github.com/sirupsen/logrus v1.4.2
+ github.com/ybbus/jsonrpc v2.1.2+incompatible
+ gopkg.in/alecthomas/kingpin.v2 v2.2.6
+)
diff --git a/go/op_exporter/go.sum b/go/op_exporter/go.sum
new file mode 100644
index 000000000000..3089f087cc50
--- /dev/null
+++ b/go/op_exporter/go.sum
@@ -0,0 +1,541 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
+github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc=
+github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4=
+github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
+github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
+github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
+github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
+github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
+github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
+github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
+github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw=
+github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
+github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
+github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
+github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo=
+github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y=
+github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8=
+github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4=
+github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0=
+github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM=
+github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
+github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
+github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
+github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
+github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
+github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
+github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
+github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
+github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
+github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
+github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
+github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
+github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
+github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
+github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
+github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/ethereum/go-ethereum v1.10.4 h1:JPZPL2MHbegfFStcaOrrggMVIcf57OQHQ0J3UhjQ+xQ=
+github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
+github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
+github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
+github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
+github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
+github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo=
+github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
+github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
+github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
+github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
+github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
+github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
+github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
+github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
+github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
+github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
+github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
+github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
+github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
+github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
+github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
+github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
+github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
+github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
+github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.0 h1:YVIb/fVcOTMSqtqZWSKnHpSLBxu8DKgxq8z6RuBZwqI=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
+github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
+github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
+github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
+github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
+github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM=
+github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
+github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
+github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
+github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
+github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
+github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
+github.com/ybbus/jsonrpc v2.1.2+incompatible h1:V4mkE9qhbDQ92/MLMIhlhMSbz8jNXdagC3xBR5NDwaQ=
+github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988 h1:EjgCl+fVlIaPJSori0ikSz3uV0DOHKWOJFpv1sAAhBM=
+golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
+gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
+gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/go/op_exporter/main.go b/go/op_exporter/main.go
new file mode 100644
index 000000000000..992d1605c9b7
--- /dev/null
+++ b/go/op_exporter/main.go
@@ -0,0 +1,174 @@
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "os"
+ "sync"
+ "time"
+
+ "github.com/ethereum-optimism/optimism/go/op_exporter/version"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/prometheus/client_golang/prometheus/promhttp"
+ log "github.com/sirupsen/logrus"
+ "github.com/ybbus/jsonrpc"
+ "gopkg.in/alecthomas/kingpin.v2"
+)
+
+var (
+ listenAddress = kingpin.Flag(
+ "web.listen-address",
+ "Address on which to expose metrics and web interface.",
+ ).Default(":9100").String()
+ rpcProvider = kingpin.Flag(
+ "rpc.provider",
+ "Address for RPC provider.",
+ ).Default("http://127.0.0.1:8545").String()
+ networkLabel = kingpin.Flag(
+ "label.network",
+ "Label to apply to the metrics to identify the network.",
+ ).Default("mainnet").String()
+ versionFlag = kingpin.Flag(
+ "version",
+ "Display binary version.",
+ ).Default("False").Bool()
+ unhealthyTimePeriod = kingpin.Flag(
+ "wait.minutes",
+ "Number of minutes to wait for the next block before marking provider unhealthy.",
+ ).Default("10").Int()
+ //unhealthyTimePeriod = time.Minute * 10
+)
+
+type healthCheck struct {
+ mu *sync.RWMutex
+ height uint64
+ healthy bool
+ updateTime time.Time
+}
+
+func healthHandler(health *healthCheck) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ health.mu.RLock()
+ defer health.mu.RUnlock()
+ w.Write([]byte(fmt.Sprintf(`{ "healthy": "%t" }`, health.healthy)))
+ }
+}
+
+func main() {
+ kingpin.HelpFlag.Short('h')
+ kingpin.Parse()
+ if *versionFlag {
+ fmt.Printf("(version=%s, gitcommit=%s)\n", version.Version, version.GitCommit)
+ fmt.Printf("(go=%s, user=%s, date=%s)\n", version.GoVersion, version.BuildUser, version.BuildDate)
+ os.Exit(0)
+ }
+ log.Infoln("exporter config", *listenAddress, *rpcProvider, *networkLabel)
+ log.Infoln("Starting op_exporter", version.Info())
+ log.Infoln("Build context", version.BuildContext())
+
+ health := healthCheck{
+ mu: new(sync.RWMutex),
+ height: 0,
+ healthy: false,
+ updateTime: time.Now(),
+ }
+ http.Handle("/metrics", promhttp.Handler())
+ http.Handle("/health", healthHandler(&health))
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+ w.Write([]byte(`
+ OP Exporter
+
+ OP Exporter
+ Metrics
+ Health
+
+ `))
+ })
+ go getRollupGasPrices()
+ go getBlockNumber(&health)
+ log.Infoln("Listening on", *listenAddress)
+ if err := http.ListenAndServe(*listenAddress, nil); err != nil {
+ log.Fatal(err)
+ }
+
+}
+
+func getBlockNumber(health *healthCheck) {
+ rpcClient := jsonrpc.NewClientWithOpts(*rpcProvider, &jsonrpc.RPCClientOpts{})
+ var blockNumberResponse *string
+ for {
+ if err := rpcClient.CallFor(&blockNumberResponse, "eth_blockNumber"); err != nil {
+ health.mu.Lock()
+ health.healthy = false
+ health.mu.Unlock()
+ log.Warnln("Error calling eth_blockNumber, setting unhealthy", err)
+ } else {
+ log.Infoln("Got block number: ", *blockNumberResponse)
+ health.mu.Lock()
+ currentHeight, err := hexutil.DecodeUint64(*blockNumberResponse)
+ blockNumber.WithLabelValues(
+ *networkLabel, "layer2").Set(float64(currentHeight))
+ if err != nil {
+ log.Warnln("Error decoding block height", err)
+ continue
+ }
+ lastHeight := health.height
+ // If the currentHeight is the same as the lastHeight, check that
+ // the unhealthyTimePeriod has passed and update health.healthy
+ if currentHeight == lastHeight {
+ currentTime := time.Now()
+ lastTime := health.updateTime
+ log.Warnln(fmt.Sprintf("Heights are the same, %v, %v", currentTime, lastTime))
+ if lastTime.Add(time.Duration(*unhealthyTimePeriod) * time.Minute).Before(currentTime) {
+ health.healthy = false
+ log.Warnln("Heights are the same for the unhealthyTimePeriod, setting unhealthy")
+ }
+ } else {
+ log.Warnln("New block height detected, setting healthy")
+ health.height = currentHeight
+ health.updateTime = time.Now()
+ health.healthy = true
+ }
+ if health.healthy {
+ healthySequencer.WithLabelValues(
+ *networkLabel).Set(1)
+ } else {
+ healthySequencer.WithLabelValues(
+ *networkLabel).Set(0)
+ }
+
+ health.mu.Unlock()
+ }
+ time.Sleep(time.Duration(30) * time.Second)
+ }
+}
+
+func getRollupGasPrices() {
+ rpcClient := jsonrpc.NewClientWithOpts(*rpcProvider, &jsonrpc.RPCClientOpts{})
+ var rollupGasPrices *GetRollupGasPrices
+ for {
+ if err := rpcClient.CallFor(&rollupGasPrices, "rollup_gasPrices"); err != nil {
+ log.Warnln("Error calling rollup_gasPrices", err)
+ } else {
+ l1GasPriceString := rollupGasPrices.L1GasPrice
+ l1GasPrice, err := hexutil.DecodeUint64(l1GasPriceString)
+ if err != nil {
+ log.Warnln("Error converting gasPrice " + l1GasPriceString)
+ }
+ gasPrice.WithLabelValues(
+ *networkLabel, "layer1").Set(float64(l1GasPrice))
+ l2GasPriceString := rollupGasPrices.L2GasPrice
+ l2GasPrice, err := hexutil.DecodeUint64(l2GasPriceString)
+ if err != nil {
+ log.Warnln("Error converting gasPrice " + l2GasPriceString)
+ }
+ gasPrice.WithLabelValues(
+ *networkLabel, "layer2").Set(float64(l2GasPrice))
+ log.Infoln("Got L1 gas string: ", l1GasPriceString)
+ log.Infoln("Got L1 gas prices: ", l1GasPrice)
+ log.Infoln("Got L2 gas string: ", l2GasPriceString)
+ log.Infoln("Got L2 gas prices: ", l2GasPrice)
+ }
+ time.Sleep(time.Duration(30) * time.Second)
+ }
+}
diff --git a/go/op_exporter/rpc.go b/go/op_exporter/rpc.go
new file mode 100644
index 000000000000..f6bc9b13968a
--- /dev/null
+++ b/go/op_exporter/rpc.go
@@ -0,0 +1,11 @@
+package main
+
+// GetRollupGasPrices returns the rpc `rollup_gasPrices` status
+type GetRollupGasPrices struct {
+ L1GasPrice string `json:"l1GasPrice"`
+ L2GasPrice string `json:"l2GasPrice"`
+}
+
+type GetBlockNumber struct {
+ BlockNumber string `json:"result"`
+}
diff --git a/go/op_exporter/version/version.go b/go/op_exporter/version/version.go
new file mode 100644
index 000000000000..d86154a93014
--- /dev/null
+++ b/go/op_exporter/version/version.go
@@ -0,0 +1,22 @@
+package version
+
+import (
+ "fmt"
+ "runtime"
+)
+
+var (
+ Version string
+ GitCommit string
+ BuildUser string
+ BuildDate string
+ GoVersion = runtime.Version()
+)
+
+func Info() string {
+ return fmt.Sprintf("(version=%s, gitcommit=%s)", Version, GitCommit)
+}
+
+func BuildContext() string {
+ return fmt.Sprintf("(go=%s, user=%s, date=%s)", GoVersion, BuildUser, BuildDate)
+}
diff --git a/go/utils/README.md b/go/utils/README.md
new file mode 100644
index 000000000000..ae7a13688a6f
--- /dev/null
+++ b/go/utils/README.md
@@ -0,0 +1,29 @@
+# utils
+
+This package is meant to hold utilities used by
+[Optimistic Ethereum](https://github.com/ethereum-optimism/optimism) written in
+Golang.
+
+## Packages
+
+### Fees
+
+Package fees includes helpers for dealing with fees on Optimistic Ethereum
+
+#### `EncodeTxGasLimit(data []byte, l1GasPrice, l2GasLimit, l2GasPrice *big.Int) *big.Int`
+
+Encodes `tx.gasLimit` based on the variables that are used to determine it.
+
+`data` - Calldata of the transaction being sent. This data should *not* include the full signed RLP transaction.
+
+`l1GasPrice` - gas price on L1 in wei
+
+`l2GasLimit` - amount of gas provided for execution in L2. Notably, accounts are charged for execution based on this gasLimit, even if the gasUsed ends up being less.
+
+`l2GasPrice` - gas price on L2 in wei
+
+#### `DecodeL2GasLimit(gasLimit *big.Int) *big.Int`
+
+Accepts the return value of `eth_estimateGas` and decodes the L2 gas limit that
+is encoded in the return value. This is the gas limit that is passed to the user
+contract within the OVM.
diff --git a/go/utils/fees/rollup_fee.go b/go/utils/fees/rollup_fee.go
new file mode 100644
index 000000000000..13feafbbdef7
--- /dev/null
+++ b/go/utils/fees/rollup_fee.go
@@ -0,0 +1,113 @@
+package fees
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+// overhead represents the fixed cost of batch submission of a single
+// transaction in gas.
+const overhead uint64 = 4200 + 200*params.TxDataNonZeroGasEIP2028
+
+// feeScalar is used to scale the calculations in EncodeL2GasLimit
+// to prevent them from being too large
+const feeScalar uint64 = 10_000_000
+
+// TxGasPrice is a constant that determines the result of `eth_gasPrice`
+// It is scaled upwards by 50%
+// tx.gasPrice is hard coded to 1500 * wei and all transactions must set that
+// gas price.
+const TxGasPrice uint64 = feeScalar + (feeScalar / 2)
+
+// BigTxGasPrice is the L2GasPrice as type big.Int
+var BigTxGasPrice = new(big.Int).SetUint64(TxGasPrice)
+var bigFeeScalar = new(big.Int).SetUint64(feeScalar)
+
+const tenThousand = 10000
+
+var BigTenThousand = new(big.Int).SetUint64(tenThousand)
+
+// EncodeTxGasLimit computes the `tx.gasLimit` based on the L1/L2 gas prices and
+// the L2 gas limit. The L2 gas limit is encoded inside of the lower order bits
+// of the number like so: [ | l2GasLimit ]
+// [ tx.gaslimit ]
+// The lower order bits must be large enough to fit the L2 gas limit, so 10**8
+// is chosen. If higher order bits collide with any bits from the L2 gas limit,
+// the L2 gas limit will not be able to be decoded.
+// An explicit design goal of this scheme was to make the L2 gas limit be human
+// readable. The entire number is interpreted as the gas limit when computing
+// the fee, so increasing the L2 Gas limit will increase the fee paid.
+// The calculation is:
+// l1GasLimit = zero_count(data) * 4 + non_zero_count(data) * 16 + overhead
+// roundedL2GasLimit = ceilmod(l2GasLimit, 10_000)
+// l1Fee = l1GasPrice * l1GasLimit
+// l2Fee = l2GasPrice * roundedL2GasLimit
+// sum = l1Fee + l2Fee
+// scaled = sum / scalar
+// rounded = ceilmod(scaled, tenThousand)
+// roundedScaledL2GasLimit = roundedL2GasLimit / tenThousand
+// result = rounded + roundedScaledL2GasLimit
+// Note that for simplicity purposes, only the calldata is passed into this
+// function when in reality the RLP encoded transaction should be. The
+// additional cost is added to the overhead constant to prevent the need to RLP
+// encode transactions during calls to `eth_estimateGas`
+func EncodeTxGasLimit(data []byte, l1GasPrice, l2GasLimit, l2GasPrice *big.Int) *big.Int {
+ l1GasLimit := calculateL1GasLimit(data, overhead)
+ roundedL2GasLimit := Ceilmod(l2GasLimit, BigTenThousand)
+ l1Fee := new(big.Int).Mul(l1GasPrice, l1GasLimit)
+ l2Fee := new(big.Int).Mul(l2GasPrice, roundedL2GasLimit)
+ sum := new(big.Int).Add(l1Fee, l2Fee)
+ scaled := new(big.Int).Div(sum, bigFeeScalar)
+ rounded := Ceilmod(scaled, BigTenThousand)
+ roundedScaledL2GasLimit := new(big.Int).Div(roundedL2GasLimit, BigTenThousand)
+ result := new(big.Int).Add(rounded, roundedScaledL2GasLimit)
+ return result
+}
+
+func Ceilmod(a, b *big.Int) *big.Int {
+ remainder := new(big.Int).Mod(a, b)
+ if remainder.Cmp(common.Big0) == 0 {
+ return a
+ }
+ sum := new(big.Int).Add(a, b)
+ rounded := new(big.Int).Sub(sum, remainder)
+ return rounded
+}
+
+// DecodeL2GasLimit decodes the L2 gas limit from an encoded L2 gas limit
+func DecodeL2GasLimit(gasLimit *big.Int) *big.Int {
+ scaled := new(big.Int).Mod(gasLimit, BigTenThousand)
+ return new(big.Int).Mul(scaled, BigTenThousand)
+}
+
+func DecodeL2GasLimitU64(gasLimit uint64) uint64 {
+ scaled := gasLimit % tenThousand
+ return scaled * tenThousand
+}
+
+// calculateL1GasLimit computes the L1 gasLimit based on the calldata and
+// constant sized overhead. The overhead can be decreased as the cost of the
+// batch submission goes down via contract optimizations. This will not overflow
+// under standard network conditions.
+func calculateL1GasLimit(data []byte, overhead uint64) *big.Int {
+ zeroes, ones := zeroesAndOnes(data)
+ zeroesCost := zeroes * params.TxDataZeroGas
+ onesCost := ones * params.TxDataNonZeroGasEIP2028
+ gasLimit := zeroesCost + onesCost + overhead
+ return new(big.Int).SetUint64(gasLimit)
+}
+
+func zeroesAndOnes(data []byte) (uint64, uint64) {
+ var zeroes uint64
+ var ones uint64
+ for _, byt := range data {
+ if byt == 0 {
+ zeroes++
+ } else {
+ ones++
+ }
+ }
+ return zeroes, ones
+}
diff --git a/go/utils/fees/rollup_fee_test.go b/go/utils/fees/rollup_fee_test.go
new file mode 100644
index 000000000000..254d418ad8fa
--- /dev/null
+++ b/go/utils/fees/rollup_fee_test.go
@@ -0,0 +1,104 @@
+package fees
+
+import (
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/params"
+)
+
+var l1GasLimitTests = map[string]struct {
+ data []byte
+ overhead uint64
+ expect *big.Int
+}{
+ "simple": {[]byte{}, 0, big.NewInt(0)},
+ "simple-overhead": {[]byte{}, 10, big.NewInt(10)},
+ "zeros": {[]byte{0x00, 0x00, 0x00, 0x00}, 10, big.NewInt(26)},
+ "ones": {[]byte{0x01, 0x02, 0x03, 0x04}, 200, big.NewInt(16*4 + 200)},
+}
+
+func TestL1GasLimit(t *testing.T) {
+ for name, tt := range l1GasLimitTests {
+ t.Run(name, func(t *testing.T) {
+ got := calculateL1GasLimit(tt.data, tt.overhead)
+ if got.Cmp(tt.expect) != 0 {
+ t.Fatal("Calculated gas limit does not match")
+ }
+ })
+ }
+}
+
+var feeTests = map[string]struct {
+ dataLen int
+ l1GasPrice uint64
+ l2GasLimit uint64
+ l2GasPrice uint64
+}{
+ "simple": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 437118,
+ l2GasPrice: params.GWei,
+ },
+ "zero-l2-gasprice": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 196205,
+ l2GasPrice: 0,
+ },
+ "one-l2-gasprice": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 196205,
+ l2GasPrice: 1,
+ },
+ "zero-l1-gasprice": {
+ dataLen: 10,
+ l1GasPrice: 0,
+ l2GasLimit: 196205,
+ l2GasPrice: params.GWei,
+ },
+ "one-l1-gasprice": {
+ dataLen: 10,
+ l1GasPrice: 1,
+ l2GasLimit: 23255,
+ l2GasPrice: params.GWei,
+ },
+ "zero-gasprices": {
+ dataLen: 10,
+ l1GasPrice: 0,
+ l2GasLimit: 23255,
+ l2GasPrice: 0,
+ },
+ "max-gaslimit": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 99_970_000,
+ l2GasPrice: params.GWei,
+ },
+ "larger-divisor": {
+ dataLen: 10,
+ l1GasPrice: 0,
+ l2GasLimit: 10,
+ l2GasPrice: 0,
+ },
+}
+
+func TestCalculateRollupFee(t *testing.T) {
+ for name, tt := range feeTests {
+ t.Run(name, func(t *testing.T) {
+ data := make([]byte, tt.dataLen)
+ l1GasPrice := new(big.Int).SetUint64(tt.l1GasPrice)
+ l2GasLimit := new(big.Int).SetUint64(tt.l2GasLimit)
+ l2GasPrice := new(big.Int).SetUint64(tt.l2GasPrice)
+
+ fee := EncodeTxGasLimit(data, l1GasPrice, l2GasLimit, l2GasPrice)
+ decodedGasLimit := DecodeL2GasLimit(fee)
+ roundedL2GasLimit := Ceilmod(l2GasLimit, BigTenThousand)
+ if roundedL2GasLimit.Cmp(decodedGasLimit) != 0 {
+ t.Errorf("rollup fee check failed: expected %d, got %d", l2GasLimit.Uint64(), decodedGasLimit)
+ }
+ })
+ }
+}
diff --git a/go/utils/go.mod b/go/utils/go.mod
new file mode 100644
index 000000000000..61d776bf5106
--- /dev/null
+++ b/go/utils/go.mod
@@ -0,0 +1,5 @@
+module github.com/ethereum-optimism/optimism/go/utils
+
+go 1.15
+
+require github.com/ethereum/go-ethereum v1.9.10
diff --git a/go/utils/go.sum b/go/utils/go.sum
new file mode 100644
index 000000000000..82868be88225
--- /dev/null
+++ b/go/utils/go.sum
@@ -0,0 +1,140 @@
+github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
+github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc=
+github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4=
+github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
+github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
+github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
+github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
+github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
+github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
+github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
+github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
+github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
+github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
+github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ=
+github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.0.1-0.20190104013014-3767db7a7e18/go.mod h1:HD5P3vAIAh+Y2GAxg0PrPN1P8WkepXGpjbUPDHJqqKM=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
+github.com/ethereum/go-ethereum v1.9.10 h1:jooX7tWcscpC7ytufk73t9JMCeJQ7aJF2YmZJQEuvFo=
+github.com/ethereum/go-ethereum v1.9.10/go.mod h1:lXHkVo/MTvsEXfYsmNzelZ8R1e0DTvdk/wMZJIRpaRw=
+github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
+github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag=
+github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
+github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
+github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
+github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
+github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
+github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
+github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
+github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
+github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw=
+github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
+github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
+gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
+gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
diff --git a/integration-tests/.env.example b/integration-tests/.env.example
new file mode 100644
index 000000000000..188301c4eb08
--- /dev/null
+++ b/integration-tests/.env.example
@@ -0,0 +1,6 @@
+# only need to fill these out if you want to test against a prod network
+PRIVATE_KEY=
+L1_URL=
+L2_URL=
+ADDRESS_MANAGER=
+L2_CHAINID=
diff --git a/integration-tests/.eslintrc.js b/integration-tests/.eslintrc.js
new file mode 100644
index 000000000000..a8adaf7b331a
--- /dev/null
+++ b/integration-tests/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: '../.eslintrc.js',
+}
diff --git a/integration-tests/CHANGELOG.md b/integration-tests/CHANGELOG.md
index d8e4f1c2f36b..be5960d8c951 100644
--- a/integration-tests/CHANGELOG.md
+++ b/integration-tests/CHANGELOG.md
@@ -1,5 +1,75 @@
# @eth-optimism/integration-tests
+## 0.2.1
+
+### Patch Changes
+
+- f1dc8b77: Add various stress tests
+
+## 0.2.0
+
+### Minor Changes
+
+- aa6fad84: Various updates to integration tests so that they can be executed against production networks
+
+## 0.1.2
+
+### Patch Changes
+
+- b107a032: Make expectApprox more readable by passing optional args as an object with well named keys
+
+## 0.1.1
+
+### Patch Changes
+
+- 40b99a6e: Add new RPC endpoint `rollup_gasPrices`
+
+## 0.1.0
+
+### Minor Changes
+
+- e04de624: Add support for ovmCALL with nonzero ETH value
+
+### Patch Changes
+
+- 25f09abd: Adds ERC1271 support to default contract account
+- 5fc728da: Add a new Standard Token Bridge, to handle deposits and withdrawals of any ERC20 token.
+ For projects developing a custom bridge, if you were previously importing `iAbs_BaseCrossDomainMessenger`, you should now
+ import `iOVM_CrossDomainMessenger`.
+- c43b33ec: Add WETH9 compatible deposit and withdraw functions to OVM_ETH
+- e045f582: Adds new SequencerFeeVault contract to store generated fees
+- b8e2d685: Add replica sync test to integration tests; handle 0 L2 blocks in DTL
+
+## 0.0.7
+
+### Patch Changes
+
+- d1680052: Reduce test timeout from 100 to 20 seconds
+- c2b6e14b: Implement the latest fee spec such that the L2 gas limit is scaled and the tx.gasPrice/tx.gasLimit show correctly in metamask
+- 77108d37: Add verifier sync test and extra docker-compose functions
+
+## 0.0.6
+
+### Patch Changes
+
+- f091e86: Fix to ensure that L1 => L2 success status is reflected correctly in receipts
+- f880479: End to end fee integration with recoverable L2 gas limit
+
+## 0.0.5
+
+### Patch Changes
+
+- 467d6cb: Adds a test for contract deployments that run out of gas
+
+## 0.0.4
+
+### Patch Changes
+
+- b799caa: Add support for parsed revert reasons in DoEstimateGas
+- b799caa: Update minimum response from estimate gas
+- b799caa: Add value transfer support to ECDSAContractAccount
+- b799caa: Update expected gas prices based on minimum of 21k value
+
## 0.0.3
### Patch Changes
diff --git a/packages/contracts/LICENSE.txt b/integration-tests/LICENSE
similarity index 92%
rename from packages/contracts/LICENSE.txt
rename to integration-tests/LICENSE
index 6389df6bc15c..6a7da5218bb2 100644
--- a/packages/contracts/LICENSE.txt
+++ b/integration-tests/LICENSE
@@ -1,6 +1,6 @@
(The MIT License)
-Copyright 2020 Optimism
+Copyright 2020-2021 Optimism
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/integration-tests/README.md b/integration-tests/README.md
new file mode 100644
index 000000000000..63ee36728961
--- /dev/null
+++ b/integration-tests/README.md
@@ -0,0 +1,31 @@
+# @eth-optimism/integration-tests
+
+## Setup
+
+Follow installation + build instructions in the [primary README](../README.md).
+Then, run:
+
+```bash
+yarn build:integration
+```
+
+## Running tests
+
+### Testing a live network
+
+Create an `.env` file and fill it out.
+Look at `.env.example` to know which variables to include.
+
+Once you have your environment set up, run:
+
+```bash
+yarn test:integration:live
+```
+
+You can also set environment variables on the command line instead of inside `.env` if you want:
+
+```bash
+L1_URL=whatever L2_URL=whatever yarn test:integration:live
+```
+
+Note that this can take an extremely long time (~1hr).
diff --git a/integration-tests/contracts/ConstructorReverter.sol b/integration-tests/contracts/ConstructorReverter.sol
new file mode 100644
index 000000000000..e8a284014010
--- /dev/null
+++ b/integration-tests/contracts/ConstructorReverter.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0;
+
+import { Reverter } from './Reverter.sol';
+
+contract ConstructorReverter is Reverter {
+ constructor() {
+ doRevert();
+ }
+}
diff --git a/integration-tests/contracts/ERC20.sol b/integration-tests/contracts/ERC20.sol
index d000f71722b6..610ea5d83480 100644
--- a/integration-tests/contracts/ERC20.sol
+++ b/integration-tests/contracts/ERC20.sol
@@ -33,7 +33,7 @@ contract ERC20 {
}
function transfer(address _to, uint256 _value) public returns (bool success) {
- require(balances[msg.sender] >= _value);
+ require(balances[msg.sender] >= _value, "insufficient balance");
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value);
diff --git a/integration-tests/contracts/Reverter.sol b/integration-tests/contracts/Reverter.sol
new file mode 100644
index 000000000000..d2d3921386df
--- /dev/null
+++ b/integration-tests/contracts/Reverter.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0;
+
+contract Reverter {
+ string constant public revertMessage = "This is a simple reversion.";
+
+ function doRevert() public pure {
+ revert(revertMessage);
+ }
+}
diff --git a/integration-tests/contracts/SimpleStorage.sol b/integration-tests/contracts/SimpleStorage.sol
index 2a12f43ea990..9735bbd161b5 100644
--- a/integration-tests/contracts/SimpleStorage.sol
+++ b/integration-tests/contracts/SimpleStorage.sol
@@ -18,6 +18,12 @@ contract SimpleStorage {
totalCount++;
}
+ function setValueNotXDomain(bytes32 newValue) public {
+ msgSender = msg.sender;
+ value = newValue;
+ totalCount++;
+ }
+
function dumbSetValue(bytes32 newValue) public {
value = newValue;
}
diff --git a/integration-tests/contracts/TestOOG.sol b/integration-tests/contracts/TestOOG.sol
new file mode 100644
index 000000000000..2f2a1377dfb1
--- /dev/null
+++ b/integration-tests/contracts/TestOOG.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0;
+
+contract TestOOG {
+ function runOutOfGas() public {
+ bytes32 h;
+ for (uint256 i = 0; i < 100000; i++) {
+ h = keccak256(abi.encodePacked(h));
+ }
+ }
+}
+
+contract TestOOGInConstructor is TestOOG {
+ constructor() {
+ runOutOfGas();
+ }
+}
diff --git a/integration-tests/contracts/ValueCalls.sol b/integration-tests/contracts/ValueCalls.sol
new file mode 100644
index 000000000000..e7de67f680ab
--- /dev/null
+++ b/integration-tests/contracts/ValueCalls.sol
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.7.0;
+
+contract ValueContext {
+ function getSelfBalance() external payable returns(uint256) {
+ uint selfBalance;
+ assembly {
+ selfBalance := selfbalance()
+ }
+ return selfBalance;
+ }
+
+ function getAddressThisBalance() external view returns(uint256) {
+ return address(this).balance;
+ }
+
+ function getBalance(
+ address _address
+ ) external payable returns(uint256) {
+ return _address.balance;
+ }
+
+ function getCallValue() public payable returns(uint256) {
+ return msg.value;
+ }
+}
+
+contract ValueCalls is ValueContext {
+ receive() external payable {}
+
+ function nonPayable() external {}
+
+ function simpleSend(
+ address _address,
+ uint _value
+ ) external payable returns (bool, bytes memory) {
+ return sendWithData(_address, _value, hex"");
+ }
+
+ function sendWithDataAndGas(
+ address _address,
+ uint _value,
+ uint _gasLimit,
+ bytes memory _calldata
+ ) public returns (bool, bytes memory) {
+ return _address.call{value: _value, gas: _gasLimit}(_calldata);
+ }
+
+ function sendWithData(
+ address _address,
+ uint _value,
+ bytes memory _calldata
+ ) public returns (bool, bytes memory) {
+ return _address.call{value: _value}(_calldata);
+ }
+
+ function verifyCallValueAndRevert(
+ uint256 _expectedValue
+ ) external payable {
+ bool correct = _checkCallValue(_expectedValue);
+ // do the opposite of expected if the value is wrong.
+ if (correct) {
+ revert("expected revert");
+ } else {
+ return;
+ }
+ }
+
+ function verifyCallValueAndReturn(
+ uint256 _expectedValue
+ ) external payable {
+ bool correct = _checkCallValue(_expectedValue);
+ // do the opposite of expected if the value is wrong.
+ if (correct) {
+ return;
+ } else {
+ revert("unexpected revert");
+ }
+ }
+
+ function delegateCallToCallValue(
+ address _valueContext
+ ) public payable returns(bool, bytes memory) {
+ bytes memory data = abi.encodeWithSelector(ValueContext.getCallValue.selector);
+ return _valueContext.delegatecall(data);
+ }
+
+ function delegateCallToAddressThisBalance(
+ address _valueContext
+ ) public payable returns(bool, bytes memory) {
+ bytes memory data = abi.encodeWithSelector(ValueContext.getAddressThisBalance.selector);
+ return _valueContext.delegatecall(data);
+ }
+
+ function _checkCallValue(
+ uint256 _expectedValue
+ ) internal returns(bool) {
+ return getCallValue() == _expectedValue;
+ }
+}
+
+contract ValueGasMeasurer {
+ function measureGasOfTransferingEthViaCall(
+ address target,
+ uint256 value,
+ uint256 gasLimit
+ ) public returns(uint256) {
+ uint256 gasBefore = gasleft();
+ assembly {
+ pop(call(gasLimit, target, value, 0, 0, 0, 0))
+ }
+ return gasBefore - gasleft();
+ }
+}
+
+contract PayableConstant {
+ function returnValue() external payable returns(uint256) {
+ return 42;
+ }
+}
+
+contract SendETHAwayAndDelegateCall {
+ function emptySelfAndDelegateCall(
+ address _delegateTo,
+ bytes memory _data
+ ) public payable returns (bool, bytes memory) {
+ address(0).call{value: address(this).balance}(_data);
+
+ return _delegateTo.delegatecall(_data);
+ }
+}
diff --git a/integration-tests/ext-test/snx.sh b/integration-tests/ext-test/snx.sh
new file mode 100755
index 000000000000..d02fc28e892d
--- /dev/null
+++ b/integration-tests/ext-test/snx.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+git clone --depth=1 --branch develop https://github.com/Synthetixio/synthetix.git
+cd synthetix
+npm install
+npx hardhat --config ./hardhat.config.js test:integration:l2 --compile --deploy
diff --git a/integration-tests/hardhat.config.ts b/integration-tests/hardhat.config.ts
index 722e35e9604b..c456cb75dd76 100644
--- a/integration-tests/hardhat.config.ts
+++ b/integration-tests/hardhat.config.ts
@@ -2,24 +2,30 @@ import { HardhatUserConfig } from 'hardhat/types'
// Hardhat plugins
import '@nomiclabs/hardhat-ethers'
+import '@nomiclabs/hardhat-waffle'
import '@eth-optimism/hardhat-ovm'
import 'hardhat-gas-reporter'
const enableGasReport = !!process.env.ENABLE_GAS_REPORT
const config: HardhatUserConfig = {
- mocha: {
- timeout: 100000,
- },
networks: {
optimism: {
url: process.env.L2_URL || 'http://localhost:8545',
ovm: true,
},
+ 'optimism-live': {
+ url: process.env.L2_URL || 'http://localhost:8545',
+ ovm: true,
+ timeout: 150000,
+ },
+ },
+ mocha: {
+ timeout: 50000,
},
solidity: '0.7.6',
ovm: {
- solcVersion: '0.7.6',
+ solcVersion: '0.7.6+commit.3b061308',
},
gasReporter: {
enabled: enableGasReport,
diff --git a/integration-tests/package.json b/integration-tests/package.json
index 712cff307d89..259d274e5ab3 100644
--- a/integration-tests/package.json
+++ b/integration-tests/package.json
@@ -1,41 +1,59 @@
{
"name": "@eth-optimism/integration-tests",
- "version": "0.0.3",
+ "version": "0.2.1",
"description": "[Optimism] Integration Tests",
"private": true,
"author": "Optimism PBC",
"license": "MIT",
"scripts": {
"lint": "yarn lint:fix && yarn lint:check",
- "lint:fix": "prettier --config ./.prettierrc.json --write 'test/**/*.ts'",
- "lint:check": "tslint --format stylish --project .",
+ "lint:fix": "yarn lint:check --fix",
+ "lint:check": "eslint .",
"build:integration": "./scripts/build.sh",
"build:contracts": "hardhat compile",
"build:contracts:ovm": "hardhat compile --network optimism",
"test:integration": "hardhat --network optimism test",
+ "test:integration:live": "IS_LIVE_NETWORK=true hardhat --network optimism-live test",
+ "test:sync": "hardhat --network optimism test sync-tests/*.spec.ts --no-compile",
"clean": "rimraf cache artifacts artifacts-ovm cache-ovm"
},
"devDependencies": {
- "@eth-optimism/contracts": "^0.2.9",
- "@eth-optimism/core-utils": "^0.4.0",
- "@eth-optimism/hardhat-ovm": "^0.1.1",
+ "@eth-optimism/contracts": "^0.4.3",
+ "@eth-optimism/core-utils": "^0.5.0",
+ "@eth-optimism/hardhat-ovm": "^0.2.2",
+ "@eth-optimism/message-relayer": "^0.1.6",
"@ethersproject/providers": "^5.0.24",
"@nomiclabs/hardhat-ethers": "^2.0.2",
- "@types/chai-as-promised": "^7.1.3",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
"@types/chai": "^4.2.17",
+ "@types/chai-as-promised": "^7.1.3",
"@types/mocha": "^8.2.2",
"@types/rimraf": "^3.0.0",
"@types/shelljs": "^0.8.8",
+ "@typescript-eslint/eslint-plugin": "^4.26.0",
+ "@typescript-eslint/parser": "^4.26.0",
"chai": "^4.3.3",
"chai-as-promised": "^7.1.1",
"docker-compose": "^0.23.8",
+ "dotenv": "^10.0.0",
"envalid": "^7.1.0",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.27.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-ban": "^1.5.2",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-jsdoc": "^35.1.2",
+ "eslint-plugin-prefer-arrow": "^1.2.3",
+ "eslint-plugin-react": "^7.24.0",
+ "eslint-plugin-unicorn": "^32.0.1",
"ethereum-waffle": "^3.3.0",
"ethers": "^5.0.32",
"hardhat": "^2.2.1",
"hardhat-gas-reporter": "^1.0.4",
"mocha": "^8.3.1",
"rimraf": "^3.0.2",
- "shelljs": "^0.8.4"
+ "shelljs": "^0.8.4",
+ "typescript": "^4.2.3"
}
}
diff --git a/integration-tests/sync-tests/1-sync-verifier.spec.ts b/integration-tests/sync-tests/1-sync-verifier.spec.ts
new file mode 100644
index 000000000000..0abe8d69f9c5
--- /dev/null
+++ b/integration-tests/sync-tests/1-sync-verifier.spec.ts
@@ -0,0 +1,108 @@
+import chai, { expect } from 'chai'
+import { Wallet, BigNumber, providers } from 'ethers'
+import { injectL2Context } from '@eth-optimism/core-utils'
+
+import {
+ sleep,
+ l2Provider,
+ verifierProvider,
+ waitForL2Geth,
+} from '../test/shared/utils'
+import { OptimismEnv } from '../test/shared/env'
+import { DockerComposeNetwork } from '../test/shared/docker-compose'
+
+describe('Syncing a verifier', () => {
+ let env: OptimismEnv
+ let wallet: Wallet
+ let verifier: DockerComposeNetwork
+ let provider: providers.JsonRpcProvider
+
+ const sequencerProvider = injectL2Context(l2Provider)
+
+ /* Helper functions */
+
+ const waitForBatchSubmission = async (
+ totalElementsBefore: BigNumber
+ ): Promise => {
+ // Wait for batch submission to happen by watching the CTC
+ let totalElementsAfter = (await env.ctc.getTotalElements()) as BigNumber
+ while (totalElementsBefore.eq(totalElementsAfter)) {
+ await sleep(500)
+ totalElementsAfter = (await env.ctc.getTotalElements()) as BigNumber
+ }
+ return totalElementsAfter
+ }
+
+ const startVerifier = async () => {
+ // Bring up new verifier
+ verifier = new DockerComposeNetwork(['verifier'])
+ await verifier.up({ commandOptions: ['--scale', 'verifier=1'] })
+
+ provider = await waitForL2Geth(verifierProvider)
+ }
+
+ const syncVerifier = async (sequencerBlockNumber: number) => {
+ // Wait until verifier has caught up to the sequencer
+ let latestVerifierBlock = (await provider.getBlock('latest')) as any
+ while (latestVerifierBlock.number < sequencerBlockNumber) {
+ await sleep(500)
+ latestVerifierBlock = (await provider.getBlock('latest')) as any
+ }
+
+ return provider.getBlock(sequencerBlockNumber)
+ }
+
+ before(async () => {
+ env = await OptimismEnv.new()
+ wallet = env.l2Wallet
+ })
+
+ describe('Basic transactions', () => {
+ after(async () => {
+ await verifier.stop('verifier')
+ await verifier.rm()
+ })
+
+ it('should sync dummy transaction', async () => {
+ const totalElementsBefore =
+ (await env.ctc.getTotalElements()) as BigNumber
+
+ const tx = {
+ to: '0x' + '1234'.repeat(10),
+ gasLimit: 4000000,
+ gasPrice: 0,
+ data: '0x',
+ value: 0,
+ }
+ const result = await wallet.sendTransaction(tx)
+ await result.wait()
+
+ const totalElementsAfter = await waitForBatchSubmission(
+ totalElementsBefore
+ )
+ expect(totalElementsAfter.gt(totalElementsAfter))
+
+ const latestSequencerBlock = (await sequencerProvider.getBlock(
+ 'latest'
+ )) as any
+
+ await startVerifier()
+
+ const matchingVerifierBlock = (await syncVerifier(
+ latestSequencerBlock.number
+ )) as any
+
+ expect(matchingVerifierBlock.stateRoot).to.eq(
+ latestSequencerBlock.stateRoot
+ )
+ })
+
+ it('should have matching block data', async () => {
+ const sequencerTip = await sequencerProvider.getBlock('latest')
+ const verifierTip = await provider.getBlock('latest')
+
+ expect(sequencerTip.number).to.deep.eq(verifierTip.number)
+ expect(sequencerTip.hash).to.deep.eq(verifierTip.hash)
+ })
+ })
+})
diff --git a/integration-tests/sync-tests/2-sync-replica.spec.ts b/integration-tests/sync-tests/2-sync-replica.spec.ts
new file mode 100644
index 000000000000..ae8a108fbd03
--- /dev/null
+++ b/integration-tests/sync-tests/2-sync-replica.spec.ts
@@ -0,0 +1,119 @@
+import chai, { expect } from 'chai'
+import { Wallet, Contract, ContractFactory, providers } from 'ethers'
+import { ethers } from 'hardhat'
+import { injectL2Context } from '@eth-optimism/core-utils'
+
+import {
+ sleep,
+ l2Provider,
+ replicaProvider,
+ waitForL2Geth,
+} from '../test/shared/utils'
+import { OptimismEnv } from '../test/shared/env'
+import { DockerComposeNetwork } from '../test/shared/docker-compose'
+
+describe('Syncing a replica', () => {
+ let env: OptimismEnv
+ let wallet: Wallet
+ let replica: DockerComposeNetwork
+ let provider: providers.JsonRpcProvider
+
+ const sequencerProvider = injectL2Context(l2Provider)
+
+ /* Helper functions */
+
+ const startReplica = async () => {
+ // Bring up new replica
+ replica = new DockerComposeNetwork(['replica'])
+ await replica.up({
+ commandOptions: ['--scale', 'replica=1'],
+ })
+
+ provider = await waitForL2Geth(replicaProvider)
+ }
+
+ const syncReplica = async (sequencerBlockNumber: number) => {
+ // Wait until replica has caught up to the sequencer
+ let latestReplicaBlock = (await provider.getBlock('latest')) as any
+ while (latestReplicaBlock.number < sequencerBlockNumber) {
+ await sleep(500)
+ latestReplicaBlock = (await provider.getBlock('latest')) as any
+ }
+
+ return provider.getBlock(sequencerBlockNumber)
+ }
+
+ before(async () => {
+ env = await OptimismEnv.new()
+ wallet = env.l2Wallet
+ })
+
+ after(async () => {
+ await replica.stop('replica')
+ await replica.rm()
+ })
+
+ describe('Basic transactions and ERC20s', () => {
+ const initialAmount = 1000
+ const tokenName = 'OVM Test'
+ const tokenDecimals = 8
+ const TokenSymbol = 'OVM'
+
+ let other: Wallet
+ let Factory__ERC20: ContractFactory
+ let ERC20: Contract
+
+ before(async () => {
+ other = Wallet.createRandom().connect(ethers.provider)
+ Factory__ERC20 = await ethers.getContractFactory('ERC20', wallet)
+ })
+
+ it('should sync dummy transaction', async () => {
+ const tx = {
+ to: '0x' + '1234'.repeat(10),
+ gasLimit: 4000000,
+ gasPrice: 0,
+ data: '0x',
+ value: 0,
+ }
+ const result = await wallet.sendTransaction(tx)
+ await result.wait()
+
+ const latestSequencerBlock = (await sequencerProvider.getBlock(
+ 'latest'
+ )) as any
+
+ await startReplica()
+
+ const matchingReplicaBlock = (await syncReplica(
+ latestSequencerBlock.number
+ )) as any
+
+ expect(matchingReplicaBlock.stateRoot).to.eq(
+ latestSequencerBlock.stateRoot
+ )
+ })
+
+ it('should sync ERC20 deployment and transfer', async () => {
+ ERC20 = await Factory__ERC20.deploy(
+ initialAmount,
+ tokenName,
+ tokenDecimals,
+ TokenSymbol
+ )
+
+ const transfer = await ERC20.transfer(other.address, 100)
+ await transfer.wait()
+
+ const latestSequencerBlock = (await provider.getBlock('latest')) as any
+
+ const matchingReplicaBlock = (await syncReplica(
+ latestSequencerBlock.number
+ )) as any
+
+ expect(matchingReplicaBlock.stateRoot).to.eq(
+ latestSequencerBlock.stateRoot
+ )
+ })
+ })
+})
diff --git a/integration-tests/test/basic-l1-l2-communication.spec.ts b/integration-tests/test/basic-l1-l2-communication.spec.ts
index 0af0cb1339cd..9eda61599e10 100644
--- a/integration-tests/test/basic-l1-l2-communication.spec.ts
+++ b/integration-tests/test/basic-l1-l2-communication.spec.ts
@@ -1,19 +1,23 @@
import { expect } from 'chai'
/* Imports: External */
-import { Contract, ContractFactory, utils } from 'ethers'
-import { Direction } from './shared/watcher-utils'
+import { Contract, ContractFactory } from 'ethers'
+import { predeploys, getContractInterface } from '@eth-optimism/contracts'
/* Imports: Internal */
import l1SimpleStorageJson from '../artifacts/contracts/SimpleStorage.sol/SimpleStorage.json'
import l2SimpleStorageJson from '../artifacts-ovm/contracts/SimpleStorage.sol/SimpleStorage.json'
-import { OptimismEnv } from './shared/env'
+import l2ReverterJson from '../artifacts-ovm/contracts/Reverter.sol/Reverter.json'
+import { Direction } from './shared/watcher-utils'
+import { OptimismEnv, useDynamicTimeoutForWithdrawals } from './shared/env'
describe('Basic L1<>L2 Communication', async () => {
let Factory__L1SimpleStorage: ContractFactory
let Factory__L2SimpleStorage: ContractFactory
+ let Factory__L2Reverter: ContractFactory
let L1SimpleStorage: Contract
let L2SimpleStorage: Contract
+ let L2Reverter: Contract
let env: OptimismEnv
before(async () => {
@@ -28,6 +32,11 @@ describe('Basic L1<>L2 Communication', async () => {
l2SimpleStorageJson.bytecode,
env.l2Wallet
)
+ Factory__L2Reverter = new ContractFactory(
+ l2ReverterJson.abi,
+ l2ReverterJson.bytecode,
+ env.l2Wallet
+ )
})
beforeEach(async () => {
@@ -35,41 +44,126 @@ describe('Basic L1<>L2 Communication', async () => {
await L1SimpleStorage.deployTransaction.wait()
L2SimpleStorage = await Factory__L2SimpleStorage.deploy()
await L2SimpleStorage.deployTransaction.wait()
+ L2Reverter = await Factory__L2Reverter.deploy()
+ await L2Reverter.deployTransaction.wait()
})
- it('should withdraw from L2 -> L1', async () => {
- const value = `0x${'77'.repeat(32)}`
+ describe('L2 => L1', () => {
+ it('should be able to perform a withdrawal from L2 -> L1', async function () {
+ await useDynamicTimeoutForWithdrawals(this, env)
- // Send L2 -> L1 message.
- const transaction = await env.l2Messenger.sendMessage(
- L1SimpleStorage.address,
- L1SimpleStorage.interface.encodeFunctionData('setValue', [value]),
- 5000000
- )
+ const value = `0x${'77'.repeat(32)}`
- await env.waitForXDomainTransaction(transaction, Direction.L2ToL1)
+ // Send L2 -> L1 message.
+ const transaction = await env.l2Messenger.sendMessage(
+ L1SimpleStorage.address,
+ L1SimpleStorage.interface.encodeFunctionData('setValue', [value]),
+ 5000000
+ )
+ await transaction.wait()
+ await env.relayXDomainMessages(transaction)
+ await env.waitForXDomainTransaction(transaction, Direction.L2ToL1)
- expect(await L1SimpleStorage.msgSender()).to.equal(env.l1Messenger.address)
- expect(await L1SimpleStorage.xDomainSender()).to.equal(env.l2Wallet.address)
- expect(await L1SimpleStorage.value()).to.equal(value)
- expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(1)
+ expect(await L1SimpleStorage.msgSender()).to.equal(
+ env.l1Messenger.address
+ )
+ expect(await L1SimpleStorage.xDomainSender()).to.equal(
+ env.l2Wallet.address
+ )
+ expect(await L1SimpleStorage.value()).to.equal(value)
+ expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(1)
+ })
})
- it('should deposit from L1 -> L2', async () => {
- const value = `0x${'42'.repeat(32)}`
+ describe('L1 => L2', () => {
+ it('should deposit from L1 -> L2', async () => {
+ const value = `0x${'42'.repeat(32)}`
- // Send L1 -> L2 message.
- const transaction = await env.l1Messenger.sendMessage(
- L2SimpleStorage.address,
- L2SimpleStorage.interface.encodeFunctionData('setValue', [value]),
- 5000000
- )
+ // Send L1 -> L2 message.
+ const transaction = await env.l1Messenger.sendMessage(
+ L2SimpleStorage.address,
+ L2SimpleStorage.interface.encodeFunctionData('setValue', [value]),
+ 5000000
+ )
+
+ await env.waitForXDomainTransaction(transaction, Direction.L1ToL2)
+
+ expect(await L2SimpleStorage.msgSender()).to.equal(
+ env.l2Messenger.address
+ )
+ expect(await L2SimpleStorage.xDomainSender()).to.equal(
+ env.l1Wallet.address
+ )
+ expect(await L2SimpleStorage.value()).to.equal(value)
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(1)
+ })
+
+ it('should have a receipt with a status of 1 for a successful message', async () => {
+ const value = `0x${'42'.repeat(32)}`
+
+ // Send L1 -> L2 message.
+ const transaction = await env.l1Messenger.sendMessage(
+ L2SimpleStorage.address,
+ L2SimpleStorage.interface.encodeFunctionData('setValue', [value]),
+ 5000000
+ )
+
+ const { remoteReceipt } = await env.waitForXDomainTransaction(
+ transaction,
+ Direction.L1ToL2
+ )
+
+ expect(remoteReceipt.status).to.equal(1)
+ })
+
+ it('should have a receipt with a status of 0 for a failed message', async () => {
+ // Send L1 -> L2 message.
+ const transaction = await env.l1Messenger.sendMessage(
+ L2Reverter.address,
+ L2Reverter.interface.encodeFunctionData('doRevert', []),
+ 5000000
+ )
+
+ const { remoteReceipt } = await env.waitForXDomainTransaction(
+ transaction,
+ Direction.L1ToL2
+ )
+
+ expect(remoteReceipt.status).to.equal(0)
+ })
+
+ it('should have a receipt with a status of 0 for messages sent to 0x42... addresses', async () => {
+ // This call is fine but will give a status of 0.
+ const transaction = await env.l1Messenger.sendMessage(
+ predeploys.Lib_AddressManager,
+ getContractInterface('Lib_AddressManager').encodeFunctionData(
+ 'getAddress',
+ ['whatever']
+ ),
+ 5000000
+ )
+
+ const { remoteReceipt } = await env.waitForXDomainTransaction(
+ transaction,
+ Direction.L1ToL2
+ )
+
+ expect(remoteReceipt.status).to.equal(0)
+ })
+
+ it('should have a receipt with a status of 0 for messages sent to 0xdead... addresses', async () => {
+ const transaction = await env.l1Messenger.sendMessage(
+ '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000',
+ '0x',
+ 5000000
+ )
- await env.waitForXDomainTransaction(transaction, Direction.L1ToL2)
+ const { remoteReceipt } = await env.waitForXDomainTransaction(
+ transaction,
+ Direction.L1ToL2
+ )
- expect(await L2SimpleStorage.msgSender()).to.equal(env.l2Messenger.address)
- expect(await L2SimpleStorage.xDomainSender()).to.equal(env.l1Wallet.address)
- expect(await L2SimpleStorage.value()).to.equal(value)
- expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(1)
+ expect(remoteReceipt.status).to.equal(0)
+ })
})
})
diff --git a/integration-tests/test/erc20.spec.ts b/integration-tests/test/erc20.spec.ts
index 9eb7105ee0de..1c03476592a2 100644
--- a/integration-tests/test/erc20.spec.ts
+++ b/integration-tests/test/erc20.spec.ts
@@ -1,8 +1,12 @@
import { Contract, ContractFactory, Wallet } from 'ethers'
import { ethers } from 'hardhat'
-import { expect } from 'chai'
+import { TxGasLimit, TxGasPrice } from '@eth-optimism/core-utils'
+import chai, { expect } from 'chai'
import { GWEI } from './shared/utils'
import { OptimismEnv } from './shared/env'
+import { solidity } from 'ethereum-waffle'
+
+chai.use(solidity)
describe('Basic ERC20 interactions', async () => {
const initialAmount = 1000
@@ -60,11 +64,11 @@ describe('Basic ERC20 interactions', async () => {
const transfer = await ERC20.transfer(other.address, 100)
const receipt = await transfer.wait()
- // The expected fee paid is the value returned by eth_estimateGas gas multiplied
- // by 1 gwei, since that's the value eth_gasPrice always returns
- const expectedFeePaid = (
- await ERC20.estimateGas.transfer(other.address, 100)
- ).mul(GWEI)
+ // The expected fee paid is the value returned by eth_estimateGas
+ const gasLimit = await ERC20.estimateGas.transfer(other.address, 100)
+ const gasPrice = await wallet.getGasPrice()
+ expect(gasPrice).to.deep.equal(TxGasPrice)
+ const expectedFeePaid = gasLimit.mul(gasPrice)
// There are two events from the transfer with the first being
// the ETH fee paid and the second of the value transfered (100)
@@ -79,4 +83,10 @@ describe('Basic ERC20 interactions', async () => {
expect(receiverBalance.toNumber()).to.equal(100)
expect(senderBalance.toNumber()).to.equal(900)
})
+
+ it('should revert if trying to transfer too much', async () => {
+ await expect(
+ ERC20.transfer(other.address, initialAmount * 2)
+ ).to.be.revertedWith('insufficient balance')
+ })
})
diff --git a/integration-tests/test/fee-payment.spec.ts b/integration-tests/test/fee-payment.spec.ts
index 2005c57513c2..952c755f2676 100644
--- a/integration-tests/test/fee-payment.spec.ts
+++ b/integration-tests/test/fee-payment.spec.ts
@@ -1,37 +1,124 @@
import chai, { expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
chai.use(chaiAsPromised)
-import { BigNumber, utils } from 'ethers'
+
+/* Imports: External */
+import { ethers, BigNumber, Contract, utils } from 'ethers'
+import { TxGasLimit, TxGasPrice } from '@eth-optimism/core-utils'
+import { predeploys, getContractInterface } from '@eth-optimism/contracts'
+
+/* Imports: Internal */
+import { IS_LIVE_NETWORK } from './shared/utils'
import { OptimismEnv } from './shared/env'
+import { Direction } from './shared/watcher-utils'
describe('Fee Payment Integration Tests', async () => {
- let env: OptimismEnv
const other = '0x1234123412341234123412341234123412341234'
+ let env: OptimismEnv
before(async () => {
env = await OptimismEnv.new()
})
- it('Paying a nonzero but acceptable gasPrice fee', async () => {
- const amount = utils.parseEther('0.5')
+ let ovmSequencerFeeVault: Contract
+ before(async () => {
+ ovmSequencerFeeVault = new Contract(
+ predeploys.OVM_SequencerFeeVault,
+ getContractInterface('OVM_SequencerFeeVault'),
+ env.l2Wallet
+ )
+ })
+ it(`Should return a gasPrice of ${TxGasPrice.toString()} wei`, async () => {
+ const gasPrice = await env.l2Wallet.getGasPrice()
+ expect(gasPrice).to.deep.eq(TxGasPrice)
+ })
+
+ it('Should estimateGas with recoverable L2 gasLimit', async () => {
+ const gas = await env.ovmEth.estimateGas.transfer(
+ other,
+ utils.parseEther('0.0000001')
+ )
+ const tx = await env.ovmEth.populateTransaction.transfer(
+ other,
+ utils.parseEther('0.0000001')
+ )
+ const executionGas = await (env.ovmEth.provider as any).send(
+ 'eth_estimateExecutionGas',
+ [tx, true]
+ )
+ const decoded = TxGasLimit.decode(gas)
+ expect(BigNumber.from(executionGas)).deep.eq(decoded)
+ })
+
+ it('Paying a nonzero but acceptable gasPrice fee', async () => {
+ const amount = utils.parseEther('0.0000001')
const balanceBefore = await env.l2Wallet.getBalance()
+ const feeVaultBalanceBefore = await env.l2Wallet.provider.getBalance(
+ ovmSequencerFeeVault.address
+ )
+ expect(balanceBefore.gt(amount))
+
const tx = await env.ovmEth.transfer(other, amount)
- await tx.wait()
+ const receipt = await tx.wait()
+ expect(receipt.status).to.eq(1)
+
const balanceAfter = await env.l2Wallet.getBalance()
- // TODO: The fee paid MUST be the receipt.gasUsed, and not the tx.gasLimit
+ const feeVaultBalanceAfter = await env.l2Wallet.provider.getBalance(
+ ovmSequencerFeeVault.address
+ )
+ const expectedFeePaid = tx.gasPrice.mul(tx.gasLimit)
+
+ // The fee paid MUST be the receipt.gasUsed, and not the tx.gasLimit
// https://github.com/ethereum-optimism/optimism/blob/0de7a2f9c96a7c4860658822231b2d6da0fefb1d/packages/contracts/contracts/optimistic-ethereum/OVM/accounts/OVM_ECDSAContractAccount.sol#L103
- expect(balanceBefore.sub(balanceAfter)).to.be.deep.eq(
- tx.gasPrice.mul(tx.gasLimit).add(amount)
+ expect(balanceBefore.sub(balanceAfter)).to.deep.equal(
+ expectedFeePaid.add(amount)
+ )
+
+ // Make sure the fee was transferred to the vault.
+ expect(feeVaultBalanceAfter.sub(feeVaultBalanceBefore)).to.deep.equal(
+ expectedFeePaid
)
})
- it('sequencer rejects transaction with a non-multiple-of-1M gasPrice', async () => {
- const gasPrice = BigNumber.from(1_000_000 - 1)
- await expect(
- env.ovmEth.transfer(other, 0, { gasPrice })
- ).to.be.eventually.rejectedWith(
- 'Gas price must be a multiple of 1,000,000 wei'
+ it('should not be able to withdraw fees before the minimum is met', async () => {
+ await expect(ovmSequencerFeeVault.withdraw()).to.be.rejected
+ })
+
+ it('should be able to withdraw fees back to L1 once the minimum is met', async function () {
+ const l1FeeWallet = await ovmSequencerFeeVault.l1FeeWallet()
+ const balanceBefore = await env.l1Wallet.provider.getBalance(l1FeeWallet)
+ const withdrawalAmount = await ovmSequencerFeeVault.MIN_WITHDRAWAL_AMOUNT()
+
+ const l2WalletBalance = await env.l2Wallet.getBalance()
+ if (IS_LIVE_NETWORK && l2WalletBalance.lt(withdrawalAmount)) {
+ console.log(
+ `NOTICE: must have at least ${ethers.utils.formatEther(
+ withdrawalAmount
+ )} ETH on L2 to execute this test, skipping`
+ )
+ this.skip()
+ }
+
+ // Transfer the minimum required to withdraw.
+ await env.ovmEth.transfer(ovmSequencerFeeVault.address, withdrawalAmount)
+
+ const vaultBalance = await env.ovmEth.balanceOf(
+ ovmSequencerFeeVault.address
+ )
+
+ // Submit the withdrawal.
+ const withdrawTx = await ovmSequencerFeeVault.withdraw({
+ gasPrice: 0, // Need a gasprice of 0 or the balances will include the fee paid during this tx.
+ })
+
+ // Wait for the withdrawal to be relayed to L1.
+ await env.waitForXDomainTransaction(withdrawTx, Direction.L2ToL1)
+
+ // Balance difference should be equal to old L2 balance.
+ const balanceAfter = await env.l1Wallet.provider.getBalance(l1FeeWallet)
+ expect(balanceAfter.sub(balanceBefore)).to.deep.equal(
+ BigNumber.from(vaultBalance)
)
})
})
diff --git a/integration-tests/test/native-eth-ovm-calls.spec.ts b/integration-tests/test/native-eth-ovm-calls.spec.ts
new file mode 100644
index 000000000000..d8ef9bdee7b2
--- /dev/null
+++ b/integration-tests/test/native-eth-ovm-calls.spec.ts
@@ -0,0 +1,442 @@
+import { BigNumber, Contract, ContractFactory, Wallet } from 'ethers'
+import { ethers } from 'hardhat'
+import chai, { expect } from 'chai'
+import { GWEI, fundUser, encodeSolidityRevertMessage } from './shared/utils'
+import { OptimismEnv } from './shared/env'
+import { solidity } from 'ethereum-waffle'
+import { sleep } from '../../packages/core-utils/dist'
+import {
+ getContractFactory,
+ getContractInterface,
+} from '../../packages/contracts/dist'
+import { Interface } from 'ethers/lib/utils'
+
+chai.use(solidity)
+
+describe('Native ETH value integration tests', () => {
+ let env: OptimismEnv
+ let wallet: Wallet
+ let other: Wallet
+
+ before(async () => {
+ env = await OptimismEnv.new()
+ wallet = env.l2Wallet
+ other = Wallet.createRandom().connect(wallet.provider)
+ })
+
+ it('should allow an L2 EOA to send to a new account and back again', async () => {
+ const getBalances = async (): Promise => {
+ return [
+ await wallet.provider.getBalance(wallet.address),
+ await wallet.provider.getBalance(other.address),
+ ]
+ }
+
+ const checkBalances = async (
+ expectedBalances: BigNumber[]
+ ): Promise => {
+ const realBalances = await getBalances()
+ expect(realBalances[0]).to.deep.eq(expectedBalances[0])
+ expect(realBalances[1]).to.deep.eq(expectedBalances[1])
+ }
+
+ const value = 10
+ await fundUser(env.watcher, env.l1Bridge, value, wallet.address)
+
+ const initialBalances = await getBalances()
+
+ const there = await wallet.sendTransaction({
+ to: other.address,
+ value,
+ gasPrice: 0,
+ })
+ await there.wait()
+
+ await checkBalances([
+ initialBalances[0].sub(value),
+ initialBalances[1].add(value),
+ ])
+
+ const backAgain = await other.sendTransaction({
+ to: wallet.address,
+ value,
+ gasPrice: 0,
+ })
+ await backAgain.wait()
+
+ await checkBalances(initialBalances)
+ })
+
+ describe(`calls between OVM contracts with native ETH value and relevant opcodes`, async () => {
+ const initialBalance0 = 42000
+
+ let Factory__ValueCalls: ContractFactory
+ let ValueCalls0: Contract
+ let ValueCalls1: Contract
+
+ const checkBalances = async (expectedBalances: number[]) => {
+ // query geth as one check
+ const balance0 = await wallet.provider.getBalance(ValueCalls0.address)
+ const balance1 = await wallet.provider.getBalance(ValueCalls1.address)
+ expect(balance0).to.deep.eq(BigNumber.from(expectedBalances[0]))
+ expect(balance1).to.deep.eq(BigNumber.from(expectedBalances[1]))
+ // query ovmBALANCE() opcode via eth_call as another check
+ const ovmBALANCE0 = await ValueCalls0.callStatic.getBalance(
+ ValueCalls0.address
+ )
+ const ovmBALANCE1 = await ValueCalls0.callStatic.getBalance(
+ ValueCalls1.address
+ )
+ expect(ovmBALANCE0).to.deep.eq(
+ BigNumber.from(expectedBalances[0]),
+ 'geth RPC does not match ovmBALANCE'
+ )
+ expect(ovmBALANCE1).to.deep.eq(
+ BigNumber.from(expectedBalances[1]),
+ 'geth RPC does not match ovmBALANCE'
+ )
+ // query ovmSELFBALANCE() opcode via eth_call as another check
+ const ovmSELFBALANCE0 = await ValueCalls0.callStatic.getSelfBalance()
+ const ovmSELFBALANCE1 = await ValueCalls1.callStatic.getSelfBalance()
+ expect(ovmSELFBALANCE0).to.deep.eq(
+ BigNumber.from(expectedBalances[0]),
+ 'geth RPC does not match ovmSELFBALANCE'
+ )
+ expect(ovmSELFBALANCE1).to.deep.eq(
+ BigNumber.from(expectedBalances[1]),
+ 'geth RPC does not match ovmSELFBALANCE'
+ )
+ // query ovmSELFBALANCE() opcode via eth_call as another check
+ const ovmEthBalanceOf0 = await env.ovmEth.balanceOf(ValueCalls0.address)
+ const ovmEthBalanceOf1 = await env.ovmEth.balanceOf(ValueCalls1.address)
+ expect(ovmEthBalanceOf0).to.deep.eq(
+ BigNumber.from(expectedBalances[0]),
+ 'geth RPC does not match OVM_ETH.balanceOf'
+ )
+ expect(ovmEthBalanceOf1).to.deep.eq(
+ BigNumber.from(expectedBalances[1]),
+ 'geth RPC does not match OVM_ETH.balanceOf'
+ )
+ // query address(this).balance solidity via eth_call as final check
+ const ovmAddressThisBalance0 =
+ await ValueCalls0.callStatic.getAddressThisBalance()
+ const ovmAddressThisBalance01 =
+ await ValueCalls1.callStatic.getAddressThisBalance()
+ expect(ovmAddressThisBalance0).to.deep.eq(
+ BigNumber.from(expectedBalances[0]),
+ 'geth RPC does not match address(this).balance'
+ )
+ expect(ovmAddressThisBalance01).to.deep.eq(
+ BigNumber.from(expectedBalances[1]),
+ 'geth RPC does not match address(this).balance'
+ )
+ }
+
+ before(async () => {
+ Factory__ValueCalls = await ethers.getContractFactory(
+ 'ValueCalls',
+ wallet
+ )
+ })
+
+ beforeEach(async () => {
+ ValueCalls0 = await Factory__ValueCalls.deploy()
+ ValueCalls1 = await Factory__ValueCalls.deploy()
+ await fundUser(
+ env.watcher,
+ env.l1Bridge,
+ initialBalance0,
+ ValueCalls0.address
+ )
+ // These tests ass assume ValueCalls0 starts with a balance, but ValueCalls1 does not.
+ await checkBalances([initialBalance0, 0])
+ })
+
+ it('should allow ETH to be sent', async () => {
+ const sendAmount = 15
+ const tx = await ValueCalls0.simpleSend(ValueCalls1.address, sendAmount, {
+ gasPrice: 0,
+ })
+ await tx.wait()
+
+ await checkBalances([initialBalance0 - sendAmount, sendAmount])
+ })
+
+ it('should revert if a function is nonpayable', async () => {
+ const sendAmount = 15
+ const [success, returndata] = await ValueCalls0.callStatic.sendWithData(
+ ValueCalls1.address,
+ sendAmount,
+ ValueCalls1.interface.encodeFunctionData('nonPayable')
+ )
+
+ expect(success).to.be.false
+ expect(returndata).to.eq('0x')
+ })
+
+ it('should allow ETH to be sent and have the correct ovmCALLVALUE', async () => {
+ const sendAmount = 15
+ const [success, returndata] = await ValueCalls0.callStatic.sendWithData(
+ ValueCalls1.address,
+ sendAmount,
+ ValueCalls1.interface.encodeFunctionData('getCallValue')
+ )
+
+ expect(success).to.be.true
+ expect(BigNumber.from(returndata)).to.deep.eq(BigNumber.from(sendAmount))
+ })
+
+ it('should have the correct ovmSELFBALANCE which includes the msg.value', async () => {
+ // give an initial balance which the ovmCALLVALUE should be added to when calculating ovmSELFBALANCE
+ const initialBalance = 10
+ await fundUser(
+ env.watcher,
+ env.l1Bridge,
+ initialBalance,
+ ValueCalls1.address
+ )
+
+ const sendAmount = 15
+ const [success, returndata] = await ValueCalls0.callStatic.sendWithData(
+ ValueCalls1.address,
+ sendAmount,
+ ValueCalls1.interface.encodeFunctionData('getSelfBalance')
+ )
+
+ expect(success).to.be.true
+ expect(BigNumber.from(returndata)).to.deep.eq(
+ BigNumber.from(initialBalance + sendAmount)
+ )
+ })
+
+ it('should have the correct callvalue but not persist the transfer if the target reverts', async () => {
+ const sendAmount = 15
+ const internalCalldata = ValueCalls1.interface.encodeFunctionData(
+ 'verifyCallValueAndRevert',
+ [sendAmount]
+ )
+ const [success, returndata] = await ValueCalls0.callStatic.sendWithData(
+ ValueCalls1.address,
+ sendAmount,
+ internalCalldata
+ )
+
+ expect(success).to.be.false
+ expect(returndata).to.eq(encodeSolidityRevertMessage('expected revert'))
+
+ await checkBalances([initialBalance0, 0])
+ })
+
+ it('should look like the subcall reverts with no data if value exceeds balance', async () => {
+ const sendAmount = initialBalance0 + 1
+ const internalCalldata = ValueCalls1.interface.encodeFunctionData(
+ 'verifyCallValueAndReturn',
+ [sendAmount] // this would be correct and return successfuly, IF it could get here
+ )
+ const [success, returndata] = await ValueCalls0.callStatic.sendWithData(
+ ValueCalls1.address,
+ sendAmount,
+ internalCalldata
+ )
+
+ expect(success).to.be.false
+ expect(returndata).to.eq('0x')
+ })
+
+ it('should preserve msg.value through ovmDELEGATECALLs', async () => {
+ const Factory__ValueContext = await ethers.getContractFactory(
+ 'ValueContext',
+ wallet
+ )
+ const ValueContext = await Factory__ValueContext.deploy()
+ await ValueContext.deployTransaction.wait()
+
+ const sendAmount = 10
+
+ const [outerSuccess, outerReturndata] =
+ await ValueCalls0.callStatic.sendWithData(
+ ValueCalls1.address,
+ sendAmount,
+ ValueCalls1.interface.encodeFunctionData('delegateCallToCallValue', [
+ ValueContext.address,
+ ])
+ )
+ const [innerSuccess, innerReturndata] =
+ ValueCalls1.interface.decodeFunctionResult(
+ 'delegateCallToCallValue',
+ outerReturndata
+ )
+ const delegatedOvmCALLVALUE = ValueContext.interface.decodeFunctionResult(
+ 'getCallValue',
+ innerReturndata
+ )[0]
+
+ expect(outerSuccess).to.be.true
+ expect(innerSuccess).to.be.true
+ expect(delegatedOvmCALLVALUE).to.deep.eq(BigNumber.from(sendAmount))
+ })
+
+ it('should have correct address(this).balance through ovmDELEGATECALLs to another account', async () => {
+ const Factory__ValueContext = await ethers.getContractFactory(
+ 'ValueContext',
+ wallet
+ )
+ const ValueContext = await Factory__ValueContext.deploy()
+ await ValueContext.deployTransaction.wait()
+
+ const [delegatedSuccess, delegatedReturndata] =
+ await ValueCalls0.callStatic.delegateCallToAddressThisBalance(
+ ValueContext.address
+ )
+
+ expect(delegatedSuccess).to.be.true
+ expect(delegatedReturndata).to.deep.eq(BigNumber.from(initialBalance0))
+ })
+
+ it('should have correct address(this).balance through ovmDELEGATECALLs to same account', async () => {
+ const [delegatedSuccess, delegatedReturndata] =
+ await ValueCalls0.callStatic.delegateCallToAddressThisBalance(
+ ValueCalls0.address
+ )
+
+ expect(delegatedSuccess).to.be.true
+ expect(delegatedReturndata).to.deep.eq(BigNumber.from(initialBalance0))
+ })
+
+ it('should allow delegate calls which preserve msg.value even with no balance going into the inner call', async () => {
+ const Factory__SendETHAwayAndDelegateCall: ContractFactory =
+ await ethers.getContractFactory('SendETHAwayAndDelegateCall', wallet)
+ const SendETHAwayAndDelegateCall: Contract =
+ await Factory__SendETHAwayAndDelegateCall.deploy()
+ await SendETHAwayAndDelegateCall.deployTransaction.wait()
+
+ const value = 17
+ const [delegatedSuccess, delegatedReturndata] =
+ await SendETHAwayAndDelegateCall.callStatic.emptySelfAndDelegateCall(
+ ValueCalls0.address,
+ ValueCalls0.interface.encodeFunctionData('getCallValue'),
+ {
+ value,
+ }
+ )
+
+ expect(delegatedSuccess).to.be.true
+ expect(delegatedReturndata).to.deep.eq(BigNumber.from(value))
+ })
+
+ describe('Intrinsic gas for ovmCALL types', async () => {
+ let CALL_WITH_VALUE_INTRINSIC_GAS
+ let ValueGasMeasurer: Contract
+ before(async () => {
+ // Grab public variable from the EM
+ const OVM_ExecutionManager = new Contract(
+ await env.addressManager.getAddress('OVM_ExecutionManager'),
+ getContractInterface('OVM_ExecutionManager', false),
+ env.l1Wallet.provider
+ )
+ const CALL_WITH_VALUE_INTRINSIC_GAS_BIGNUM =
+ await OVM_ExecutionManager.CALL_WITH_VALUE_INTRINSIC_GAS()
+ CALL_WITH_VALUE_INTRINSIC_GAS =
+ CALL_WITH_VALUE_INTRINSIC_GAS_BIGNUM.toNumber()
+
+ const Factory__ValueGasMeasurer = await ethers.getContractFactory(
+ 'ValueGasMeasurer',
+ wallet
+ )
+ ValueGasMeasurer = await Factory__ValueGasMeasurer.deploy()
+ await ValueGasMeasurer.deployTransaction.wait()
+ })
+
+ it('a call with value to an empty account consumes <= the intrinsic gas including a buffer', async () => {
+ const value = 1
+ const gasLimit = 1_000_000
+ const minimalSendGas =
+ await ValueGasMeasurer.callStatic.measureGasOfTransferingEthViaCall(
+ ethers.constants.AddressZero,
+ value,
+ gasLimit,
+ {
+ gasLimit: 2_000_000,
+ }
+ )
+
+ const buffer = 1.2
+ expect(minimalSendGas * buffer).to.be.lte(CALL_WITH_VALUE_INTRINSIC_GAS)
+ })
+
+ it('a call with value to an reverting account consumes <= the intrinsic gas including a buffer', async () => {
+ // [magic deploy prefix] . [MSTORE] (will throw exception from no stack args)
+ const AutoRevertInitcode = '0x600D380380600D6000396000f3' + '52'
+ const Factory__AutoRevert = new ContractFactory(
+ new Interface([]),
+ AutoRevertInitcode,
+ wallet
+ )
+ const AutoRevert: Contract = await Factory__AutoRevert.deploy()
+ await AutoRevert.deployTransaction.wait()
+
+ const value = 1
+ const gasLimit = 1_000_000
+ // A revert, causing the ETH to be sent back, should consume the minimal possible gas for a nonzero ETH send
+ const minimalSendGas =
+ await ValueGasMeasurer.callStatic.measureGasOfTransferingEthViaCall(
+ AutoRevert.address,
+ value,
+ gasLimit,
+ {
+ gasLimit: 2_000_000,
+ }
+ )
+
+ const buffer = 1.2
+ expect(minimalSendGas * buffer).to.be.lte(CALL_WITH_VALUE_INTRINSIC_GAS)
+ })
+
+ it('a value call passing less than the intrinsic gas should appear to revert', async () => {
+ const Factory__PayableConstant: ContractFactory =
+ await ethers.getContractFactory('PayableConstant', wallet)
+ const PayableConstant: Contract =
+ await Factory__PayableConstant.deploy()
+ await PayableConstant.deployTransaction.wait()
+
+ const sendAmount = 15
+ const [success, returndata] =
+ await ValueCalls0.callStatic.sendWithDataAndGas(
+ PayableConstant.address,
+ sendAmount,
+ PayableConstant.interface.encodeFunctionData('returnValue'),
+ CALL_WITH_VALUE_INTRINSIC_GAS - 1,
+ {
+ gasLimit: 2_000_000,
+ }
+ )
+
+ expect(success).to.eq(false)
+ expect(returndata).to.eq('0x')
+ })
+
+ it('a value call which runs out of gas does not out-of-gas the parent', async () => {
+ const Factory__TestOOG: ContractFactory =
+ await ethers.getContractFactory('TestOOG', wallet)
+ const TestOOG: Contract = await Factory__TestOOG.deploy()
+ await TestOOG.deployTransaction.wait()
+
+ const sendAmount = 15
+ // Implicitly test that this call is not rejected
+ const [success, returndata] =
+ await ValueCalls0.callStatic.sendWithDataAndGas(
+ TestOOG.address,
+ sendAmount,
+ TestOOG.interface.encodeFunctionData('runOutOfGas'),
+ CALL_WITH_VALUE_INTRINSIC_GAS * 2,
+ {
+ gasLimit: 2_000_000,
+ }
+ )
+
+ expect(success).to.eq(false)
+ expect(returndata).to.eq('0x')
+ })
+ })
+ })
+})
diff --git a/integration-tests/test/native-eth.spec.ts b/integration-tests/test/native-eth.spec.ts
index 716749141c12..652861c5d8f5 100644
--- a/integration-tests/test/native-eth.spec.ts
+++ b/integration-tests/test/native-eth.spec.ts
@@ -1,9 +1,23 @@
import { expect } from 'chai'
+
+/* Imports: External */
import { Wallet, utils, BigNumber } from 'ethers'
+import { predeploys } from '@eth-optimism/contracts'
+
+/* Imports: Internal */
import { Direction } from './shared/watcher-utils'
-import { PROXY_SEQUENCER_ENTRYPOINT_ADDRESS } from './shared/utils'
-import { OptimismEnv } from './shared/env'
+import {
+ expectApprox,
+ fundUser,
+ PROXY_SEQUENCER_ENTRYPOINT_ADDRESS,
+} from './shared/utils'
+import { OptimismEnv, useDynamicTimeoutForWithdrawals } from './shared/env'
+
+const DEFAULT_TEST_GAS_L1 = 330_000
+const DEFAULT_TEST_GAS_L2 = 1_300_000
+// TX size enforced by CTC:
+const MAX_ROLLUP_TX_SIZE = 50_000
describe('Native ETH Integration Tests', async () => {
let env: OptimismEnv
@@ -20,8 +34,8 @@ describe('Native ETH Integration Tests', async () => {
const sequencerBalance = await _env.ovmEth.balanceOf(
PROXY_SEQUENCER_ENTRYPOINT_ADDRESS
)
- const l1GatewayBalance = await _env.l1Wallet.provider.getBalance(
- _env.gateway.address
+ const l1BridgeBalance = await _env.l1Wallet.provider.getBalance(
+ _env.l1Bridge.address
)
return {
@@ -29,7 +43,7 @@ describe('Native ETH Integration Tests', async () => {
l2UserBalance,
l1BobBalance,
l2BobBalance,
- l1GatewayBalance,
+ l1BridgeBalance,
sequencerBalance,
}
}
@@ -42,32 +56,68 @@ describe('Native ETH Integration Tests', async () => {
describe('estimateGas', () => {
it('Should estimate gas for ETH transfer', async () => {
- const amount = utils.parseEther('0.5')
+ const amount = utils.parseEther('0.0000001')
const addr = '0x' + '1234'.repeat(10)
const gas = await env.ovmEth.estimateGas.transfer(addr, amount)
- expect(gas).to.be.deep.eq(BigNumber.from(17344))
+ // Expect gas to be less than or equal to the target plus 1%
+ expectApprox(gas, 6430020, { upperPercentDeviation: 1 })
})
it('Should estimate gas for ETH withdraw', async () => {
- const amount = utils.parseEther('0.5')
- const gas = await env.ovmEth.estimateGas.withdraw(amount)
- expect(gas).to.be.deep.eq(BigNumber.from(14400))
+ const amount = utils.parseEther('0.0000001')
+ const gas = await env.l2Bridge.estimateGas.withdraw(
+ predeploys.OVM_ETH,
+ amount,
+ 0,
+ '0xFFFF'
+ )
+ // Expect gas to be less than or equal to the target plus 1%
+ expectApprox(gas, 6700060, { upperPercentDeviation: 1 })
})
})
- it('deposit', async () => {
+ it('receive', async () => {
+ const depositAmount = 10
+ const preBalances = await getBalances(env)
+ const { tx, receipt } = await env.waitForXDomainTransaction(
+ env.l1Wallet.sendTransaction({
+ to: env.l1Bridge.address,
+ value: depositAmount,
+ gasLimit: DEFAULT_TEST_GAS_L1,
+ }),
+ Direction.L1ToL2
+ )
+
+ const l1FeePaid = receipt.gasUsed.mul(tx.gasPrice)
+ const postBalances = await getBalances(env)
+
+ expect(postBalances.l1BridgeBalance).to.deep.eq(
+ preBalances.l1BridgeBalance.add(depositAmount)
+ )
+ expect(postBalances.l2UserBalance).to.deep.eq(
+ preBalances.l2UserBalance.add(depositAmount)
+ )
+ expect(postBalances.l1UserBalance).to.deep.eq(
+ preBalances.l1UserBalance.sub(l1FeePaid.add(depositAmount))
+ )
+ })
+
+ it('depositETH', async () => {
const depositAmount = 10
const preBalances = await getBalances(env)
const { tx, receipt } = await env.waitForXDomainTransaction(
- env.gateway.deposit({ value: depositAmount }),
+ env.l1Bridge.depositETH(DEFAULT_TEST_GAS_L2, '0xFFFF', {
+ value: depositAmount,
+ gasLimit: DEFAULT_TEST_GAS_L1,
+ }),
Direction.L1ToL2
)
const l1FeePaid = receipt.gasUsed.mul(tx.gasPrice)
const postBalances = await getBalances(env)
- expect(postBalances.l1GatewayBalance).to.deep.eq(
- preBalances.l1GatewayBalance.add(depositAmount)
+ expect(postBalances.l1BridgeBalance).to.deep.eq(
+ preBalances.l1BridgeBalance.add(depositAmount)
)
expect(postBalances.l2UserBalance).to.deep.eq(
preBalances.l2UserBalance.add(depositAmount)
@@ -77,12 +127,13 @@ describe('Native ETH Integration Tests', async () => {
)
})
- it('depositTo', async () => {
+ it('depositETHTo', async () => {
const depositAmount = 10
const preBalances = await getBalances(env)
const depositReceipts = await env.waitForXDomainTransaction(
- env.gateway.depositTo(l2Bob.address, {
+ env.l1Bridge.depositETHTo(l2Bob.address, DEFAULT_TEST_GAS_L2, '0xFFFF', {
value: depositAmount,
+ gasLimit: DEFAULT_TEST_GAS_L1,
}),
Direction.L1ToL2
)
@@ -91,8 +142,8 @@ describe('Native ETH Integration Tests', async () => {
depositReceipts.tx.gasPrice
)
const postBalances = await getBalances(env)
- expect(postBalances.l1GatewayBalance).to.deep.eq(
- preBalances.l1GatewayBalance.add(depositAmount)
+ expect(postBalances.l1BridgeBalance).to.deep.eq(
+ preBalances.l1BridgeBalance.add(depositAmount)
)
expect(postBalances.l2BobBalance).to.deep.eq(
preBalances.l2BobBalance.add(depositAmount)
@@ -102,7 +153,49 @@ describe('Native ETH Integration Tests', async () => {
)
})
- it('withdraw', async () => {
+ it('deposit passes with a large data argument', async () => {
+ const ASSUMED_L2_GAS_LIMIT = 8_000_000
+ const depositAmount = 10
+ const preBalances = await getBalances(env)
+
+ // Set data length slightly less than MAX_ROLLUP_TX_SIZE
+ // to allow for encoding and other arguments
+ const data = `0x` + 'ab'.repeat(MAX_ROLLUP_TX_SIZE - 500)
+ const { tx, receipt } = await env.waitForXDomainTransaction(
+ env.l1Bridge.depositETH(ASSUMED_L2_GAS_LIMIT, data, {
+ value: depositAmount,
+ gasLimit: 4_000_000,
+ }),
+ Direction.L1ToL2
+ )
+
+ const l1FeePaid = receipt.gasUsed.mul(tx.gasPrice)
+ const postBalances = await getBalances(env)
+ expect(postBalances.l1BridgeBalance).to.deep.eq(
+ preBalances.l1BridgeBalance.add(depositAmount)
+ )
+ expect(postBalances.l2UserBalance).to.deep.eq(
+ preBalances.l2UserBalance.add(depositAmount)
+ )
+ expect(postBalances.l1UserBalance).to.deep.eq(
+ preBalances.l1UserBalance.sub(l1FeePaid.add(depositAmount))
+ )
+ })
+
+ it('depositETH fails with a TOO large data argument', async () => {
+ const depositAmount = 10
+
+ const data = `0x` + 'ab'.repeat(MAX_ROLLUP_TX_SIZE + 1)
+ await expect(
+ env.l1Bridge.depositETH(DEFAULT_TEST_GAS_L2, data, {
+ value: depositAmount,
+ })
+ ).to.be.reverted
+ })
+
+ it('withdraw', async function () {
+ await useDynamicTimeoutForWithdrawals(this, env)
+
const withdrawAmount = BigNumber.from(3)
const preBalances = await getBalances(env)
expect(
@@ -110,26 +203,43 @@ describe('Native ETH Integration Tests', async () => {
'Cannot run withdrawal test before any deposits...'
)
+ const transaction = await env.l2Bridge.withdraw(
+ predeploys.OVM_ETH,
+ withdrawAmount,
+ DEFAULT_TEST_GAS_L2,
+ '0xFFFF'
+ )
+ await transaction.wait()
+ await env.relayXDomainMessages(transaction)
const receipts = await env.waitForXDomainTransaction(
- env.ovmEth.withdraw(withdrawAmount),
+ transaction,
Direction.L2ToL1
)
const fee = receipts.tx.gasLimit.mul(receipts.tx.gasPrice)
const postBalances = await getBalances(env)
- expect(postBalances.l1GatewayBalance).to.deep.eq(
- preBalances.l1GatewayBalance.sub(withdrawAmount)
+ // Approximate because there's a fee related to relaying the L2 => L1 message and it throws off the math.
+ expectApprox(
+ postBalances.l1BridgeBalance,
+ preBalances.l1BridgeBalance.sub(withdrawAmount),
+ { upperPercentDeviation: 1 }
)
- expect(postBalances.l2UserBalance).to.deep.eq(
- preBalances.l2UserBalance.sub(withdrawAmount.add(fee))
+ expectApprox(
+ postBalances.l2UserBalance,
+ preBalances.l2UserBalance.sub(withdrawAmount.add(fee)),
+ { upperPercentDeviation: 1 }
)
- expect(postBalances.l1UserBalance).to.deep.eq(
- preBalances.l1UserBalance.add(withdrawAmount)
+ expectApprox(
+ postBalances.l1UserBalance,
+ preBalances.l1UserBalance.add(withdrawAmount),
+ { upperPercentDeviation: 1 }
)
})
- it('withdrawTo', async () => {
+ it('withdrawTo', async function () {
+ await useDynamicTimeoutForWithdrawals(this, env)
+
const withdrawAmount = BigNumber.from(3)
const preBalances = await getBalances(env)
@@ -139,16 +249,25 @@ describe('Native ETH Integration Tests', async () => {
'Cannot run withdrawal test before any deposits...'
)
+ const transaction = await env.l2Bridge.withdrawTo(
+ predeploys.OVM_ETH,
+ l1Bob.address,
+ withdrawAmount,
+ DEFAULT_TEST_GAS_L2,
+ '0xFFFF'
+ )
+ await transaction.wait()
+ await env.relayXDomainMessages(transaction)
const receipts = await env.waitForXDomainTransaction(
- env.ovmEth.withdrawTo(l1Bob.address, withdrawAmount),
+ transaction,
Direction.L2ToL1
)
const fee = receipts.tx.gasLimit.mul(receipts.tx.gasPrice)
const postBalances = await getBalances(env)
- expect(postBalances.l1GatewayBalance).to.deep.eq(
- preBalances.l1GatewayBalance.sub(withdrawAmount)
+ expect(postBalances.l1BridgeBalance).to.deep.eq(
+ preBalances.l1BridgeBalance.sub(withdrawAmount)
)
expect(postBalances.l2UserBalance).to.deep.eq(
preBalances.l2UserBalance.sub(withdrawAmount.add(fee))
@@ -158,12 +277,15 @@ describe('Native ETH Integration Tests', async () => {
)
})
- it('deposit, transfer, withdraw', async () => {
+ it('deposit, transfer, withdraw', async function () {
+ await useDynamicTimeoutForWithdrawals(this, env)
+
// 1. deposit
const amount = utils.parseEther('1')
await env.waitForXDomainTransaction(
- env.gateway.deposit({
+ env.l1Bridge.depositETH(DEFAULT_TEST_GAS_L2, '0xFFFF', {
value: amount,
+ gasLimit: DEFAULT_TEST_GAS_L1,
}),
Direction.L1ToL2
)
@@ -179,8 +301,18 @@ describe('Native ETH Integration Tests', async () => {
// 3. do withdrawal
const withdrawnAmount = utils.parseEther('0.95')
+ const transaction = await env.l2Bridge
+ .connect(other)
+ .withdraw(
+ predeploys.OVM_ETH,
+ withdrawnAmount,
+ DEFAULT_TEST_GAS_L1,
+ '0xFFFF'
+ )
+ await transaction.wait()
+ await env.relayXDomainMessages(transaction)
const receipts = await env.waitForXDomainTransaction(
- env.ovmEth.connect(other).withdraw(withdrawnAmount),
+ transaction,
Direction.L2ToL1
)
@@ -193,4 +325,77 @@ describe('Native ETH Integration Tests', async () => {
expect(l1BalanceAfter).to.deep.eq(l1BalanceBefore.add(withdrawnAmount))
expect(l2BalanceAfter).to.deep.eq(amount.sub(withdrawnAmount).sub(fee))
})
+
+ describe('WETH9 functionality', async () => {
+ let initialBalance: BigNumber
+ const value = 10
+
+ beforeEach(async () => {
+ await fundUser(env.watcher, env.l1Bridge, value, env.l2Wallet.address)
+ initialBalance = await env.l2Wallet.provider.getBalance(
+ env.l2Wallet.address
+ )
+ })
+
+ it('successfully deposits', async () => {
+ const depositTx = await env.ovmEth.deposit({ value, gasPrice: 0 })
+ const receipt = await depositTx.wait()
+
+ expect(
+ await env.l2Wallet.provider.getBalance(env.l2Wallet.address)
+ ).to.equal(initialBalance)
+ expect(receipt.events.length).to.equal(4)
+
+ // The first transfer event is fee payment
+ const [, firstTransferEvent, secondTransferEvent, depositEvent] =
+ receipt.events
+
+ expect(firstTransferEvent.event).to.equal('Transfer')
+ expect(firstTransferEvent.args.from).to.equal(env.l2Wallet.address)
+ expect(firstTransferEvent.args.to).to.equal(env.ovmEth.address)
+ expect(firstTransferEvent.args.value).to.equal(value)
+
+ expect(secondTransferEvent.event).to.equal('Transfer')
+ expect(secondTransferEvent.args.from).to.equal(env.ovmEth.address)
+ expect(secondTransferEvent.args.to).to.equal(env.l2Wallet.address)
+ expect(secondTransferEvent.args.value).to.equal(value)
+
+ expect(depositEvent.event).to.equal('Deposit')
+ expect(depositEvent.args.dst).to.equal(env.l2Wallet.address)
+ expect(depositEvent.args.wad).to.equal(value)
+ })
+
+ it('successfully deposits on fallback', async () => {
+ const fallbackTx = await env.l2Wallet.sendTransaction({
+ to: env.ovmEth.address,
+ value,
+ gasPrice: 0,
+ })
+ const receipt = await fallbackTx.wait()
+ expect(receipt.status).to.equal(1)
+ expect(
+ await env.l2Wallet.provider.getBalance(env.l2Wallet.address)
+ ).to.equal(initialBalance)
+ })
+
+ it('successfully withdraws', async () => {
+ const withdrawTx = await env.ovmEth.withdraw(value, { gasPrice: 0 })
+ const receipt = await withdrawTx.wait()
+ expect(
+ await env.l2Wallet.provider.getBalance(env.l2Wallet.address)
+ ).to.equal(initialBalance)
+ expect(receipt.events.length).to.equal(2)
+
+ // The first transfer event is fee payment
+ const depositEvent = receipt.events[1]
+ expect(depositEvent.event).to.equal('Withdrawal')
+ expect(depositEvent.args.src).to.equal(env.l2Wallet.address)
+ expect(depositEvent.args.wad).to.equal(value)
+ })
+
+ it('reverts on invalid withdraw', async () => {
+ await expect(env.ovmEth.withdraw(initialBalance.add(1), { gasPrice: 0 }))
+ .to.be.reverted
+ })
+ })
})
diff --git a/integration-tests/test/ovmcontext.spec.ts b/integration-tests/test/ovmcontext.spec.ts
index 16640b974b1f..9bcd7be2206d 100644
--- a/integration-tests/test/ovmcontext.spec.ts
+++ b/integration-tests/test/ovmcontext.spec.ts
@@ -1,15 +1,14 @@
+import { expect } from 'chai'
+
+/* Imports: External */
import { ethers } from 'hardhat'
import { injectL2Context } from '@eth-optimism/core-utils'
-import { expect } from 'chai'
-import {
- sleep,
- l2Provider,
- l1Provider,
- getAddressManager,
-} from './shared/utils'
+import { Contract, BigNumber } from 'ethers'
+
+/* Imports: Internal */
+import { l2Provider, l1Provider, IS_LIVE_NETWORK } from './shared/utils'
import { OptimismEnv } from './shared/env'
-import { getContractFactory } from '@eth-optimism/contracts'
-import { Contract, ContractFactory, Wallet, BigNumber } from 'ethers'
+import { Direction } from './shared/watcher-utils'
/**
* These tests cover the OVM execution contexts. In the OVM execution
@@ -17,74 +16,51 @@ import { Contract, ContractFactory, Wallet, BigNumber } from 'ethers'
* must be equal to the blocknumber/timestamp of the L1 transaction.
*/
describe('OVM Context: Layer 2 EVM Context', () => {
- let address: string
- let CanonicalTransactionChain: Contract
- let OVMMulticall: Contract
- let OVMContextStorage: Contract
-
- const L1Provider = l1Provider
const L2Provider = injectL2Context(l2Provider)
-
+ let env: OptimismEnv
before(async () => {
- const env = await OptimismEnv.new()
- // Create providers and signers
- const l1Wallet = env.l1Wallet
- const l2Wallet = env.l2Wallet
- const addressManager = env.addressManager
+ env = await OptimismEnv.new()
+ })
- // deploy the contract
+ let OVMMulticall: Contract
+ let OVMContextStorage: Contract
+ beforeEach(async () => {
const OVMContextStorageFactory = await ethers.getContractFactory(
'OVMContextStorage',
- l2Wallet
- )
-
- OVMContextStorage = await OVMContextStorageFactory.deploy()
- const receipt = await OVMContextStorage.deployTransaction.wait()
- address = OVMContextStorage.address
-
- const ctcAddress = await addressManager.getAddress(
- 'OVM_CanonicalTransactionChain'
+ env.l2Wallet
)
- const CanonicalTransactionChainFactory = getContractFactory(
- 'OVM_CanonicalTransactionChain'
- )
-
- CanonicalTransactionChain = CanonicalTransactionChainFactory.connect(
- l1Wallet
- ).attach(ctcAddress)
-
const OVMMulticallFactory = await ethers.getContractFactory(
'OVMMulticall',
- l2Wallet
+ env.l2Wallet
)
+ OVMContextStorage = await OVMContextStorageFactory.deploy()
+ await OVMContextStorage.deployTransaction.wait()
OVMMulticall = await OVMMulticallFactory.deploy()
await OVMMulticall.deployTransaction.wait()
})
- it('Enqueue: `block.number` and `block.timestamp` have L1 values', async () => {
- for (let i = 0; i < 5; i++) {
- const l2Tip = await L2Provider.getBlock('latest')
- const tx = await CanonicalTransactionChain.enqueue(
+ let numTxs = 5
+ if (IS_LIVE_NETWORK) {
+ // Tests take way too long if we don't reduce the number of txs here.
+ numTxs = 1
+ }
+
+ it('enqueue: `block.number` and `block.timestamp` have L1 values', async () => {
+ for (let i = 0; i < numTxs; i++) {
+ const tx = await env.l1Messenger.sendMessage(
OVMContextStorage.address,
- 500_000,
- '0x'
+ '0x',
+ 2_000_000
)
-
- // Wait for the enqueue to be ingested
- while (true) {
- const tip = await L2Provider.getBlock('latest')
- if (tip.number === l2Tip.number + 1) {
- break
- }
- await sleep(500)
- }
+ const receipt = await tx.wait()
// Get the receipt
- const receipt = await tx.wait()
// The transaction did not revert
expect(receipt.status).to.equal(1)
+ await env.waitForXDomainTransaction(tx, Direction.L1ToL2)
+
// Get the L1 block that the enqueue transaction was in so that
// the timestamp can be compared against the layer two contract
const block = await l1Provider.getBlock(receipt.blockNumber)
@@ -97,14 +73,18 @@ describe('OVM Context: Layer 2 EVM Context', () => {
const timestamp = await OVMContextStorage.timestamps(i)
expect(block.timestamp).to.deep.equal(timestamp.toNumber())
}
- })
+ }).timeout(150000) // this specific test takes a while because it involves L1 to L2 txs
it('should set correct OVM Context for `eth_call`', async () => {
- const tip = await L2Provider.getBlockWithTransactions('latest')
- const start = Math.max(0, tip.number - 5)
-
- for (let i = start; i < tip.number; i++) {
- const block = await L2Provider.getBlockWithTransactions(i)
+ for (let i = 0; i < numTxs; i++) {
+ // Make an empty transaction to bump the latest block number.
+ const dummyTx = await env.l2Wallet.sendTransaction({
+ to: `0x${'11'.repeat(20)}`,
+ data: '0x',
+ })
+ await dummyTx.wait()
+
+ const block = await L2Provider.getBlockWithTransactions('latest')
const [, returnData] = await OVMMulticall.callStatic.aggregate(
[
[
@@ -118,7 +98,7 @@ describe('OVM Context: Layer 2 EVM Context', () => {
OVMMulticall.interface.encodeFunctionData('getCurrentBlockNumber'),
],
],
- { blockTag: i }
+ { blockTag: block.number }
)
const timestamp = BigNumber.from(returnData[0])
diff --git a/integration-tests/test/predeploys.spec.ts b/integration-tests/test/predeploys.spec.ts
new file mode 100644
index 000000000000..59598ac467de
--- /dev/null
+++ b/integration-tests/test/predeploys.spec.ts
@@ -0,0 +1,49 @@
+import { expect } from 'chai'
+import { ethers } from 'hardhat'
+
+/* Imports: External */
+import { Contract, Wallet } from 'ethers'
+import { OptimismEnv } from './shared/env'
+import { DEFAULT_TRANSACTION } from './shared/utils'
+import { getContractInterface } from '@eth-optimism/contracts'
+
+describe('ECDSAContractAccount', () => {
+ let l2Wallet: Wallet
+
+ before(async () => {
+ const env = await OptimismEnv.new()
+ l2Wallet = env.l2Wallet
+ })
+
+ let ProxyEOA: Contract
+ let messageHash: string
+ let signature: string
+
+ before(async () => {
+ // Send a transaction to ensure there is a ProxyEOA deployed at l2Wallet.address
+ const result = await l2Wallet.sendTransaction(DEFAULT_TRANSACTION)
+ await result.wait()
+ ProxyEOA = new Contract(
+ l2Wallet.address,
+ getContractInterface('OVM_ECDSAContractAccount'),
+ l2Wallet
+ )
+ const message = '0x42'
+ messageHash = ethers.utils.hashMessage(message)
+ signature = await l2Wallet.signMessage(message)
+ })
+
+ it('should correctly evaluate isValidSignature from this wallet', async () => {
+ const isValid = await ProxyEOA.isValidSignature(messageHash, signature)
+ expect(isValid).to.equal('0x1626ba7e')
+ })
+
+ it('should correctly evaluate isValidSignature from other wallet', async () => {
+ const otherWallet = Wallet.createRandom().connect(l2Wallet.provider)
+ const isValid = await ProxyEOA.connect(otherWallet).isValidSignature(
+ messageHash,
+ signature
+ )
+ expect(isValid).to.equal('0x1626ba7e')
+ })
+})
diff --git a/integration-tests/test/queue-ingestion.spec.ts b/integration-tests/test/queue-ingestion.spec.ts
index bf252fcf0f0d..add9c43e604d 100644
--- a/integration-tests/test/queue-ingestion.spec.ts
+++ b/integration-tests/test/queue-ingestion.spec.ts
@@ -1,101 +1,65 @@
+import { expect } from 'chai'
+
/* Imports: Internal */
+import { providers } from 'ethers'
import { injectL2Context } from '@eth-optimism/core-utils'
-import { sleep } from './shared/utils'
-import { OptimismEnv } from './shared/env'
/* Imports: External */
-import { providers } from 'ethers'
-import { expect } from 'chai'
+import { OptimismEnv } from './shared/env'
+import { Direction } from './shared/watcher-utils'
-// This test ensures that the transactions which get `enqueue`d get
-// added to the L2 blocks by the Sync Service (which queries the DTL)
describe('Queue Ingestion', () => {
- const RETRIES = 20
- const numTxs = 5
- let startBlock: number
- let endBlock: number
let env: OptimismEnv
let l2Provider: providers.JsonRpcProvider
- const receipts = []
-
before(async () => {
env = await OptimismEnv.new()
l2Provider = injectL2Context(env.l2Wallet.provider as any)
})
- // The transactions are enqueue'd with a `to` address of i.repeat(40)
- // meaning that the `to` value is different each iteration in a deterministic
- // way. They need to be inserted into the L2 chain in an ascending order.
- // Keep track of the receipts so that the blockNumber can be compared
- // against the `L1BlockNumber` on the tx objects.
- before(async () => {
- // Keep track of the L2 tip before submitting any transactions so that
- // the subsequent transactions can be queried for in the next test
- startBlock = (await l2Provider.getBlockNumber()) + 1
- endBlock = startBlock + numTxs - 1
-
- // Enqueue some transactions by building the calldata and then sending
- // the transaction to Layer 1
- for (let i = 0; i < numTxs; i++) {
- const input = ['0x' + `${i}`.repeat(40), 500_000, `0x0${i}`]
- const calldata = env.ctc.interface.encodeFunctionData('enqueue', input)
-
- const txResponse = await env.l1Wallet.sendTransaction({
- data: calldata,
- to: env.ctc.address,
- })
-
- const receipt = await txResponse.wait()
- receipts.push(receipt)
- }
- })
-
// The batch submitter will notice that there are transactions
// that are in the queue and submit them. L2 will pick up the
// sequencer batch appended event and play the transactions.
it('should order transactions correctly', async () => {
- // Wait until each tx from the previous test has
- // been executed
- let i: number
- for (i = 0; i < RETRIES; i++) {
- const tip = await l2Provider.getBlockNumber()
- if (tip >= endBlock) {
- break
- }
- await sleep(1000)
- }
+ const numTxs = 5
- if (i === RETRIES) {
- throw new Error(
- 'timed out waiting for queued transactions to be inserted'
+ // Enqueue some transactions by building the calldata and then sending
+ // the transaction to Layer 1
+ const txs = []
+ for (let i = 0; i < numTxs; i++) {
+ const tx = await env.l1Messenger.sendMessage(
+ `0x${`${i}`.repeat(40)}`,
+ `0x0${i}`,
+ 1_000_000
)
+ await tx.wait()
+ txs.push(tx)
}
- const from = await env.l1Wallet.getAddress()
- // Keep track of an index into the receipts list and
- // increment it for each block fetched.
- let receiptIndex = 0
- // Fetch blocks
- for (i = 0; i < numTxs; i++) {
- const block = await l2Provider.getBlock(startBlock + i)
- const hash = block.transactions[0]
- // Use as any hack because additional properties are
- // added to the transaction response
- const tx = await (l2Provider.getTransaction(hash) as any)
+ for (let i = 0; i < numTxs; i++) {
+ const l1Tx = txs[i]
+ const l1TxReceipt = await txs[i].wait()
+ const receipt = await env.waitForXDomainTransaction(
+ l1Tx,
+ Direction.L1ToL2
+ )
+ const l2Tx = (await l2Provider.getTransaction(
+ receipt.remoteTx.hash
+ )) as any
+
+ const params = env.l2Messenger.interface.decodeFunctionData(
+ 'relayMessage',
+ l2Tx.data
+ )
- // The `to` addresses are defined in the previous test and
- // increment sequentially.
- expect(tx.to).to.be.equal('0x' + `${i}`.repeat(40))
- // The transaction type is EIP155
- expect(tx.txType).to.be.equal('EIP155')
- // The queue origin is Layer 1
- expect(tx.queueOrigin).to.be.equal('l1')
- // the L1TxOrigin is equal to the Layer one from
- expect(tx.l1TxOrigin).to.be.equal(from.toLowerCase())
- expect(typeof tx.l1BlockNumber).to.be.equal('number')
- // Get the receipt and increment the recept index
- const receipt = receipts[receiptIndex++]
- expect(tx.l1BlockNumber).to.be.equal(receipt.blockNumber)
+ expect(params._sender.toLowerCase()).to.equal(
+ env.l1Wallet.address.toLowerCase()
+ )
+ expect(params._target).to.equal('0x' + `${i}`.repeat(40))
+ expect(l2Tx.queueOrigin).to.equal('l1')
+ expect(l2Tx.l1TxOrigin.toLowerCase()).to.equal(
+ env.l1Messenger.address.toLowerCase()
+ )
+ expect(l2Tx.l1BlockNumber).to.equal(l1TxReceipt.blockNumber)
}
- })
+ }).timeout(100_000)
})
diff --git a/integration-tests/test/rpc.spec.ts b/integration-tests/test/rpc.spec.ts
index fa8b4c6620d4..7e0e3d8a5f26 100644
--- a/integration-tests/test/rpc.spec.ts
+++ b/integration-tests/test/rpc.spec.ts
@@ -1,27 +1,62 @@
-import { injectL2Context } from '@eth-optimism/core-utils'
-import { Wallet, BigNumber } from 'ethers'
+import {
+ injectL2Context,
+ TxGasLimit,
+ TxGasPrice,
+} from '@eth-optimism/core-utils'
+import { Wallet, BigNumber, Contract, ContractFactory } from 'ethers'
+import { ethers } from 'hardhat'
import chai, { expect } from 'chai'
-import { sleep, l2Provider, GWEI } from './shared/utils'
+import {
+ sleep,
+ l2Provider,
+ DEFAULT_TRANSACTION,
+ fundUser,
+ expectApprox,
+ L2_CHAINID,
+ IS_LIVE_NETWORK,
+} from './shared/utils'
import chaiAsPromised from 'chai-as-promised'
import { OptimismEnv } from './shared/env'
+import {
+ TransactionReceipt,
+ TransactionRequest,
+} from '@ethersproject/providers'
+import { solidity } from 'ethereum-waffle'
chai.use(chaiAsPromised)
+chai.use(solidity)
describe('Basic RPC tests', () => {
let env: OptimismEnv
-
- const DEFAULT_TRANSACTION = {
- to: '0x' + '1234'.repeat(10),
- gasLimit: 4000000,
- gasPrice: 0,
- data: '0x',
- value: 0,
- }
+ let wallet: Wallet
const provider = injectL2Context(l2Provider)
- const wallet = Wallet.createRandom().connect(provider)
+
+ let Reverter: Contract
+ let revertMessage: string
+ let revertingTx: TransactionRequest
+ let revertingDeployTx: TransactionRequest
before(async () => {
env = await OptimismEnv.new()
+ wallet = env.l2Wallet
+ const Factory__Reverter = await ethers.getContractFactory(
+ 'Reverter',
+ wallet
+ )
+ Reverter = await Factory__Reverter.connect(env.l2Wallet).deploy()
+ await Reverter.deployTransaction.wait()
+ revertMessage = await Reverter.revertMessage()
+ revertingTx = {
+ to: Reverter.address,
+ data: Reverter.interface.encodeFunctionData('doRevert'),
+ }
+ const Factory__ConstructorReverter = await ethers.getContractFactory(
+ 'ConstructorReverter',
+ wallet
+ )
+ revertingDeployTx = {
+ data: Factory__ConstructorReverter.bytecode,
+ }
})
describe('eth_sendRawTransaction', () => {
@@ -59,17 +94,188 @@ describe('Basic RPC tests', () => {
).to.be.rejectedWith('Cannot submit unprotected transaction')
})
- it('should not accept a transaction with a value', async () => {
+ it('should accept a transaction with a value', async () => {
+ const tx = {
+ ...DEFAULT_TRANSACTION,
+ chainId: await env.l2Wallet.getChainId(),
+ data: '0x',
+ value: ethers.utils.parseEther('0.1'),
+ }
+
+ const balanceBefore = await provider.getBalance(env.l2Wallet.address)
+ const result = await env.l2Wallet.sendTransaction(tx)
+ const receipt = await result.wait()
+ expect(receipt.status).to.deep.equal(1)
+
+ expect(await provider.getBalance(env.l2Wallet.address)).to.deep.equal(
+ balanceBefore.sub(ethers.utils.parseEther('0.1'))
+ )
+ })
+
+ it('should reject a transaction with higher value than user balance', async () => {
+ const balance = await env.l2Wallet.getBalance()
+ const tx = {
+ ...DEFAULT_TRANSACTION,
+ chainId: await env.l2Wallet.getChainId(),
+ data: '0x',
+ value: balance.add(ethers.utils.parseEther('1')),
+ }
+
+ await expect(env.l2Wallet.sendTransaction(tx)).to.be.rejectedWith(
+ 'invalid transaction: insufficient funds for gas * price + value'
+ )
+ })
+
+ it('should reject a transaction with too low of a fee', async () => {
const tx = {
...DEFAULT_TRANSACTION,
- chainId: await wallet.getChainId(),
- value: 100,
+ gasLimit: 1,
+ gasPrice: TxGasPrice,
}
+ const fee = tx.gasPrice.mul(tx.gasLimit)
+
+ await expect(env.l2Wallet.sendTransaction(tx)).to.be.rejectedWith(
+ `fee too low: ${fee}, use at least tx.gasLimit =`
+ )
+ })
+
+ it('should reject a transaction with an incorrect gas price', async () => {
+ const tx = {
+ ...DEFAULT_TRANSACTION,
+ gasLimit: 1,
+ gasPrice: TxGasPrice.sub(1),
+ }
+
+ await expect(env.l2Wallet.sendTransaction(tx)).to.be.rejectedWith(
+ `tx.gasPrice must be ${TxGasPrice.toString()}`
+ )
+ })
+
+ it('should correctly report OOG for contract creations', async () => {
+ const factory = await ethers.getContractFactory('TestOOGInConstructor')
+
+ await expect(factory.connect(wallet).deploy()).to.be.rejectedWith(
+ 'gas required exceeds allowance'
+ )
+ })
+ })
+
+ describe('eth_call', () => {
+ it('should correctly identify call out-of-gas', async () => {
await expect(
- provider.sendTransaction(await wallet.signTransaction(tx))
- ).to.be.rejectedWith(
- 'Cannot send transaction with non-zero value. Use WETH.transfer()'
+ provider.call({
+ ...revertingTx,
+ gasLimit: 1,
+ })
+ ).to.be.rejectedWith('out of gas')
+ })
+
+ it('should correctly return solidity revert data from a call', async () => {
+ await expect(provider.call(revertingTx)).to.be.revertedWith(revertMessage)
+ })
+
+ it('should produce error when called from ethers', async () => {
+ await expect(Reverter.doRevert()).to.be.revertedWith(revertMessage)
+ })
+
+ it('should correctly return revert data from contract creation', async () => {
+ await expect(provider.call(revertingDeployTx)).to.be.revertedWith(
+ revertMessage
+ )
+ })
+
+ it('should correctly identify contract creation out of gas', async () => {
+ await expect(
+ provider.call({
+ ...revertingDeployTx,
+ gasLimit: 1,
+ })
+ ).to.be.rejectedWith('out of gas')
+ })
+
+ it('should return the correct error message when attempting to deploy unsafe initcode', async () => {
+ // PUSH1 0x00 PUSH1 0x00 SSTORE
+ const unsafeCode = '0x6000600055'
+
+ await expect(
+ provider.call({
+ data: unsafeCode,
+ })
+ ).to.be.revertedWith(
+ 'Contract creation code contains unsafe opcodes. Did you use the right compiler or pass an unsafe constructor argument?'
+ )
+ })
+
+ it('should allow eth_calls with nonzero value', async () => {
+ // Deploy a contract to check msg.value of the call
+ const Factory__ValueContext: ContractFactory =
+ await ethers.getContractFactory('ValueContext', wallet)
+ const ValueContext: Contract = await Factory__ValueContext.deploy()
+ await ValueContext.deployTransaction.wait()
+
+ // Fund account to call from
+ const from = wallet.address
+ const value = 15
+ await fundUser(env.watcher, env.l1Bridge, value, from)
+
+ // Do the call and check msg.value
+ const data = ValueContext.interface.encodeFunctionData('getCallValue')
+ const res = await provider.call({
+ to: ValueContext.address,
+ from,
+ data,
+ value,
+ })
+
+ expect(res).to.eq(BigNumber.from(value))
+ })
+ })
+
+ describe('eth_getTransactionReceipt', () => {
+ it('correctly exposes revert data for contract calls', async () => {
+ const req: TransactionRequest = {
+ ...revertingTx,
+ gasLimit: 5980899, // override gas estimation
+ }
+
+ const tx = await wallet.sendTransaction(req)
+
+ let errored = false
+ try {
+ await tx.wait()
+ } catch (e) {
+ errored = true
+ }
+ expect(errored).to.be.true
+
+ const receipt: TransactionReceipt = await provider.getTransactionReceipt(
+ tx.hash
)
+
+ expect(receipt.status).to.eq(0)
+ })
+
+ it('correctly exposes revert data for contract creations', async () => {
+ const req: TransactionRequest = {
+ ...revertingDeployTx,
+ gasLimit: 27700899, // override gas estimation
+ }
+
+ const tx = await wallet.sendTransaction(req)
+
+ let errored = false
+ try {
+ await tx.wait()
+ } catch (e) {
+ errored = true
+ }
+ expect(errored).to.be.true
+
+ const receipt: TransactionReceipt = await provider.getTransactionReceipt(
+ tx.hash
+ )
+
+ expect(receipt.status).to.eq(0)
})
})
@@ -80,7 +286,6 @@ describe('Basic RPC tests', () => {
await result.wait()
const transaction = (await provider.getTransaction(result.hash)) as any
- expect(transaction.txType).to.equal('EIP155')
expect(transaction.queueOrigin).to.equal('sequencer')
expect(transaction.transactionIndex).to.be.eq(0)
expect(transaction.gasLimit).to.be.deep.eq(BigNumber.from(tx.gasLimit))
@@ -101,7 +306,6 @@ describe('Basic RPC tests', () => {
expect(block.number).to.not.equal(0)
expect(typeof block.stateRoot).to.equal('string')
expect(block.transactions.length).to.equal(1)
- expect(block.transactions[0].txType).to.equal('EIP155')
expect(block.transactions[0].queueOrigin).to.equal('sequencer')
expect(block.transactions[0].l1TxOrigin).to.equal(null)
})
@@ -113,7 +317,15 @@ describe('Basic RPC tests', () => {
// canonical transaction chain. This test catches this by
// querying for the latest block and then waits and then queries
// the latest block again and then asserts that they are the same.
- it('should return the same result when new transactions are not applied', async () => {
+ //
+ // Needs to be skipped on Prod networks because this test doesn't work when
+ // other people are sending transactions to the Sequencer at the same time
+ // as this test is running.
+ it('should return the same result when new transactions are not applied', async function () {
+ if (IS_LIVE_NETWORK) {
+ this.skip()
+ }
+
// Get latest block once to start.
const prev = await provider.getBlockWithTransactions('latest')
@@ -137,41 +349,98 @@ describe('Basic RPC tests', () => {
describe('eth_chainId', () => {
it('should get the correct chainid', async () => {
const { chainId } = await provider.getNetwork()
- expect(chainId).to.be.eq(420)
+ expect(chainId).to.be.eq(L2_CHAINID)
})
})
describe('eth_gasPrice', () => {
- it('gas price should be 1 gwei', async () => {
- expect(await provider.getGasPrice()).to.be.deep.equal(GWEI)
+ it('gas price should be the fee scalar', async () => {
+ expect(await provider.getGasPrice()).to.be.deep.equal(
+ TxGasPrice.toNumber()
+ )
})
})
- describe('eth_estimateGas (returns the fee)', () => {
+ describe('eth_estimateGas (returns the scaled fee)', () => {
+ it('gas estimation is deterministic', async () => {
+ let lastEstimate: BigNumber
+ for (let i = 0; i < 10; i++) {
+ const estimate = await l2Provider.estimateGas({
+ to: DEFAULT_TRANSACTION.to,
+ value: 0,
+ })
+
+ if (i > 0) {
+ expect(lastEstimate).to.be.eq(estimate)
+ }
+
+ lastEstimate = estimate
+ }
+ })
+
+ it('should return a gas estimate for txs with empty data', async () => {
+ const estimate = await l2Provider.estimateGas({
+ to: DEFAULT_TRANSACTION.to,
+ value: 0,
+ })
+ // Expect gas to be less than or equal to the target plus 1%
+ expectApprox(estimate, 5920012, { upperPercentDeviation: 1 })
+ })
+
it('should return a gas estimate that grows with the size of data', async () => {
const dataLen = [0, 2, 8, 64, 256]
const l1GasPrice = await env.l1Wallet.provider.getGasPrice()
- // 96 bytes * 16 per non zero byte
- const onesCost = BigNumber.from(96).mul(16)
- const expectedCost = dataLen
- .map((len) => BigNumber.from(len).mul(4))
- .map((zerosCost) => zerosCost.add(onesCost))
-
// Repeat this test for a series of possible transaction sizes.
- for (let i = 0; i < dataLen.length; i++) {
- const estimate = await l2Provider.estimateGas({
- ...DEFAULT_TRANSACTION,
- data: '0x' + '00'.repeat(dataLen[i]),
+ for (const data of dataLen) {
+ const tx = {
+ to: '0x' + '1234'.repeat(10),
+ value: '0x0',
+ data: '0x' + '00'.repeat(data),
from: '0x' + '1234'.repeat(10),
- })
+ }
+ const estimate = await l2Provider.estimateGas(tx)
+ const l2Gaslimit = await l2Provider.send('eth_estimateExecutionGas', [
+ tx,
+ true,
+ ])
+
+ const decoded = TxGasLimit.decode(estimate)
+ expect(decoded).to.deep.eq(BigNumber.from(l2Gaslimit))
+ expect(estimate.toString().endsWith(l2Gaslimit.toString()))
- // we normalize by gwei here because the RPC does it as well, since the
- // user provides a 1gwei gas price when submitting txs via the eth_gasPrice
- // rpc call
- const expected = expectedCost[i].mul(l1GasPrice).div(GWEI)
- expect(estimate).to.be.deep.eq(expected)
+ const l2GasPrice = BigNumber.from(0)
+ // The L2GasPrice should be fetched from the L2GasPrice oracle contract,
+ // but it does not yet exist. Use the default value for now
+ const expected = TxGasLimit.encode({
+ data: tx.data,
+ l1GasPrice,
+ l2GasLimit: BigNumber.from(l2Gaslimit),
+ l2GasPrice,
+ })
+ expect(expected).to.deep.eq(estimate)
}
})
+
+ it('should fail for a reverting call transaction', async () => {
+ await expect(provider.send('eth_estimateGas', [revertingTx])).to.be
+ .reverted
+ })
+
+ it('should fail for a reverting deploy transaction', async () => {
+ await expect(provider.send('eth_estimateGas', [revertingDeployTx])).to.be
+ .reverted
+ })
+ })
+
+ describe('rollup_gasPrices', () => {
+ it('should return the L1 and L2 gas prices', async () => {
+ const result = await provider.send('rollup_gasPrices', [])
+ const l1GasPrice = await env.l1Wallet.provider.getGasPrice()
+ const l2GasPrice = await env.gasPriceOracle.gasPrice()
+
+ expect(BigNumber.from(result.l1GasPrice)).to.deep.eq(l1GasPrice)
+ expect(BigNumber.from(result.l2GasPrice)).to.deep.eq(l2GasPrice)
+ })
})
})
diff --git a/integration-tests/test/setup-docker-compose-network.js b/integration-tests/test/setup-docker-compose-network.js
index 96b73cb7a5bf..39efe8d444d2 100644
--- a/integration-tests/test/setup-docker-compose-network.js
+++ b/integration-tests/test/setup-docker-compose-network.js
@@ -1,5 +1,4 @@
-const { DockerComposeNetwork } = require("./shared/docker-compose")
-
+const { DockerComposeNetwork } = require('./shared/docker-compose')
before(async () => {
if (!process.env.NO_NETWORK) {
diff --git a/integration-tests/test/shared/docker-compose.ts b/integration-tests/test/shared/docker-compose.ts
index cd4e9468a9e1..2753d8527472 100644
--- a/integration-tests/test/shared/docker-compose.ts
+++ b/integration-tests/test/shared/docker-compose.ts
@@ -2,7 +2,13 @@ import * as compose from 'docker-compose'
import * as shell from 'shelljs'
import * as path from 'path'
-type ServiceNames = 'batch_submitter' | 'dtl' | 'l2geth' | 'relayer'
+type ServiceNames =
+ | 'batch_submitter'
+ | 'dtl'
+ | 'l2geth'
+ | 'relayer'
+ | 'verifier'
+ | 'replica'
const OPS_DIRECTORY = path.join(process.cwd(), '../ops')
const DEFAULT_SERVICES: ServiceNames[] = [
@@ -15,8 +21,11 @@ const DEFAULT_SERVICES: ServiceNames[] = [
export class DockerComposeNetwork {
constructor(private readonly services: ServiceNames[] = DEFAULT_SERVICES) {}
- async up() {
- const out = await compose.upMany(this.services, { cwd: OPS_DIRECTORY })
+ async up(options?: compose.IDockerComposeOptions) {
+ const out = await compose.upMany(this.services, {
+ cwd: OPS_DIRECTORY,
+ ...options,
+ })
const { err, exitCode } = out
@@ -29,11 +38,25 @@ export class DockerComposeNetwork {
if (err.includes('Creating')) {
console.info(
- '🳠Tests required starting containers. Waiting for sequencer to ready.'
+ '🳠Tests required starting containers. Waiting for Verifier to be ready.'
)
- shell.exec(`${OPS_DIRECTORY}/scripts/wait-for-sequencer.sh`, {
+ shell.exec(`${OPS_DIRECTORY}/scripts/wait-for-verifier.sh`, {
cwd: OPS_DIRECTORY,
})
}
+
+ return out
+ }
+
+ async logs() {
+ return compose.logs(this.services, { cwd: OPS_DIRECTORY })
+ }
+
+ async stop(service: ServiceNames) {
+ return compose.stopOne(service, { cwd: OPS_DIRECTORY })
+ }
+
+ async rm() {
+ return compose.rm({ cwd: OPS_DIRECTORY })
}
}
diff --git a/integration-tests/test/shared/env.ts b/integration-tests/test/shared/env.ts
index 98ef9ce13682..084010346e94 100644
--- a/integration-tests/test/shared/env.ts
+++ b/integration-tests/test/shared/env.ts
@@ -1,6 +1,11 @@
-import { getContractFactory } from '@eth-optimism/contracts'
-import { Watcher } from '@eth-optimism/core-utils'
+/* Imports: External */
import { Contract, utils, Wallet } from 'ethers'
+import { TransactionResponse } from '@ethersproject/providers'
+import { getContractFactory, predeploys } from '@eth-optimism/contracts'
+import { Watcher } from '@eth-optimism/core-utils'
+import { getMessagesAndProofsForL2Transaction } from '@eth-optimism/message-relayer'
+
+/* Imports: Internal */
import {
getAddressManager,
l1Provider,
@@ -9,7 +14,10 @@ import {
l2Wallet,
fundUser,
getOvmEth,
- getGateway,
+ getL1Bridge,
+ getL2Bridge,
+ IS_LIVE_NETWORK,
+ sleep,
} from './utils'
import {
initWatcher,
@@ -17,19 +25,21 @@ import {
Direction,
waitForXDomainTransaction,
} from './watcher-utils'
-import { TransactionResponse } from '@ethersproject/providers'
/// Helper class for instantiating a test environment with a funded account
export class OptimismEnv {
// L1 Contracts
addressManager: Contract
- gateway: Contract
+ l1Bridge: Contract
l1Messenger: Contract
ctc: Contract
+ scc: Contract
// L2 Contracts
ovmEth: Contract
+ l2Bridge: Contract
l2Messenger: Contract
+ gasPriceOracle: Contract
// The L1 <> L2 State watcher
watcher: Watcher
@@ -40,31 +50,34 @@ export class OptimismEnv {
constructor(args: any) {
this.addressManager = args.addressManager
- this.gateway = args.gateway
+ this.l1Bridge = args.l1Bridge
this.l1Messenger = args.l1Messenger
this.ovmEth = args.ovmEth
+ this.l2Bridge = args.l2Bridge
this.l2Messenger = args.l2Messenger
+ this.gasPriceOracle = args.gasPriceOracle
this.watcher = args.watcher
this.l1Wallet = args.l1Wallet
this.l2Wallet = args.l2Wallet
this.ctc = args.ctc
+ this.scc = args.scc
}
static async new(): Promise {
const addressManager = getAddressManager(l1Wallet)
const watcher = await initWatcher(l1Provider, l2Provider, addressManager)
- const gateway = await getGateway(l1Wallet, addressManager)
+ const l1Bridge = await getL1Bridge(l1Wallet, addressManager)
// fund the user if needed
const balance = await l2Wallet.getBalance()
if (balance.isZero()) {
- await fundUser(watcher, gateway, utils.parseEther('10'))
+ await fundUser(watcher, l1Bridge, utils.parseEther('20'))
}
-
- const ovmEth = getOvmEth(l2Wallet)
const l1Messenger = getContractFactory('iOVM_L1CrossDomainMessenger')
.connect(l1Wallet)
.attach(watcher.l1.messengerAddress)
+ const ovmEth = getOvmEth(l2Wallet)
+ const l2Bridge = await getL2Bridge(l2Wallet)
const l2Messenger = getContractFactory('iOVM_L2CrossDomainMessenger')
.connect(l2Wallet)
.attach(watcher.l2.messengerAddress)
@@ -76,12 +89,26 @@ export class OptimismEnv {
.connect(l1Wallet)
.attach(ctcAddress)
+ const gasPriceOracle = getContractFactory('OVM_GasPriceOracle')
+ .connect(l2Wallet)
+ .attach(predeploys.OVM_GasPriceOracle)
+
+ const sccAddress = await addressManager.getAddress(
+ 'OVM_StateCommitmentChain'
+ )
+ const scc = getContractFactory('OVM_StateCommitmentChain')
+ .connect(l1Wallet)
+ .attach(sccAddress)
+
return new OptimismEnv({
addressManager,
- gateway,
+ l1Bridge,
ctc,
+ scc,
l1Messenger,
ovmEth,
+ gasPriceOracle,
+ l2Bridge,
l2Messenger,
watcher,
l1Wallet,
@@ -95,4 +122,96 @@ export class OptimismEnv {
): Promise {
return waitForXDomainTransaction(this.watcher, tx, direction)
}
+
+ /**
+ * Relays all L2 => L1 messages found in a given L2 transaction.
+ *
+ * @param tx Transaction to find messages in.
+ */
+ async relayXDomainMessages(
+ tx: Promise | TransactionResponse
+ ): Promise {
+ tx = await tx
+
+ let messagePairs = []
+ while (true) {
+ try {
+ messagePairs = await getMessagesAndProofsForL2Transaction(
+ l1Provider,
+ l2Provider,
+ this.scc.address,
+ predeploys.OVM_L2CrossDomainMessenger,
+ tx.hash
+ )
+ break
+ } catch (err) {
+ if (err.message.includes('unable to find state root batch for tx')) {
+ await sleep(5000)
+ } else {
+ throw err
+ }
+ }
+ }
+
+ for (const { message, proof } of messagePairs) {
+ while (true) {
+ try {
+ const result = await this.l1Messenger
+ .connect(this.l1Wallet)
+ .relayMessage(
+ message.target,
+ message.sender,
+ message.message,
+ message.messageNonce,
+ proof
+ )
+ await result.wait()
+ break
+ } catch (err) {
+ if (err.message.includes('execution failed due to an exception')) {
+ await sleep(5000)
+ } else if (err.message.includes('Nonce too low')) {
+ await sleep(5000)
+ } else if (
+ err.message.includes('message has already been received')
+ ) {
+ break
+ } else {
+ throw err
+ }
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Sets the timeout of a test based on the challenge period of the current network. If the
+ * challenge period is greater than 60s (e.g., on Mainnet) then we skip this test entirely.
+ *
+ * @param testctx Function context of the test to modify (i.e. `this` when inside a test).
+ * @param env Optimism environment used to resolve the StateCommitmentChain.
+ */
+export const useDynamicTimeoutForWithdrawals = async (
+ testctx: any,
+ env: OptimismEnv
+) => {
+ if (!IS_LIVE_NETWORK) {
+ return
+ }
+
+ const challengePeriod = await env.scc.FRAUD_PROOF_WINDOW()
+ if (challengePeriod.gt(60)) {
+ console.log(
+ `WARNING: challenge period is greater than 60s (${challengePeriod.toString()}s), skipping test`
+ )
+ testctx.skip()
+ }
+
+ // 60s for state root batch to be published + (challenge period x 4)
+ const timeoutMs = 60000 + challengePeriod.toNumber() * 1000 * 4
+ console.log(
+ `NOTICE: inside a withdrawal test on a prod network, dynamically setting timeout to ${timeoutMs}ms`
+ )
+ testctx.timeout(timeoutMs)
}
diff --git a/integration-tests/test/shared/stress-test-helpers.ts b/integration-tests/test/shared/stress-test-helpers.ts
new file mode 100644
index 000000000000..d9f908d1eb25
--- /dev/null
+++ b/integration-tests/test/shared/stress-test-helpers.ts
@@ -0,0 +1,215 @@
+/* Imports: External */
+import { ethers } from 'ethers'
+
+/* Imports: Internal */
+import { OptimismEnv } from './env'
+import { Direction } from './watcher-utils'
+
+interface TransactionParams {
+ contract: ethers.Contract
+ functionName: string
+ functionParams: any[]
+}
+
+// Arbitrary big amount of gas for the L1<>L2 messages.
+const MESSAGE_GAS = 8_000_000
+
+export const executeL1ToL2Transactions = async (
+ env: OptimismEnv,
+ txs: TransactionParams[]
+) => {
+ for (const tx of txs) {
+ const signer = ethers.Wallet.createRandom().connect(env.l1Wallet.provider)
+ const receipt = await env.l1Messenger
+ .connect(signer)
+ .sendMessage(
+ tx.contract.address,
+ tx.contract.interface.encodeFunctionData(
+ tx.functionName,
+ tx.functionParams
+ ),
+ MESSAGE_GAS,
+ {
+ gasPrice: 0,
+ }
+ )
+
+ await env.waitForXDomainTransaction(receipt, Direction.L1ToL2)
+ }
+}
+
+export const executeL2ToL1Transactions = async (
+ env: OptimismEnv,
+ txs: TransactionParams[]
+) => {
+ for (const tx of txs) {
+ const signer = ethers.Wallet.createRandom().connect(env.l2Wallet.provider)
+ const receipt = await env.l2Messenger
+ .connect(signer)
+ .sendMessage(
+ tx.contract.address,
+ tx.contract.interface.encodeFunctionData(
+ tx.functionName,
+ tx.functionParams
+ ),
+ MESSAGE_GAS,
+ {
+ gasPrice: 0,
+ }
+ )
+
+ await env.relayXDomainMessages(receipt)
+ await env.waitForXDomainTransaction(receipt, Direction.L2ToL1)
+ }
+}
+
+export const executeL2Transactions = async (
+ env: OptimismEnv,
+ txs: TransactionParams[]
+) => {
+ for (const tx of txs) {
+ const signer = ethers.Wallet.createRandom().connect(env.l2Wallet.provider)
+ const result = await tx.contract
+ .connect(signer)
+ .functions[tx.functionName](...tx.functionParams, {
+ gasPrice: 0,
+ })
+ await result.wait()
+ }
+}
+
+export const executeRepeatedL1ToL2Transactions = async (
+ env: OptimismEnv,
+ tx: TransactionParams,
+ count: number
+) => {
+ await executeL1ToL2Transactions(
+ env,
+ [...Array(count).keys()].map(() => tx)
+ )
+}
+
+export const executeRepeatedL2ToL1Transactions = async (
+ env: OptimismEnv,
+ tx: TransactionParams,
+ count: number
+) => {
+ await executeL2ToL1Transactions(
+ env,
+ [...Array(count).keys()].map(() => tx)
+ )
+}
+
+export const executeRepeatedL2Transactions = async (
+ env: OptimismEnv,
+ tx: TransactionParams,
+ count: number
+) => {
+ await executeL2Transactions(
+ env,
+ [...Array(count).keys()].map(() => tx)
+ )
+}
+
+export const executeL1ToL2TransactionsParallel = async (
+ env: OptimismEnv,
+ txs: TransactionParams[]
+) => {
+ await Promise.all(
+ txs.map(async (tx) => {
+ const signer = ethers.Wallet.createRandom().connect(env.l1Wallet.provider)
+ const receipt = await env.l1Messenger
+ .connect(signer)
+ .sendMessage(
+ tx.contract.address,
+ tx.contract.interface.encodeFunctionData(
+ tx.functionName,
+ tx.functionParams
+ ),
+ MESSAGE_GAS,
+ {
+ gasPrice: 0,
+ }
+ )
+
+ await env.waitForXDomainTransaction(receipt, Direction.L1ToL2)
+ })
+ )
+}
+
+export const executeL2ToL1TransactionsParallel = async (
+ env: OptimismEnv,
+ txs: TransactionParams[]
+) => {
+ await Promise.all(
+ txs.map(async (tx) => {
+ const signer = ethers.Wallet.createRandom().connect(env.l2Wallet.provider)
+ const receipt = await env.l2Messenger
+ .connect(signer)
+ .sendMessage(
+ tx.contract.address,
+ tx.contract.interface.encodeFunctionData(
+ tx.functionName,
+ tx.functionParams
+ ),
+ MESSAGE_GAS,
+ {
+ gasPrice: 0,
+ }
+ )
+
+ await env.relayXDomainMessages(receipt)
+ await env.waitForXDomainTransaction(receipt, Direction.L2ToL1)
+ })
+ )
+}
+
+export const executeL2TransactionsParallel = async (
+ env: OptimismEnv,
+ txs: TransactionParams[]
+) => {
+ await Promise.all(
+ txs.map(async (tx) => {
+ const signer = ethers.Wallet.createRandom().connect(env.l2Wallet.provider)
+ const result = await tx.contract
+ .connect(signer)
+ .functions[tx.functionName](...tx.functionParams, {
+ gasPrice: 0,
+ })
+ await result.wait()
+ })
+ )
+}
+
+export const executeRepeatedL1ToL2TransactionsParallel = async (
+ env: OptimismEnv,
+ tx: TransactionParams,
+ count: number
+) => {
+ await executeL1ToL2TransactionsParallel(
+ env,
+ [...Array(count).keys()].map(() => tx)
+ )
+}
+
+export const executeRepeatedL2ToL1TransactionsParallel = async (
+ env: OptimismEnv,
+ tx: TransactionParams,
+ count: number
+) => {
+ await executeL2ToL1TransactionsParallel(
+ env,
+ [...Array(count).keys()].map(() => tx)
+ )
+}
+
+export const executeRepeatedL2TransactionsParallel = async (
+ env: OptimismEnv,
+ tx: TransactionParams,
+ count: number
+) => {
+ await executeL2TransactionsParallel(
+ env,
+ [...Array(count).keys()].map(() => tx)
+ )
+}
diff --git a/integration-tests/test/shared/utils.ts b/integration-tests/test/shared/utils.ts
index 48ca55a5c41b..aabab62b0a9a 100644
--- a/integration-tests/test/shared/utils.ts
+++ b/integration-tests/test/shared/utils.ts
@@ -1,10 +1,6 @@
-import { Direction, waitForXDomainTransaction } from './watcher-utils'
+import { expect } from 'chai'
-import {
- getContractFactory,
- getContractInterface,
-} from '@eth-optimism/contracts'
-import { Watcher } from '@eth-optimism/core-utils'
+/* Imports: External */
import {
Contract,
Wallet,
@@ -12,16 +8,35 @@ import {
providers,
BigNumberish,
BigNumber,
+ utils,
} from 'ethers'
-import { cleanEnv, str, num } from 'envalid'
+import {
+ getContractFactory,
+ getContractInterface,
+ predeploys,
+} from '@eth-optimism/contracts'
+import { injectL2Context, remove0x, Watcher } from '@eth-optimism/core-utils'
+import { cleanEnv, str, num, bool } from 'envalid'
+import dotenv from 'dotenv'
+
+/* Imports: Internal */
+import { Direction, waitForXDomainTransaction } from './watcher-utils'
export const GWEI = BigNumber.from(1e9)
+if (process.env.IS_LIVE_NETWORK === 'true') {
+ dotenv.config()
+}
+
const env = cleanEnv(process.env, {
L1_URL: str({ default: 'http://localhost:9545' }),
L2_URL: str({ default: 'http://localhost:8545' }),
+ VERIFIER_URL: str({ default: 'http://localhost:8547' }),
+ REPLICA_URL: str({ default: 'http://localhost:8549' }),
L1_POLLING_INTERVAL: num({ default: 10 }),
L2_POLLING_INTERVAL: num({ default: 10 }),
+ VERIFIER_POLLING_INTERVAL: num({ default: 10 }),
+ REPLICA_POLLING_INTERVAL: num({ default: 10 }),
PRIVATE_KEY: str({
default:
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
@@ -29,6 +44,8 @@ const env = cleanEnv(process.env, {
ADDRESS_MANAGER: str({
default: '0x5FbDB2315678afecb367f032d93F642f64180aa3',
}),
+ L2_CHAINID: num({ default: 420 }),
+ IS_LIVE_NETWORK: bool({ default: false }),
})
// The hardhat instance
@@ -38,6 +55,12 @@ l1Provider.pollingInterval = env.L1_POLLING_INTERVAL
export const l2Provider = new providers.JsonRpcProvider(env.L2_URL)
l2Provider.pollingInterval = env.L2_POLLING_INTERVAL
+export const verifierProvider = new providers.JsonRpcProvider(env.VERIFIER_URL)
+verifierProvider.pollingInterval = env.VERIFIER_POLLING_INTERVAL
+
+export const replicaProvider = new providers.JsonRpcProvider(env.REPLICA_URL)
+replicaProvider.pollingInterval = env.REPLICA_POLLING_INTERVAL
+
// The sequencer private key which is funded on L1
export const l1Wallet = new Wallet(env.PRIVATE_KEY, l1Provider)
@@ -48,7 +71,10 @@ export const l2Wallet = l1Wallet.connect(l2Provider)
// Predeploys
export const PROXY_SEQUENCER_ENTRYPOINT_ADDRESS =
'0x4200000000000000000000000000000000000004'
-export const OVM_ETH_ADDRESS = '0x4200000000000000000000000000000000000006'
+export const OVM_ETH_ADDRESS = predeploys.OVM_ETH
+
+export const L2_CHAINID = env.L2_CHAINID
+export const IS_LIVE_NETWORK = env.IS_LIVE_NETWORK
export const getAddressManager = (provider: any) => {
return getContractFactory('Lib_AddressManager')
@@ -56,24 +82,37 @@ export const getAddressManager = (provider: any) => {
.attach(env.ADDRESS_MANAGER)
}
-// Gets the gateway using the proxy if available
-export const getGateway = async (wallet: Wallet, AddressManager: Contract) => {
- const l1GatewayInterface = getContractInterface('OVM_L1ETHGateway')
- const ProxyGatewayAddress = await AddressManager.getAddress(
- 'Proxy__OVM_L1ETHGateway'
+// Gets the bridge contract
+export const getL1Bridge = async (wallet: Wallet, AddressManager: Contract) => {
+ const l1BridgeInterface = getContractInterface('OVM_L1StandardBridge')
+ const ProxyBridgeAddress = await AddressManager.getAddress(
+ 'Proxy__OVM_L1StandardBridge'
)
- const addressToUse =
- ProxyGatewayAddress !== constants.AddressZero
- ? ProxyGatewayAddress
- : await AddressManager.getAddress('OVM_L1ETHGateway')
-
- const OVM_L1ETHGateway = new Contract(
- addressToUse,
- l1GatewayInterface,
+
+ if (
+ !utils.isAddress(ProxyBridgeAddress) ||
+ ProxyBridgeAddress === constants.AddressZero
+ ) {
+ throw new Error('Proxy__OVM_L1StandardBridge not found')
+ }
+
+ const OVM_L1StandardBridge = new Contract(
+ ProxyBridgeAddress,
+ l1BridgeInterface,
wallet
)
+ return OVM_L1StandardBridge
+}
+
+export const getL2Bridge = async (wallet: Wallet) => {
+ const L2BridgeInterface = getContractInterface('OVM_L2StandardBridge')
- return OVM_L1ETHGateway
+ const OVM_L2StandardBridge = new Contract(
+ predeploys.OVM_L2StandardBridge,
+ L2BridgeInterface,
+ wallet
+ )
+ return OVM_L2StandardBridge
}
export const getOvmEth = (wallet: Wallet) => {
@@ -88,15 +127,80 @@ export const getOvmEth = (wallet: Wallet) => {
export const fundUser = async (
watcher: Watcher,
- gateway: Contract,
+ bridge: Contract,
amount: BigNumberish,
recipient?: string
) => {
const value = BigNumber.from(amount)
const tx = recipient
- ? gateway.depositTo(recipient, { value })
- : gateway.deposit({ value })
+ ? bridge.depositETHTo(recipient, 1_300_000, '0x', { value })
+ : bridge.depositETH(1_300_000, '0x', { value })
+
await waitForXDomainTransaction(watcher, tx, Direction.L1ToL2)
}
export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))
+
+const abiCoder = new utils.AbiCoder()
+export const encodeSolidityRevertMessage = (_reason: string): string => {
+ return '0x08c379a0' + remove0x(abiCoder.encode(['string'], [_reason]))
+}
+
+export const DEFAULT_TRANSACTION = {
+ to: '0x' + '1234'.repeat(10),
+ gasLimit: 33600000000001,
+ gasPrice: 0,
+ data: '0x',
+ value: 0,
+}
+
+interface percentDeviationRange {
+ upperPercentDeviation: number
+ lowerPercentDeviation?: number
+}
+
+export const expectApprox = (
+ actual: BigNumber | number,
+ target: BigNumber | number,
+ { upperPercentDeviation, lowerPercentDeviation = 100 }: percentDeviationRange
+) => {
+ actual = BigNumber.from(actual)
+ target = BigNumber.from(target)
+
+ const validDeviations =
+ upperPercentDeviation >= 0 &&
+ upperPercentDeviation <= 100 &&
+ lowerPercentDeviation >= 0 &&
+ lowerPercentDeviation <= 100
+ if (!validDeviations) {
+ throw new Error(
+ 'Upper and lower deviation percentage arguments should be between 0 and 100'
+ )
+ }
+ const upper = target.mul(100 + upperPercentDeviation).div(100)
+ const lower = target.mul(100 - lowerPercentDeviation).div(100)
+
+ expect(
+ actual.lte(upper),
+ `Actual value is more than ${upperPercentDeviation}% greater than target`
+ ).to.be.true
+ expect(
+ actual.gte(lower),
+ `Actual value is more than ${lowerPercentDeviation}% less than target`
+ ).to.be.true
+}
+
+export const waitForL2Geth = async (
+ provider: providers.JsonRpcProvider
+): Promise => {
+ let ready: boolean = false
+ while (!ready) {
+ try {
+ await provider.getNetwork()
+ ready = true
+ } catch (error) {
+ await sleep(1000)
+ }
+ }
+ return injectL2Context(provider)
+}
diff --git a/integration-tests/test/stress-tests.spec.ts b/integration-tests/test/stress-tests.spec.ts
new file mode 100644
index 000000000000..98fcce437620
--- /dev/null
+++ b/integration-tests/test/stress-tests.spec.ts
@@ -0,0 +1,242 @@
+import { expect } from 'chai'
+
+/* Imports: External */
+import { Contract, ContractFactory } from 'ethers'
+
+/* Imports: Internal */
+import { OptimismEnv } from './shared/env'
+import {
+ executeRepeatedL1ToL2Transactions,
+ executeRepeatedL2ToL1Transactions,
+ executeRepeatedL2Transactions,
+ executeRepeatedL1ToL2TransactionsParallel,
+ executeRepeatedL2ToL1TransactionsParallel,
+ executeRepeatedL2TransactionsParallel,
+} from './shared/stress-test-helpers'
+
+/* Imports: Artifacts */
+import l1SimpleStorageJson from '../artifacts/contracts/SimpleStorage.sol/SimpleStorage.json'
+import l2SimpleStorageJson from '../artifacts-ovm/contracts/SimpleStorage.sol/SimpleStorage.json'
+
+// Need a big timeout to allow for all transactions to be processed.
+// For some reason I can't figure out how to set the timeout on a per-suite basis
+// so I'm instead setting it for every test.
+const STRESS_TEST_TIMEOUT = 300_000
+
+describe('stress tests', () => {
+ let env: OptimismEnv
+ before(async () => {
+ env = await OptimismEnv.new()
+ })
+
+ let L2SimpleStorage: Contract
+ let L1SimpleStorage: Contract
+ beforeEach(async () => {
+ const factory__L1SimpleStorage = new ContractFactory(
+ l1SimpleStorageJson.abi,
+ l1SimpleStorageJson.bytecode,
+ env.l1Wallet
+ )
+ const factory__L2SimpleStorage = new ContractFactory(
+ l2SimpleStorageJson.abi,
+ l2SimpleStorageJson.bytecode,
+ env.l2Wallet
+ )
+ L1SimpleStorage = await factory__L1SimpleStorage.deploy()
+ await L1SimpleStorage.deployTransaction.wait()
+ L2SimpleStorage = await factory__L2SimpleStorage.deploy()
+ await L2SimpleStorage.deployTransaction.wait()
+ })
+
+ describe('L1 => L2 stress tests', () => {
+ const numTransactions = 10
+
+ it(`${numTransactions} L1 => L2 transactions (serial)`, async () => {
+ await executeRepeatedL1ToL2Transactions(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ )
+
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+
+ it(`${numTransactions} L1 => L2 transactions (parallel)`, async () => {
+ await executeRepeatedL1ToL2TransactionsParallel(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ )
+
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+ })
+
+ describe('L2 => L1 stress tests', () => {
+ const numTransactions = 10
+
+ it(`${numTransactions} L2 => L1 transactions (serial)`, async () => {
+ await executeRepeatedL2ToL1Transactions(
+ env,
+ {
+ contract: L1SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ )
+
+ expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+
+ it(`${numTransactions} L2 => L1 transactions (parallel)`, async () => {
+ await executeRepeatedL2ToL1TransactionsParallel(
+ env,
+ {
+ contract: L1SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ )
+
+ expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+ })
+
+ describe('L2 transaction stress tests', () => {
+ const numTransactions = 10
+
+ it(`${numTransactions} L2 transactions (serial)`, async () => {
+ await executeRepeatedL2Transactions(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValueNotXDomain',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ )
+
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+
+ it(`${numTransactions} L2 transactions (parallel)`, async () => {
+ await executeRepeatedL2TransactionsParallel(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValueNotXDomain',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ )
+
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+ })
+
+ describe('C-C-C-Combo breakers', () => {
+ const numTransactions = 10
+
+ it(`${numTransactions} L2 transactions, L1 => L2 transactions, L2 => L1 transactions (txs serial, suites parallel)`, async () => {
+ await Promise.all([
+ executeRepeatedL1ToL2Transactions(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ ),
+ executeRepeatedL2ToL1Transactions(
+ env,
+ {
+ contract: L1SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ ),
+ executeRepeatedL2Transactions(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValueNotXDomain',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ ),
+ ])
+
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions * 2
+ )
+
+ expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+
+ it(`${numTransactions} L2 transactions, L1 => L2 transactions, L2 => L1 transactions (all parallel)`, async () => {
+ await Promise.all([
+ executeRepeatedL1ToL2TransactionsParallel(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ ),
+ executeRepeatedL2ToL1TransactionsParallel(
+ env,
+ {
+ contract: L1SimpleStorage,
+ functionName: 'setValue',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ ),
+ executeRepeatedL2TransactionsParallel(
+ env,
+ {
+ contract: L2SimpleStorage,
+ functionName: 'setValueNotXDomain',
+ functionParams: [`0x${'42'.repeat(32)}`],
+ },
+ numTransactions
+ ),
+ ])
+
+ expect((await L2SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions * 2
+ )
+
+ expect((await L1SimpleStorage.totalCount()).toNumber()).to.equal(
+ numTransactions
+ )
+ }).timeout(STRESS_TEST_TIMEOUT)
+ })
+})
diff --git a/integration-tests/tsconfig.json b/integration-tests/tsconfig.json
index 6f1b3deb5717..fb827e9e7179 100644
--- a/integration-tests/tsconfig.json
+++ b/integration-tests/tsconfig.json
@@ -3,6 +3,6 @@
"compilerOptions": {
"resolveJsonModule": true
},
- "include": ["./test"],
+ "include": ["./test", "sync-tests/*.ts", "./artifacts/**/*.json", "./artifacts-ovm/**/*.json"],
"files": ["./hardhat.config.ts"]
}
diff --git a/integration-tests/tslint.json b/integration-tests/tslint.json
deleted file mode 100644
index d6d9b0e0ca6b..000000000000
--- a/integration-tests/tslint.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "extends": "../tslint.base.json",
- "rules": {
- "array-type": false,
- "class-name": false
- }
-}
diff --git a/l2geth/CHANGELOG.md b/l2geth/CHANGELOG.md
index 8d43374228f4..69954f8fda6d 100644
--- a/l2geth/CHANGELOG.md
+++ b/l2geth/CHANGELOG.md
@@ -1,5 +1,142 @@
# Changelog
+## 0.4.4
+
+### Patch Changes
+
+- 0404c964: Allow zero gas price transactions from the `OVM_GasPriceOracle.owner` when enforce fees is set to true. This is to prevent the need to manage an additional hot wallet as well as prevent any situation where a bug causes the fees to go too high that it is not possible to lower the fee by sending a transaction
+- c612a903: Add sequencer fee buffer with config options `ROLLUP_FEE_THRESHOLD_UP` and `ROLLUP_FEE_THRESHOLD_DOWN` that are interpreted as floating point numbers
+
+## 0.4.3
+
+### Patch Changes
+
+- 6e2074c5: Update the `RollupClient` transaction type to use `hexutil.Big`
+
+## 0.4.2
+
+### Patch Changes
+
+- 7e04137d: Handle errors correctly in the RollupClient and retry in the SyncService when initially attempting to connect to the DTL
+
+## 0.4.1
+
+### Patch Changes
+
+- 40b99a6e: Add new RPC endpoint `rollup_gasPrices`
+
+## 0.4.0
+
+### Minor Changes
+
+- e04de624: Add support for ovmCALL with nonzero ETH value
+
+### Patch Changes
+
+- 01646a0a: Add new config `ROLLUP_GAS_PRICE_ORACLE_OWNER_ADDRESS` to set the owner of the gas price oracle at runtime
+- 8fee7bed: Add extra overflow protection for the DTL types
+- 5fc728da: Add a new Standard Token Bridge, to handle deposits and withdrawals of any ERC20 token.
+ For projects developing a custom bridge, if you were previously importing `iAbs_BaseCrossDomainMessenger`, you should now
+ import `iOVM_CrossDomainMessenger`.
+- 257deb70: Prevent overflows in abi encoding of ovm codec transaction from geth types.Transaction
+- 08873674: Update queueOrigin type
+- 01646a0a: Removes config options that are no longer required. `ROLLUP_DATAPRICE`, `ROLLUP_EXECUTION_PRICE`, `ROLLUP_GAS_PRICE_ORACLE_ADDRESS` and `ROLLUP_ENABLE_L2_GAS_POLLING`. The oracle was moved to a predeploy 0x42.. address and polling is always enabled as it no longer needs to be backwards compatible
+- 0a7f5a46: Removes the gas refund for unused gas in geth since it is instead managed in the smart contracts
+- e045f582: Adds new SequencerFeeVault contract to store generated fees
+- 25a5dbdd: Removes the SignatureHashType from l2geth as it is deprecated and no longer required.
+
+## 0.3.9
+
+### Patch Changes
+
+- f409ce75: Fixes an off-by-one error that would sometimes break replica syncing when stopping and restarting geth.
+- d9fd67d2: Correctly log 'end of OVM execution' message.
+
+## 0.3.8
+
+### Patch Changes
+
+- 989a3027: Optimize main polling loops
+- cc6c7f07: Bump golang version to 1.15
+
+## 0.3.7
+
+### Patch Changes
+
+- cb4a928b: Make block hashes deterministic by using the same clique signer key
+- f1b27318: Fixes incorrect type parsing in the RollupClient. The gasLimit became greater than the largest safe JS number so it needs to be represented as a string
+- a64f8161: Implement the next fee spec in both geth and in core-utils
+- 5e4eaea1: fix potential underflow when launching the chain when the last verified index is 0
+- 1293825c: Fix gasLimit overflow
+- a25acbbd: Refactor the SyncService to more closely implement the specification. This includes using query params to select the backend from the DTL, trailing syncing of batches for the sequencer, syncing by batches as the verifier as well as unified code paths for transaction ingestion to prevent double ingestion or missed ingestion
+- c2b6e14b: Implement the latest fee spec such that the L2 gas limit is scaled and the tx.gasPrice/tx.gasLimit show correctly in metamask
+
+## 0.3.6
+
+### Patch Changes
+
+- f091e86: Fix to ensure that L1 => L2 success status is reflected correctly in receipts
+- f880479: End to end fee integration with recoverable L2 gas limit
+
+## 0.3.5
+
+### Patch Changes
+
+- d4c9793: Fixed a bug where reverts without data would not be correctly propagated for eth_call
+- 3958644: Adds the `debug_ingestTransactions` endpoint that takes a list of RPC transactions and applies each of them to the state sequentially. This is useful for testing purposes
+- c880043: Fix gas estimation logic for simple ETH transfers
+- 467d6cb: Adds a test for contract deployments that run out of gas
+- 4e6c3f9: add an env var METRICS_ENABLE for MetricsEnabledFlag
+
+## 0.3.4
+
+### Patch Changes
+
+- e2b70c1: Don't panic on a monotonicity violation
+
+## 0.3.3
+
+### Patch Changes
+
+- f5185bb: Fix bug with replica syncing where contract creations would fail in replicas but pass in the sequencer. This was due to the change from a custom batched tx serialization to the batch serialzation for txs being regular RLP encoding
+
+## 0.3.2
+
+### Patch Changes
+
+- 20242af: Fixes a bug in L2geth that causes it to skip the first deposit if there have been no deposits batch-submitted yet
+- cf3cfe4: Allow for dynamically set configuration of the gasLimit in the contracts by setting the storage slot at runtime
+- de5e3dc: Updates `scripts/start.sh` with the mainnet config by default
+
+## 0.3.1
+
+### Patch Changes
+
+- 9231063: Prevent montonicity errors in the miner
+
+## 0.3.0
+
+### Minor Changes
+
+- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release
+
+### Patch Changes
+
+- b799caa: Add value parsing to the rollup client
+- b799caa: Removes the extra setting of the txmeta in the syncservice and instead sets the raw tx in the txmeta at the rpc layer
+- b799caa: Fill in the raw transaction into the txmeta in the `eth_sendTransaction` codepath
+- b799caa: Add support for parsed revert reasons in DoEstimateGas
+- b799caa: Update minimum response from estimate gas
+- b799caa: Add value transfer support to ECDSAContractAccount
+- b799caa: Ignore the deprecated type field in the API
+- b799caa: Return bytes from both ExecutionManager.run and ExecutionManager.simulateMessage and be sure to properly ABI decode the return values and the nested (bool, returndata)
+- b799caa: Block access to RPCs related to signing transactions
+- b799caa: Add ExecutionManager return data & RLP encoding
+- b799caa: Update gas related things in the RPC to allow transactions with high gas limits and prevent gas estimations from being too small
+- 9b7dd4b: Update `scripts/start.sh` to parse the websocket port and pass to geth at runtime
+- b799caa: Remove the OVMSigner
+- b799caa: Prevent 0 value transactions with calldata via RPC
+
## 0.2.6
### Patch Changes
diff --git a/l2geth/README.md b/l2geth/README.md
index 2578ca233596..0f2e8595d974 100644
--- a/l2geth/README.md
+++ b/l2geth/README.md
@@ -48,8 +48,9 @@ $ USING_OVM=true ./build/bin/geth \
--rollup.pollinterval 3s \
--eth1.networkid $LAYER1_NETWORK_ID \
--eth1.chainid $LAYER1_CHAIN_ID \
- --eth1.l1gatewayaddress $ETH1_L1_GATEWAY_ADDRESS \
+ --eth1.l1standardbridgeaddress $ETH1_L1_STANDARD_BRIDGE_ADDRESS \
--eth1.l1crossdomainmessengeraddress $ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS \
+ --eth1.l1feewalletaddress $ETH1_L1_FEE_WALLET_ADDRESS \
--eth1.addressresolveraddress $ETH1_ADDRESS_RESOLVER_ADDRESS \
--eth1.ctcdeploymentheight $CTC_DEPLOY_HEIGHT \
--eth1.syncservice \
diff --git a/l2geth/accounts/abi/abi.go b/l2geth/accounts/abi/abi.go
index 194df46af5c2..2febc38261f2 100644
--- a/l2geth/accounts/abi/abi.go
+++ b/l2geth/accounts/abi/abi.go
@@ -19,10 +19,12 @@ package abi
import (
"bytes"
"encoding/json"
+ "errors"
"fmt"
"io"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
)
// The ABI holds information about a contract's context and available
@@ -192,3 +194,25 @@ func (abi *ABI) EventByID(topic common.Hash) (*Event, error) {
}
return nil, fmt.Errorf("no event with id: %#x", topic.Hex())
}
+
+// RevertSelector is a special function selector for revert reason unpacking.
+var RevertSelector = crypto.Keccak256([]byte("Error(string)"))[:4]
+
+// UnpackRevert resolves the abi-encoded revert reason. According to the solidity
+// docs https://docs.soliditylang.org/en/v0.8.4/control-structures.html#revert,
+// the provided revert reason is abi-encoded as if it were a call to a function
+// `Error(string)`. So it's a special tool for it.
+func UnpackRevert(data []byte) (string, error) {
+ if len(data) < 4 {
+ return "", errors.New("invalid data for unpacking")
+ }
+ if !bytes.Equal(data[:4], RevertSelector) {
+ return "", errors.New("invalid data for unpacking")
+ }
+ typ, _ := NewType("string", "", nil)
+ unpacked, err := (Arguments{{Type: typ}}).UnpackValues(data[4:])
+ if err != nil {
+ return "", err
+ }
+ return unpacked[0].(string), nil
+}
diff --git a/l2geth/accounts/abi/bind/backends/simulated.go b/l2geth/accounts/abi/bind/backends/simulated.go
index 243491799533..83701e91f4d5 100644
--- a/l2geth/accounts/abi/bind/backends/simulated.go
+++ b/l2geth/accounts/abi/bind/backends/simulated.go
@@ -601,10 +601,9 @@ func (m callmsg) Gas() uint64 { return m.CallMsg.Gas }
func (m callmsg) Value() *big.Int { return m.CallMsg.Value }
func (m callmsg) Data() []byte { return m.CallMsg.Data }
-func (m callmsg) L1MessageSender() *common.Address { return m.CallMsg.L1MessageSender }
-func (m callmsg) L1BlockNumber() *big.Int { return m.CallMsg.L1BlockNumber }
-func (m callmsg) QueueOrigin() *big.Int { return m.CallMsg.QueueOrigin }
-func (m callmsg) SignatureHashType() types.SignatureHashType { return m.CallMsg.SignatureHashType }
+func (m callmsg) L1MessageSender() *common.Address { return m.CallMsg.L1MessageSender }
+func (m callmsg) L1BlockNumber() *big.Int { return m.CallMsg.L1BlockNumber }
+func (m callmsg) QueueOrigin() types.QueueOrigin { return m.CallMsg.QueueOrigin }
// filterBackend implements filters.Backend to support filtering for logs without
// taking bloom-bits acceleration structures into account.
diff --git a/l2geth/accounts/keystore/keystore.go b/l2geth/accounts/keystore/keystore.go
index 5b55175b1f3e..1ddd98a4622f 100644
--- a/l2geth/accounts/keystore/keystore.go
+++ b/l2geth/accounts/keystore/keystore.go
@@ -21,6 +21,7 @@
package keystore
import (
+ "bytes"
"crypto/ecdsa"
crand "crypto/rand"
"errors"
@@ -36,8 +37,10 @@ import (
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/event"
+ "github.com/ethereum/go-ethereum/log"
)
var (
@@ -80,6 +83,21 @@ func NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore {
keydir, _ = filepath.Abs(keydir)
ks := &KeyStore{storage: &keyStorePassphrase{keydir, scryptN, scryptP, false}}
ks.init(keydir)
+ if vm.UsingOVM {
+ // Add a deterministic key to the key store so that
+ // all clique blocks are signed with the same key
+ input := make([]byte, 65)
+ rng := bytes.NewReader(input)
+ key, err := newKey(rng)
+ log.Info("Adding key to keyring", "address", key.Address.Hex())
+ if err != nil {
+ panic(fmt.Sprintf("cannot create key: %s", err))
+ }
+ _, err = ks.importKey(key, "")
+ if err != nil {
+ panic(fmt.Sprintf("cannot import key: %s", err))
+ }
+ }
return ks
}
diff --git a/l2geth/cmd/geth/main.go b/l2geth/cmd/geth/main.go
index 54facda951dd..c5dd94e0d0a2 100644
--- a/l2geth/cmd/geth/main.go
+++ b/l2geth/cmd/geth/main.go
@@ -153,10 +153,10 @@ var (
utils.Eth1SyncServiceEnable,
utils.Eth1CanonicalTransactionChainDeployHeightFlag,
utils.Eth1L1CrossDomainMessengerAddressFlag,
- utils.Eth1ETHGatewayAddressFlag,
+ utils.Eth1L1FeeWalletAddressFlag,
+ utils.Eth1StandardBridgeAddressFlag,
utils.Eth1ChainIdFlag,
utils.RollupClientHttpFlag,
- // Enable verifier mode
utils.RollupEnableVerifierFlag,
utils.RollupAddressManagerOwnerAddressFlag,
utils.RollupTimstampRefreshFlag,
@@ -164,8 +164,11 @@ var (
utils.RollupStateDumpPathFlag,
utils.RollupDiffDbFlag,
utils.RollupMaxCalldataSizeFlag,
- utils.RollupDataPriceFlag,
- utils.RollupExecutionPriceFlag,
+ utils.RollupBackendFlag,
+ utils.RollupEnforceFeesFlag,
+ utils.RollupFeeThresholdDownFlag,
+ utils.RollupFeeThresholdUpFlag,
+ utils.GasPriceOracleOwnerAddress,
}
rpcFlags = []cli.Flag{
diff --git a/l2geth/cmd/geth/usage.go b/l2geth/cmd/geth/usage.go
index abfb30f346bc..456f2ffcadab 100644
--- a/l2geth/cmd/geth/usage.go
+++ b/l2geth/cmd/geth/usage.go
@@ -68,7 +68,8 @@ var AppHelpFlagGroups = []flagGroup{
utils.Eth1SyncServiceEnable,
utils.Eth1CanonicalTransactionChainDeployHeightFlag,
utils.Eth1L1CrossDomainMessengerAddressFlag,
- utils.Eth1ETHGatewayAddressFlag,
+ utils.Eth1L1FeeWalletAddressFlag,
+ utils.Eth1StandardBridgeAddressFlag,
utils.Eth1ChainIdFlag,
utils.RollupClientHttpFlag,
utils.RollupAddressManagerOwnerAddressFlag,
@@ -78,8 +79,11 @@ var AppHelpFlagGroups = []flagGroup{
utils.RollupStateDumpPathFlag,
utils.RollupDiffDbFlag,
utils.RollupMaxCalldataSizeFlag,
- utils.RollupDataPriceFlag,
- utils.RollupExecutionPriceFlag,
+ utils.RollupBackendFlag,
+ utils.RollupEnforceFeesFlag,
+ utils.RollupFeeThresholdDownFlag,
+ utils.RollupFeeThresholdUpFlag,
+ utils.GasPriceOracleOwnerAddress,
},
},
{
diff --git a/l2geth/cmd/utils/flags.go b/l2geth/cmd/utils/flags.go
index c9364e6b9de1..3bebe8557083 100644
--- a/l2geth/cmd/utils/flags.go
+++ b/l2geth/cmd/utils/flags.go
@@ -175,7 +175,7 @@ var (
ChainIdFlag = cli.Uint64Flag{
Name: "chainid",
Usage: "Chain ID identifier",
- Value: 420,
+ Value: 28,
EnvVar: "CHAIN_ID",
}
TestnetFlag = cli.BoolFlag{
@@ -471,12 +471,13 @@ var (
MinerEtherbaseFlag = cli.StringFlag{
Name: "miner.etherbase",
Usage: "Public address for block mining rewards (default = first account)",
- Value: "0",
+
+ Value: "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
+ EnvVar: "ETHERBASE",
}
MinerLegacyEtherbaseFlag = cli.StringFlag{
Name: "etherbase",
Usage: "Public address for block mining rewards (default = first account, deprecated, use --miner.etherbase)",
- Value: "0",
}
MinerExtraDataFlag = cli.StringFlag{
Name: "miner.extradata",
@@ -755,6 +756,8 @@ var (
MetricsEnabledFlag = cli.BoolFlag{
Name: "metrics",
Usage: "Enable metrics collection and reporting",
+
+ EnvVar: "METRICS_ENABLE",
}
MetricsEnabledExpensiveFlag = cli.BoolFlag{
Name: "metrics.expensive",
@@ -820,11 +823,17 @@ var (
Value: "0x0000000000000000000000000000000000000000",
EnvVar: "ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS",
}
- Eth1ETHGatewayAddressFlag = cli.StringFlag{
- Name: "eth1.l1ethgatewayaddress",
- Usage: "Deployment address of the Ethereum gateway",
+ Eth1L1FeeWalletAddressFlag = cli.StringFlag{
+ Name: "eth1.l1feewalletaddress",
+ Usage: "Address of the L1 wallet that will collect fees",
+ Value: "0x0000000000000000000000000000000000000000",
+ EnvVar: "ETH1_L1_FEE_WALLET_ADDRESS",
+ }
+ Eth1StandardBridgeAddressFlag = cli.StringFlag{
+ Name: "eth1.l1standardbridgeaddress",
+ Usage: "Deployment address of the Standard Bridge",
Value: "0x0000000000000000000000000000000000000000",
- EnvVar: "ETH1_L1_ETH_GATEWAY_ADDRESS",
+ EnvVar: "ETH1_L1_STANDARD_BRIDGE_ADDRESS",
}
Eth1ChainIdFlag = cli.Uint64Flag{
Name: "eth1.chainid",
@@ -849,7 +858,12 @@ var (
Value: time.Minute * 3,
EnvVar: "ROLLUP_TIMESTAMP_REFRESH",
}
- // Flag to enable verifier mode
+ RollupBackendFlag = cli.StringFlag{
+ Name: "rollup.backend",
+ Usage: "Sync backend for verifiers (\"l1\" or \"l2\"), defaults to l1",
+ Value: "l1",
+ EnvVar: "ROLLUP_BACKEND",
+ }
RollupEnableVerifierFlag = cli.BoolFlag{
Name: "rollup.verifier",
Usage: "Enable the verifier",
@@ -879,17 +893,25 @@ var (
Value: eth.DefaultConfig.Rollup.MaxCallDataSize,
EnvVar: "ROLLUP_MAX_CALLDATA_SIZE",
}
- RollupDataPriceFlag = BigFlag{
- Name: "rollup.dataprice",
- Usage: "The L1 calldata price to use for the sequencer fees",
- Value: eth.DefaultConfig.Rollup.DataPrice,
- EnvVar: "ROLLUP_DATAPRICE",
+ RollupEnforceFeesFlag = cli.BoolFlag{
+ Name: "rollup.enforcefeesflag",
+ Usage: "Disable transactions with 0 gas price",
+ EnvVar: "ROLLUP_ENFORCE_FEES",
+ }
+ RollupFeeThresholdDownFlag = cli.BoolFlag{
+ Name: "rollup.feethresholddown",
+ Usage: "Allow txs with fees below the current fee up to this amount, must be < 1",
+ EnvVar: "ROLLUP_FEE_THRESHOLD_DOWN",
+ }
+ RollupFeeThresholdUpFlag = cli.BoolFlag{
+ Name: "rollup.feethresholdup",
+ Usage: "Allow txs with fees above the current fee up to this amount, must be > 1",
+ EnvVar: "ROLLUP_FEE_THRESHOLD_UP",
}
- RollupExecutionPriceFlag = BigFlag{
- Name: "rollup.executionprice",
- Usage: "The execution gas price to use for the sequencer fees",
- Value: eth.DefaultConfig.Rollup.ExecutionPrice,
- EnvVar: "ROLLUP_EXECUTIONPRICE",
+ GasPriceOracleOwnerAddress = cli.StringFlag{
+ Name: "rollup.gaspriceoracleowneraddress",
+ Usage: "Owner of the OVM_GasPriceOracle",
+ EnvVar: "ROLLUP_GAS_PRICE_ORACLE_OWNER_ADDRESS",
}
)
@@ -1124,9 +1146,13 @@ func setEth1(ctx *cli.Context, cfg *rollup.Config) {
addr := ctx.GlobalString(Eth1L1CrossDomainMessengerAddressFlag.Name)
cfg.L1CrossDomainMessengerAddress = common.HexToAddress(addr)
}
- if ctx.GlobalIsSet(Eth1ETHGatewayAddressFlag.Name) {
- addr := ctx.GlobalString(Eth1ETHGatewayAddressFlag.Name)
- cfg.L1ETHGatewayAddress = common.HexToAddress(addr)
+ if ctx.GlobalIsSet(Eth1L1FeeWalletAddressFlag.Name) {
+ addr := ctx.GlobalString(Eth1L1FeeWalletAddressFlag.Name)
+ cfg.L1FeeWalletAddress = common.HexToAddress(addr)
+ }
+ if ctx.GlobalIsSet(Eth1StandardBridgeAddressFlag.Name) {
+ addr := ctx.GlobalString(Eth1StandardBridgeAddressFlag.Name)
+ cfg.L1StandardBridgeAddress = common.HexToAddress(addr)
}
if ctx.GlobalIsSet(Eth1ChainIdFlag.Name) {
cfg.Eth1ChainId = ctx.GlobalUint64(Eth1ChainIdFlag.Name)
@@ -1164,11 +1190,29 @@ func setRollup(ctx *cli.Context, cfg *rollup.Config) {
if ctx.GlobalIsSet(RollupTimstampRefreshFlag.Name) {
cfg.TimestampRefreshThreshold = ctx.GlobalDuration(RollupTimstampRefreshFlag.Name)
}
- if ctx.GlobalIsSet(RollupDataPriceFlag.Name) {
- cfg.DataPrice = GlobalBig(ctx, RollupDataPriceFlag.Name)
+ if ctx.GlobalIsSet(GasPriceOracleOwnerAddress.Name) {
+ addr := ctx.GlobalString(GasPriceOracleOwnerAddress.Name)
+ cfg.GasPriceOracleOwnerAddress = common.HexToAddress(addr)
+ }
+ if ctx.GlobalIsSet(RollupBackendFlag.Name) {
+ val := ctx.GlobalString(RollupBackendFlag.Name)
+ backend, err := rollup.NewBackend(val)
+ if err != nil {
+ log.Error("Configured with unknown sync backend, defaulting to l1", "backend", val)
+ backend, _ = rollup.NewBackend("l1")
+ }
+ cfg.Backend = backend
+ }
+ if ctx.GlobalIsSet(RollupEnforceFeesFlag.Name) {
+ cfg.EnforceFees = true
+ }
+ if ctx.GlobalIsSet(RollupFeeThresholdDownFlag.Name) {
+ val := ctx.GlobalFloat64(RollupFeeThresholdDownFlag.Name)
+ cfg.FeeThresholdDown = new(big.Float).SetFloat64(val)
}
- if ctx.GlobalIsSet(RollupExecutionPriceFlag.Name) {
- cfg.ExecutionPrice = GlobalBig(ctx, RollupExecutionPriceFlag.Name)
+ if ctx.GlobalIsSet(RollupFeeThresholdUpFlag.Name) {
+ val := ctx.GlobalFloat64(RollupFeeThresholdUpFlag.Name)
+ cfg.FeeThresholdUp = new(big.Float).SetFloat64(val)
}
}
@@ -1734,10 +1778,12 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
gasLimit = params.GenesisGasLimit
}
xdomainAddress := cfg.Rollup.L1CrossDomainMessengerAddress
+ l1FeeWalletAddress := cfg.Rollup.L1FeeWalletAddress
addrManagerOwnerAddress := cfg.Rollup.AddressManagerOwnerAddress
- l1ETHGatewayAddress := cfg.Rollup.L1ETHGatewayAddress
+ l1StandardBridgeAddress := cfg.Rollup.L1StandardBridgeAddress
+ gpoOwnerAddress := cfg.Rollup.GasPriceOracleOwnerAddress
stateDumpPath := cfg.Rollup.StateDumpPath
- cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer.Address, xdomainAddress, l1ETHGatewayAddress, addrManagerOwnerAddress, stateDumpPath, chainID, gasLimit)
+ cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer.Address, xdomainAddress, l1StandardBridgeAddress, addrManagerOwnerAddress, gpoOwnerAddress, l1FeeWalletAddress, stateDumpPath, chainID, gasLimit)
if !ctx.GlobalIsSet(MinerGasPriceFlag.Name) && !ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) {
cfg.Miner.GasPrice = big.NewInt(1)
}
diff --git a/l2geth/consensus/clique/clique.go b/l2geth/consensus/clique/clique.go
index 29201e2ba0d1..62bc27c1fe0f 100644
--- a/l2geth/consensus/clique/clique.go
+++ b/l2geth/consensus/clique/clique.go
@@ -23,7 +23,6 @@ import (
"io"
"math/big"
"math/rand"
- "os"
"sync"
"time"
@@ -34,6 +33,7 @@ import (
"github.com/ethereum/go-ethereum/consensus/misc"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/log"
@@ -249,7 +249,7 @@ func (c *Clique) verifyHeader(chain consensus.ChainReader, header *types.Header,
}
number := header.Number.Uint64()
- if os.Getenv("USING_OVM") != "true" {
+ if vm.UsingOVM {
// Don't waste time checking blocks from the future
if header.Time > uint64(time.Now().Unix()) {
return consensus.ErrFutureBlock
@@ -631,7 +631,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c
log.Trace("Out-of-turn signing requested", "wiggle", common.PrettyDuration(wiggle))
}
- if os.Getenv("USING_OVM") == "true" {
+ if vm.UsingOVM {
delay = 0
}
// Sign all the things!
diff --git a/l2geth/console/console_test.go b/l2geth/console/console_test.go
index 3060da5c6f7a..4a835d2b9519 100644
--- a/l2geth/console/console_test.go
+++ b/l2geth/console/console_test.go
@@ -98,7 +98,7 @@ func newTester(t *testing.T, confOverride func(*eth.Config)) *tester {
t.Fatalf("failed to create node: %v", err)
}
ethConf := ð.Config{
- Genesis: core.DeveloperGenesisBlock(15, common.Address{}, common.Address{}, common.Address{}, common.Address{}, "", nil, 12000000),
+ Genesis: core.DeveloperGenesisBlock(15, common.Address{}, common.Address{}, common.Address{}, common.Address{}, common.Address{}, common.Address{}, "", nil, 12000000),
Miner: miner.Config{
Etherbase: common.HexToAddress(testAddress),
},
diff --git a/l2geth/core/genesis.go b/l2geth/core/genesis.go
index 4787fd6794e5..380d9dd1eccd 100644
--- a/l2geth/core/genesis.go
+++ b/l2geth/core/genesis.go
@@ -69,9 +69,11 @@ type Genesis struct {
// OVM Specific, used to initialize the l1XDomainMessengerAddress
// in the genesis state
+ L1FeeWalletAddress common.Address `json:"-"`
L1CrossDomainMessengerAddress common.Address `json:"-"`
AddressManagerOwnerAddress common.Address `json:"-"`
- L1ETHGatewayAddress common.Address `json:"-"`
+ GasPriceOracleOwnerAddress common.Address `json:"-"`
+ L1StandardBridgeAddress common.Address `json:"-"`
ChainID *big.Int `json:"-"`
}
@@ -266,7 +268,7 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
}
// ApplyOvmStateToState applies the initial OVM state to a state object.
-func ApplyOvmStateToState(statedb *state.StateDB, stateDump *dump.OvmDump, l1XDomainMessengerAddress common.Address, l1ETHGatewayAddress common.Address, addrManagerOwnerAddress common.Address, chainID *big.Int) {
+func ApplyOvmStateToState(statedb *state.StateDB, stateDump *dump.OvmDump, l1XDomainMessengerAddress, l1StandardBridgeAddress, addrManagerOwnerAddress, gpoOwnerAddress, l1FeeWalletAddress common.Address, chainID *big.Int, gasLimit uint64) {
if len(stateDump.Accounts) == 0 {
return
}
@@ -299,22 +301,13 @@ func ApplyOvmStateToState(statedb *state.StateDB, stateDump *dump.OvmDump, l1XDo
l1MessengerValue := common.BytesToHash(l1XDomainMessengerAddress.Bytes())
statedb.SetState(AddressManager.Address, l1MessengerSlot, l1MessengerValue)
}
- OVM_ETH, ok := stateDump.Accounts["OVM_ETH"]
+ OVM_L2StandardBridge, ok := stateDump.Accounts["OVM_L2StandardBridge"]
if ok {
- log.Info("Setting OVM_L1ETHGateway in OVM_ETH", "address", l1ETHGatewayAddress.Hex())
- if strings.Contains(OVM_ETH.Code, "a84ce98") {
- // Set the gateway of OVM_ETH at new dump
- log.Info("Detected current OVM_ETH dump, setting slot 0x1 ")
- l1GatewaySlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001")
- l1GatewayValue := common.BytesToHash(l1ETHGatewayAddress.Bytes())
- statedb.SetState(OVM_ETH.Address, l1GatewaySlot, l1GatewayValue)
- } else {
- // Set the gateway of OVM_ETH at legacy slot
- log.Info("Detected legacy OVM_ETH dump, setting slot 0x8")
- l1GatewaySlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000008")
- l1GatewayValue := common.BytesToHash(l1ETHGatewayAddress.Bytes())
- statedb.SetState(OVM_ETH.Address, l1GatewaySlot, l1GatewayValue)
- }
+ log.Info("Setting OVM_L1StandardBridge in OVM_L2StandardBridge", "address", l1StandardBridgeAddress.Hex())
+ // Set the gateway of OVM_L2StandardBridge at new dump
+ l1BridgeSlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001")
+ l1BridgeValue := common.BytesToHash(l1StandardBridgeAddress.Bytes())
+ statedb.SetState(OVM_L2StandardBridge.Address, l1BridgeSlot, l1BridgeValue)
}
ExecutionManager, ok := stateDump.Accounts["OVM_ExecutionManager"]
if ok {
@@ -325,6 +318,24 @@ func ApplyOvmStateToState(statedb *state.StateDB, stateDump *dump.OvmDump, l1XDo
chainIdSlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000007")
chainIdValue := common.BytesToHash(chainID.Bytes())
statedb.SetState(ExecutionManager.Address, chainIdSlot, chainIdValue)
+ log.Info("Setting maxTransactionGasLimit in ExecutionManager", "gas-limit", gasLimit)
+ maxTxGasLimitSlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000004")
+ maxTxGasLimitValue := common.BytesToHash(new(big.Int).SetUint64(gasLimit).Bytes())
+ statedb.SetState(ExecutionManager.Address, maxTxGasLimitSlot, maxTxGasLimitValue)
+ }
+ OVM_SequencerFeeVault, ok := stateDump.Accounts["OVM_SequencerFeeVault"]
+ if ok {
+ log.Info("Setting l1FeeWallet in OVM_SequencerFeeVault", "wallet", l1FeeWalletAddress.Hex())
+ l1FeeWalletSlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000")
+ l1FeeWalletValue := common.BytesToHash(l1FeeWalletAddress.Bytes())
+ statedb.SetState(OVM_SequencerFeeVault.Address, l1FeeWalletSlot, l1FeeWalletValue)
+ GasPriceOracle, ok := stateDump.Accounts["OVM_GasPriceOracle"]
+ if ok {
+ ownerSlot := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000")
+ ownerValue := common.BytesToHash(gpoOwnerAddress.Bytes())
+ statedb.SetState(GasPriceOracle.Address, ownerSlot, ownerValue)
+ log.Info("Setting GasPriceOracle Owner", "owner", gpoOwnerAddress.Hex())
+ }
}
}
@@ -338,7 +349,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
if vm.UsingOVM {
// OVM_ENABLED
- ApplyOvmStateToState(statedb, g.Config.StateDump, g.L1CrossDomainMessengerAddress, g.L1ETHGatewayAddress, g.AddressManagerOwnerAddress, g.ChainID)
+ ApplyOvmStateToState(statedb, g.Config.StateDump, g.L1CrossDomainMessengerAddress, g.L1StandardBridgeAddress, g.AddressManagerOwnerAddress, g.GasPriceOracleOwnerAddress, g.L1FeeWalletAddress, g.ChainID, g.GasLimit)
}
for addr, account := range g.Alloc {
@@ -465,7 +476,7 @@ func DefaultGoerliGenesisBlock() *Genesis {
}
// DeveloperGenesisBlock returns the 'geth --dev' genesis block.
-func DeveloperGenesisBlock(period uint64, faucet, l1XDomainMessengerAddress common.Address, l1ETHGatewayAddress common.Address, addrManagerOwnerAddress common.Address, stateDumpPath string, chainID *big.Int, gasLimit uint64) *Genesis {
+func DeveloperGenesisBlock(period uint64, faucet, l1XDomainMessengerAddress common.Address, l1StandardBridgeAddress common.Address, addrManagerOwnerAddress, gpoOwnerAddress, l1FeeWalletAddress common.Address, stateDumpPath string, chainID *big.Int, gasLimit uint64) *Genesis {
// Override the default period to the user requested one
config := *params.AllCliqueProtocolChanges
config.Clique.Period = period
@@ -521,8 +532,10 @@ func DeveloperGenesisBlock(period uint64, faucet, l1XDomainMessengerAddress comm
common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing
},
L1CrossDomainMessengerAddress: l1XDomainMessengerAddress,
+ L1FeeWalletAddress: l1FeeWalletAddress,
AddressManagerOwnerAddress: addrManagerOwnerAddress,
- L1ETHGatewayAddress: l1ETHGatewayAddress,
+ GasPriceOracleOwnerAddress: gpoOwnerAddress,
+ L1StandardBridgeAddress: l1StandardBridgeAddress,
ChainID: config.ChainID,
}
}
diff --git a/l2geth/core/rawdb/accessors_chain_test.go b/l2geth/core/rawdb/accessors_chain_test.go
index 3c1ffa065ec2..6d81deb3be79 100644
--- a/l2geth/core/rawdb/accessors_chain_test.go
+++ b/l2geth/core/rawdb/accessors_chain_test.go
@@ -430,7 +430,7 @@ func TestBlockMetaStorage(t *testing.T) {
index1 := uint64(1)
tx1 := types.NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil)
- tx1Meta := types.NewTransactionMeta(nil, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, &index1, nil, nil)
+ tx1Meta := types.NewTransactionMeta(nil, 0, nil, types.QueueOriginSequencer, &index1, nil, nil)
tx1.SetTransactionMeta(tx1Meta)
WriteTransactionMeta(db, index1, tx1.GetMeta())
@@ -442,9 +442,6 @@ func TestBlockMetaStorage(t *testing.T) {
if meta.L1BlockNumber != nil {
t.Fatalf("Could not recover L1BlockNumber")
}
- if meta.SignatureHashType != types.SighashEIP155 {
- t.Fatalf("Could not recover sighash type")
- }
if meta.Index == nil {
t.Fatalf("Could not recover index")
}
@@ -464,7 +461,7 @@ func TestBlockMetaStorage(t *testing.T) {
index2 := uint64(2)
tx2 := types.NewTransaction(2, common.HexToAddress("0x02"), big.NewInt(2), 2, big.NewInt(2), nil)
- tx2Meta := types.NewTransactionMeta(l1BlockNumber, 0, &addr, types.SighashEthSign, types.QueueOriginSequencer, nil, nil, nil)
+ tx2Meta := types.NewTransactionMeta(l1BlockNumber, 0, &addr, types.QueueOriginSequencer, nil, nil, nil)
tx2.SetTransactionMeta(tx2Meta)
WriteTransactionMeta(db, index2, tx2.GetMeta())
@@ -477,7 +474,4 @@ func TestBlockMetaStorage(t *testing.T) {
if meta2.L1BlockNumber.Cmp(l1BlockNumber) != 0 {
t.Fatalf("Could not recover L1BlockNumber")
}
- if meta2.SignatureHashType != types.SighashEthSign {
- t.Fatalf("Could not recover sighash type")
- }
}
diff --git a/l2geth/core/rawdb/accessors_indexes_test.go b/l2geth/core/rawdb/accessors_indexes_test.go
index f980bcf20976..74b3f08a71b8 100644
--- a/l2geth/core/rawdb/accessors_indexes_test.go
+++ b/l2geth/core/rawdb/accessors_indexes_test.go
@@ -73,15 +73,15 @@ func TestLookupStorage(t *testing.T) {
l1BlockNumber2 := big.NewInt(2)
tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11})
- tx1Meta := types.NewTransactionMeta(l1BlockNumber1, 0, &sender1, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil)
+ tx1Meta := types.NewTransactionMeta(l1BlockNumber1, 0, &sender1, types.QueueOriginSequencer, nil, nil, nil)
tx1.SetTransactionMeta(tx1Meta)
tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22})
- tx2Meta := types.NewTransactionMeta(l1BlockNumber2, 0, &sender2, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil)
+ tx2Meta := types.NewTransactionMeta(l1BlockNumber2, 0, &sender2, types.QueueOriginSequencer, nil, nil, nil)
tx2.SetTransactionMeta(tx2Meta)
tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33})
- tx3Meta := types.NewTransactionMeta(l1BlockNumber1, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil)
+ tx3Meta := types.NewTransactionMeta(l1BlockNumber1, 0, nil, types.QueueOriginSequencer, nil, nil, nil)
tx3.SetTransactionMeta(tx3Meta)
txs := []*types.Transaction{tx1, tx2, tx3}
diff --git a/l2geth/core/rawdb/rollup_indexes.go b/l2geth/core/rawdb/rollup_indexes.go
index 91b1b6385463..abed95aff40a 100644
--- a/l2geth/core/rawdb/rollup_indexes.go
+++ b/l2geth/core/rawdb/rollup_indexes.go
@@ -69,3 +69,24 @@ func WriteHeadVerifiedIndex(db ethdb.KeyValueWriter, index uint64) {
log.Crit("Failed to store verifier index", "err", err)
}
}
+
+// ReadHeadBatchIndex will read the known tip of the processed batches
+func ReadHeadBatchIndex(db ethdb.KeyValueReader) *uint64 {
+ data, _ := db.Get(headBatchKey)
+ if len(data) == 0 {
+ return nil
+ }
+ ret := new(big.Int).SetBytes(data).Uint64()
+ return &ret
+}
+
+// WriteHeadBatchIndex will write the known tip of the processed batches
+func WriteHeadBatchIndex(db ethdb.KeyValueWriter, index uint64) {
+ value := new(big.Int).SetUint64(index).Bytes()
+ if index == 0 {
+ value = []byte{0}
+ }
+ if err := db.Put(headBatchKey, value); err != nil {
+ log.Crit("Failed to store head batch index", "err", err)
+ }
+}
diff --git a/l2geth/core/rawdb/schema.go b/l2geth/core/rawdb/schema.go
index d0f951e2bdc8..5563af68fba3 100644
--- a/l2geth/core/rawdb/schema.go
+++ b/l2geth/core/rawdb/schema.go
@@ -62,6 +62,8 @@ var (
headQueueIndexKey = []byte("LastQueueIndex")
// headVerifiedIndexKey tracks the latest verified index
headVerifiedIndexKey = []byte("LastVerifiedIndex")
+ // headBatchKey tracks the latest processed batch
+ headBatchKey = []byte("LastBatch")
preimagePrefix = []byte("secure-key-") // preimagePrefix + hash -> preimage
configPrefix = []byte("ethereum-config-") // config prefix for the db
diff --git a/l2geth/core/rollup_fee.go b/l2geth/core/rollup_fee.go
deleted file mode 100644
index 1ad0f538ac0b..000000000000
--- a/l2geth/core/rollup_fee.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package core
-
-import (
- "math/big"
-
- "github.com/ethereum/go-ethereum/params"
-)
-
-// RollupBaseTxSize is the encoded rollup transaction's compressed size excluding
-// the variable length data.
-// Ref: https://github.com/ethereum-optimism/optimism/blob/91a9a3dcddf534ae1c906133b6d8e015a23c463b/packages/contracts/contracts/optimistic-ethereum/OVM/predeploys/OVM_SequencerEntrypoint.sol#L47
-const RollupBaseTxSize uint64 = 96
-
-// CalculateFee calculates the fee that must be paid to the Rollup sequencer, taking into
-// account the cost of publishing data to L1.
-// Returns: (4 * zeroDataBytes + 16 * (nonZeroDataBytes + RollupBaseTxSize)) * dataPrice + executionPrice * gasUsed
-func CalculateRollupFee(data []byte, gasUsed uint64, dataPrice, executionPrice *big.Int) *big.Int {
- zeroes, ones := zeroesAndOnes(data)
- zeroesCost := new(big.Int).SetUint64(zeroes * params.TxDataZeroGas)
- onesCost := new(big.Int).SetUint64((RollupBaseTxSize + ones) * params.TxDataNonZeroGasEIP2028)
- dataCost := new(big.Int).Add(zeroesCost, onesCost)
-
- // get the data fee
- dataFee := new(big.Int).Mul(dataPrice, dataCost)
- executionFee := new(big.Int).Mul(executionPrice, new(big.Int).SetUint64(gasUsed))
- fee := new(big.Int).Add(dataFee, executionFee)
- return fee
-}
-
-func zeroesAndOnes(data []byte) (uint64, uint64) {
- var zeroes uint64
- for _, byt := range data {
- if byt == 0 {
- zeroes++
- }
- }
- ones := uint64(len(data)) - zeroes
- return zeroes, ones
-}
diff --git a/l2geth/core/rollup_fee_test.go b/l2geth/core/rollup_fee_test.go
deleted file mode 100644
index 1fc413000c41..000000000000
--- a/l2geth/core/rollup_fee_test.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package core
-
-import (
- "math/big"
- "testing"
-)
-
-var feeTests = map[string]struct {
- dataLen int
- gasUsed uint64
- dataPrice int64
- executionPrice int64
-}{
- "simple": {10000, 10, 20, 30},
- "zero gas used": {10000, 0, 20, 30},
- "zero data price": {10000, 0, 0, 30},
- "zero execution price": {10000, 0, 0, 0},
-}
-
-func TestCalculateRollupFee(t *testing.T) {
- for name, tt := range feeTests {
- t.Run(name, func(t *testing.T) {
- data := make([]byte, 0, tt.dataLen)
- fee := CalculateRollupFee(data, tt.gasUsed, big.NewInt(tt.dataPrice), big.NewInt(tt.executionPrice))
-
- zeroes, ones := zeroesAndOnes(data)
- zeroesCost := zeroes * 4
- onesCost := (96 + ones) * 16
- dataCost := zeroesCost + onesCost
- dataFee := int64(dataCost) * tt.dataPrice
-
- executionFee := uint64(tt.executionPrice) * tt.gasUsed
- expectedFee := uint64(dataFee) + executionFee
- if fee.Cmp(big.NewInt(int64(expectedFee))) != 0 {
- t.Errorf("rollup fee check failed: expected %d, got %s", expectedFee, fee.String())
- }
- })
- }
-}
diff --git a/l2geth/core/state/statedb.go b/l2geth/core/state/statedb.go
index e5be7ab75358..7f0597537fc7 100644
--- a/l2geth/core/state/statedb.go
+++ b/l2geth/core/state/statedb.go
@@ -269,7 +269,7 @@ func (s *StateDB) GetBalance(addr common.Address) *big.Int {
func (s *StateDB) GetOVMBalance(addr common.Address) *big.Int {
eth := common.HexToAddress("0x4200000000000000000000000000000000000006")
- position := big.NewInt(5)
+ position := big.NewInt(0)
hasher := sha3.NewLegacyKeccak256()
hasher.Write(common.LeftPadBytes(addr.Bytes(), 32))
hasher.Write(common.LeftPadBytes(position.Bytes(), 32))
diff --git a/l2geth/core/state_transition.go b/l2geth/core/state_transition.go
index d0106680f52c..4c45eb153dae 100644
--- a/l2geth/core/state_transition.go
+++ b/l2geth/core/state_transition.go
@@ -77,8 +77,7 @@ type Message interface {
Data() []byte
L1MessageSender() *common.Address
L1BlockNumber() *big.Int
- QueueOrigin() *big.Int
- SignatureHashType() types.SignatureHashType
+ QueueOrigin() types.QueueOrigin
}
// IntrinsicGas computes the 'intrinsic gas' for a message with the given data.
@@ -185,9 +184,7 @@ func (st *StateTransition) preCheck() error {
if nonce < st.msg.Nonce() {
if vm.UsingOVM {
// The nonce never increments for L1ToL2 txs
- qo := st.msg.QueueOrigin()
- l1ToL2 := uint64(types.QueueOriginL1ToL2)
- if qo != nil && qo.Uint64() == l1ToL2 {
+ if st.msg.QueueOrigin() == types.QueueOriginL1ToL2 {
return st.buyGas()
}
}
@@ -252,7 +249,7 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo
l1MessageSender = msg.L1MessageSender().Hex()
}
if st.evm.EthCallSender == nil {
- log.Debug("Applying transaction", "ID", st.evm.Id, "from", sender.Address().Hex(), "to", to, "nonce", msg.Nonce(), "gasPrice", msg.GasPrice().Uint64(), "gasLimit", msg.Gas(), "l1MessageSender", l1MessageSender, "data", hexutil.Encode(msg.Data()))
+ log.Debug("Applying transaction", "ID", st.evm.Id, "from", sender.Address().Hex(), "to", to, "nonce", msg.Nonce(), "gasPrice", msg.GasPrice().Uint64(), "gasLimit", msg.Gas(), "value", msg.Value().Uint64(), "l1MessageSender", l1MessageSender, "data", hexutil.Encode(msg.Data()))
}
}
@@ -283,6 +280,9 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo
}
func (st *StateTransition) refundGas() {
+ if vm.UsingOVM {
+ return
+ }
// Apply refund counter, capped to half of the used gas.
refund := st.gasUsed() / 2
if refund > st.state.GetRefund() {
diff --git a/l2geth/core/state_transition_ovm.go b/l2geth/core/state_transition_ovm.go
index 0f7b698d6b57..5d84acbc4828 100644
--- a/l2geth/core/state_transition_ovm.go
+++ b/l2geth/core/state_transition_ovm.go
@@ -26,7 +26,7 @@ func toExecutionManagerRun(evm *vm.EVM, msg Message) (Message, error) {
tx := ovmTransaction{
evm.Context.Time,
msg.L1BlockNumber(),
- uint8(msg.QueueOrigin().Uint64()),
+ uint8(msg.QueueOrigin()),
*msg.L1MessageSender(),
*msg.To(),
big.NewInt(int64(msg.Gas())),
@@ -73,8 +73,7 @@ func AsOvmMessage(tx *types.Transaction, signer types.Signer, decompressor commo
// sequencer entrypoint. The calldata is expected to be in the
// correct format when deserialized from the EVM events, see
// rollup/sync_service.go.
- qo := msg.QueueOrigin()
- if qo != nil && qo.Uint64() == uint64(types.QueueOriginL1ToL2) {
+ if msg.QueueOrigin() == types.QueueOriginL1ToL2 {
return msg, nil
}
@@ -101,13 +100,18 @@ func EncodeSimulatedMessage(msg Message, timestamp, blockNumber *big.Int, execut
to = &common.Address{0}
}
+ value := msg.Value()
+ if value == nil {
+ value = common.Big0
+ }
+
tx := ovmTransaction{
timestamp,
blockNumber,
- uint8(msg.QueueOrigin().Uint64()),
+ uint8(msg.QueueOrigin()),
*msg.L1MessageSender(),
*to,
- big.NewInt(int64(msg.Gas())),
+ new(big.Int).SetUint64(msg.Gas()),
msg.Data(),
}
@@ -115,6 +119,7 @@ func EncodeSimulatedMessage(msg Message, timestamp, blockNumber *big.Int, execut
var args = []interface{}{
tx,
from,
+ value,
stateManager.Address,
}
@@ -139,39 +144,19 @@ func modMessage(
data []byte,
gasLimit uint64,
) (Message, error) {
- queueOrigin, err := getQueueOrigin(msg.QueueOrigin())
- if err != nil {
- return nil, err
- }
-
outmsg := types.NewMessage(
from,
to,
msg.Nonce(),
- msg.Value(),
+ common.Big0,
gasLimit,
msg.GasPrice(),
data,
false,
msg.L1MessageSender(),
msg.L1BlockNumber(),
- queueOrigin,
- msg.SignatureHashType(),
+ msg.QueueOrigin(),
)
return outmsg, nil
}
-
-func getQueueOrigin(
- queueOrigin *big.Int,
-) (types.QueueOrigin, error) {
- if queueOrigin.Cmp(big.NewInt(0)) == 0 {
- return types.QueueOriginSequencer, nil
- } else if queueOrigin.Cmp(big.NewInt(1)) == 0 {
- return types.QueueOriginL1ToL2, nil
- } else if queueOrigin.Cmp(big.NewInt(2)) == 0 {
- return types.QueueOriginL1ToL2, nil
- } else {
- return types.QueueOriginSequencer, fmt.Errorf("invalid queue origin: %d", queueOrigin)
- }
-}
diff --git a/l2geth/core/tx_pool.go b/l2geth/core/tx_pool.go
index 6ad8c40d1148..1244e27835ca 100644
--- a/l2geth/core/tx_pool.go
+++ b/l2geth/core/tx_pool.go
@@ -92,9 +92,8 @@ var (
)
var (
- evictionInterval = time.Minute // Time interval to check for evictable transactions
- statsReportInterval = 8 * time.Second // Time interval to report transaction pool stats
- gwei = big.NewInt(params.GWei) // 1 gwei, used as a flag for "rollup" transactions
+ evictionInterval = time.Minute // Time interval to check for evictable transactions
+ statsReportInterval = 8 * time.Second // Time interval to report transaction pool stats
)
var (
@@ -540,10 +539,14 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error {
}
// Ensure the transaction doesn't exceed the current block limit gas.
- // We skip this condition check if the transaction's gasPrice is set to 1gwei,
- // which indicates a "rollup" transaction that's paying for its data.
- if pool.currentMaxGas < tx.Gas() && tx.GasPrice().Cmp(gwei) != 0 {
- return ErrGasLimit
+ if vm.UsingOVM {
+ if pool.currentMaxGas < tx.L2Gas() {
+ return ErrGasLimit
+ }
+ } else {
+ if pool.currentMaxGas < tx.Gas() {
+ return ErrGasLimit
+ }
}
// Make sure the transaction is signed properly
diff --git a/l2geth/core/types/gen_tx_json.go b/l2geth/core/types/gen_tx_json.go
index f8638522b070..e676058ecc4b 100644
--- a/l2geth/core/types/gen_tx_json.go
+++ b/l2geth/core/types/gen_tx_json.go
@@ -13,8 +13,8 @@ import (
var _ = (*txdataMarshaling)(nil)
-// TransactionMarshalJSON marshals as JSON.
-func (t txdata) TransactionMarshalJSON() ([]byte, error) {
+// MarshalJSON marshals as JSON.
+func (t txdata) MarshalJSON() ([]byte, error) {
type txdata struct {
AccountNonce hexutil.Uint64 `json:"nonce" gencodec:"required"`
Price *hexutil.Big `json:"gasPrice" gencodec:"required"`
@@ -41,8 +41,8 @@ func (t txdata) TransactionMarshalJSON() ([]byte, error) {
return json.Marshal(&enc)
}
-// TransactionUnmarshalJSON unmarshals from JSON.
-func (t *txdata) TransactionUnmarshalJSON(input []byte) error {
+// UnmarshalJSON unmarshals from JSON.
+func (t *txdata) UnmarshalJSON(input []byte) error {
type txdata struct {
AccountNonce *hexutil.Uint64 `json:"nonce" gencodec:"required"`
Price *hexutil.Big `json:"gasPrice" gencodec:"required"`
diff --git a/l2geth/core/types/gen_tx_meta_json.go b/l2geth/core/types/gen_tx_meta_json.go
index 5bf2f763f36e..0f99ba918546 100644
--- a/l2geth/core/types/gen_tx_meta_json.go
+++ b/l2geth/core/types/gen_tx_meta_json.go
@@ -13,29 +13,35 @@ import (
// MarshalJSON marshals as JSON.
func (t TransactionMeta) MarshalJSON() ([]byte, error) {
type TransactionMeta struct {
- L1BlockNumber *big.Int `json:"l1BlockNumber"`
- L1MessageSender *common.Address `json:"l1MessageSender" gencodec:"required"`
- SignatureHashType SignatureHashType `json:"signatureHashType" gencodec:"required"`
- QueueOrigin *big.Int `json:"queueOrigin" gencodec:"required"`
- Index *uint64 `json:"index" gencodec:"required"`
+ L1BlockNumber *big.Int `json:"l1BlockNumber"`
+ L1Timestamp uint64 `json:"l1Timestamp"`
+ L1MessageSender *common.Address `json:"l1MessageSender" gencodec:"required"`
+ QueueOrigin QueueOrigin `json:"queueOrigin" gencodec:"required"`
+ Index *uint64 `json:"index" gencodec:"required"`
+ QueueIndex *uint64 `json:"queueIndex" gencodec:"required"`
+ RawTransaction []byte `json:"rawTransaction" gencodec:"required"`
}
var enc TransactionMeta
enc.L1BlockNumber = t.L1BlockNumber
+ enc.L1Timestamp = t.L1Timestamp
enc.L1MessageSender = t.L1MessageSender
- enc.SignatureHashType = t.SignatureHashType
enc.QueueOrigin = t.QueueOrigin
enc.Index = t.Index
+ enc.QueueIndex = t.QueueIndex
+ enc.RawTransaction = t.RawTransaction
return json.Marshal(&enc)
}
// UnmarshalJSON unmarshals from JSON.
func (t *TransactionMeta) UnmarshalJSON(input []byte) error {
type TransactionMeta struct {
- L1BlockNumber *big.Int `json:"l1BlockNumber"`
- L1MessageSender *common.Address `json:"l1MessageSender" gencodec:"required"`
- SignatureHashType *SignatureHashType `json:"signatureHashType" gencodec:"required"`
- QueueOrigin *big.Int `json:"queueOrigin" gencodec:"required"`
- Index *uint64 `json:"index" gencodec:"required"`
+ L1BlockNumber *big.Int `json:"l1BlockNumber"`
+ L1Timestamp *uint64 `json:"l1Timestamp"`
+ L1MessageSender *common.Address `json:"l1MessageSender" gencodec:"required"`
+ QueueOrigin *QueueOrigin `json:"queueOrigin" gencodec:"required"`
+ Index *uint64 `json:"index" gencodec:"required"`
+ QueueIndex *uint64 `json:"queueIndex" gencodec:"required"`
+ RawTransaction []byte `json:"rawTransaction" gencodec:"required"`
}
var dec TransactionMeta
if err := json.Unmarshal(input, &dec); err != nil {
@@ -44,21 +50,28 @@ func (t *TransactionMeta) UnmarshalJSON(input []byte) error {
if dec.L1BlockNumber != nil {
t.L1BlockNumber = dec.L1BlockNumber
}
+ if dec.L1Timestamp != nil {
+ t.L1Timestamp = *dec.L1Timestamp
+ }
if dec.L1MessageSender == nil {
return errors.New("missing required field 'l1MessageSender' for TransactionMeta")
}
t.L1MessageSender = dec.L1MessageSender
- if dec.SignatureHashType == nil {
- return errors.New("missing required field 'signatureHashType' for TransactionMeta")
- }
- t.SignatureHashType = *dec.SignatureHashType
if dec.QueueOrigin == nil {
return errors.New("missing required field 'queueOrigin' for TransactionMeta")
}
- t.QueueOrigin = dec.QueueOrigin
+ t.QueueOrigin = *dec.QueueOrigin
if dec.Index == nil {
return errors.New("missing required field 'index' for TransactionMeta")
}
t.Index = dec.Index
+ if dec.QueueIndex == nil {
+ return errors.New("missing required field 'queueIndex' for TransactionMeta")
+ }
+ t.QueueIndex = dec.QueueIndex
+ if dec.RawTransaction == nil {
+ return errors.New("missing required field 'rawTransaction' for TransactionMeta")
+ }
+ t.RawTransaction = dec.RawTransaction
return nil
}
diff --git a/l2geth/core/types/transaction.go b/l2geth/core/types/transaction.go
index 3aaf1c3c2590..9f41bd11aaae 100644
--- a/l2geth/core/types/transaction.go
+++ b/l2geth/core/types/transaction.go
@@ -27,6 +27,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/rlp"
+ "github.com/ethereum/go-ethereum/rollup/fees"
)
//go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go
@@ -35,15 +36,6 @@ var (
ErrInvalidSig = errors.New("invalid transaction v, r, s values")
)
-// TODO(mark): migrate from sighash type to type
-type SignatureHashType uint8
-
-const (
- SighashEIP155 SignatureHashType = 0
- SighashEthSign SignatureHashType = 1
- CreateEOA SignatureHashType = 2
-)
-
type Transaction struct {
data txdata
meta TransactionMeta
@@ -85,7 +77,6 @@ func NewTransaction(nonce uint64, to common.Address, amount *big.Int, gasLimit u
return newTransaction(nonce, &to, amount, gasLimit, gasPrice, data)
}
-// TODO: cannot deploy contracts with SighashEthSign right until SighashEIP155 is no longer hardcoded
func NewContractCreation(nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *Transaction {
return newTransaction(nonce, nil, amount, gasLimit, gasPrice, data)
}
@@ -95,7 +86,7 @@ func newTransaction(nonce uint64, to *common.Address, amount *big.Int, gasLimit
data = common.CopyBytes(data)
}
- meta := NewTransactionMeta(nil, 0, nil, SighashEIP155, QueueOriginSequencer, nil, nil, nil)
+ meta := NewTransactionMeta(nil, 0, nil, QueueOriginSequencer, nil, nil, nil)
d := txdata{
AccountNonce: nonce,
@@ -196,12 +187,12 @@ func (tx *Transaction) DecodeRLP(s *rlp.Stream) error {
// MarshalJSON encodes the web3 RPC transaction format.
func (tx *Transaction) MarshalJSON() ([]byte, error) {
- return tx.data.TransactionMarshalJSON()
+ return tx.data.MarshalJSON()
}
// UnmarshalJSON decodes the web3 RPC transaction format.
func (tx *Transaction) UnmarshalJSON(input []byte) error {
- err := tx.data.TransactionUnmarshalJSON(input)
+ err := tx.data.UnmarshalJSON(input)
if err != nil {
return err
}
@@ -225,19 +216,13 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error {
func (tx *Transaction) Data() []byte { return common.CopyBytes(tx.data.Payload) }
func (tx *Transaction) Gas() uint64 { return tx.data.GasLimit }
+func (tx *Transaction) L2Gas() uint64 { return fees.DecodeL2GasLimitU64(tx.data.GasLimit) }
func (tx *Transaction) GasPrice() *big.Int { return new(big.Int).Set(tx.data.Price) }
func (tx *Transaction) Value() *big.Int { return new(big.Int).Set(tx.data.Amount) }
func (tx *Transaction) Nonce() uint64 { return tx.data.AccountNonce }
func (tx *Transaction) CheckNonce() bool { return true }
-func (tx *Transaction) SetNonce(nonce uint64) { tx.data.AccountNonce = nonce }
-func (tx *Transaction) SignatureHashType() SignatureHashType { return tx.meta.SignatureHashType }
-func (tx *Transaction) SetSignatureHashType(sighashType SignatureHashType) {
- tx.meta.SignatureHashType = sighashType
-}
-func (tx *Transaction) IsEthSignSighash() bool {
- return tx.SignatureHashType() == SighashEthSign
-}
+func (tx *Transaction) SetNonce(nonce uint64) { tx.data.AccountNonce = nonce }
// To returns the recipient address of the transaction.
// It returns nil if the transaction is a contract creation.
@@ -269,13 +254,9 @@ func (tx *Transaction) L1BlockNumber() *big.Int {
return &l1BlockNumber
}
-// QueueOrigin returns the Queue Origin of the transaction if it exists.
-func (tx *Transaction) QueueOrigin() *big.Int {
- if tx.meta.QueueOrigin == nil {
- return nil
- }
- queueOrigin := *tx.meta.QueueOrigin
- return &queueOrigin
+// QueueOrigin returns the Queue Origin of the transaction
+func (tx *Transaction) QueueOrigin() QueueOrigin {
+ return tx.meta.QueueOrigin
}
// Hash hashes the RLP encoding of tx.
@@ -317,10 +298,9 @@ func (tx *Transaction) AsMessage(s Signer) (Message, error) {
data: tx.data.Payload,
checkNonce: true,
- l1MessageSender: tx.meta.L1MessageSender,
- l1BlockNumber: tx.meta.L1BlockNumber,
- signatureHashType: tx.meta.SignatureHashType,
- queueOrigin: tx.meta.QueueOrigin,
+ l1MessageSender: tx.meta.L1MessageSender,
+ l1BlockNumber: tx.meta.L1BlockNumber,
+ queueOrigin: tx.meta.QueueOrigin,
}
var err error
@@ -533,13 +513,12 @@ type Message struct {
data []byte
checkNonce bool
- l1MessageSender *common.Address
- l1BlockNumber *big.Int
- signatureHashType SignatureHashType
- queueOrigin *big.Int
+ l1MessageSender *common.Address
+ l1BlockNumber *big.Int
+ queueOrigin QueueOrigin
}
-func NewMessage(from common.Address, to *common.Address, nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte, checkNonce bool, l1MessageSender *common.Address, l1BlockNumber *big.Int, queueOrigin QueueOrigin, signatureHashType SignatureHashType) Message {
+func NewMessage(from common.Address, to *common.Address, nonce uint64, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte, checkNonce bool, l1MessageSender *common.Address, l1BlockNumber *big.Int, queueOrigin QueueOrigin) Message {
return Message{
from: from,
to: to,
@@ -550,10 +529,9 @@ func NewMessage(from common.Address, to *common.Address, nonce uint64, amount *b
data: data,
checkNonce: checkNonce,
- l1BlockNumber: l1BlockNumber,
- l1MessageSender: l1MessageSender,
- signatureHashType: signatureHashType,
- queueOrigin: big.NewInt(int64(queueOrigin)),
+ l1BlockNumber: l1BlockNumber,
+ l1MessageSender: l1MessageSender,
+ queueOrigin: queueOrigin,
}
}
@@ -566,7 +544,6 @@ func (m Message) Nonce() uint64 { return m.nonce }
func (m Message) Data() []byte { return m.data }
func (m Message) CheckNonce() bool { return m.checkNonce }
-func (m Message) L1MessageSender() *common.Address { return m.l1MessageSender }
-func (m Message) L1BlockNumber() *big.Int { return m.l1BlockNumber }
-func (m Message) SignatureHashType() SignatureHashType { return m.signatureHashType }
-func (m Message) QueueOrigin() *big.Int { return m.queueOrigin }
+func (m Message) L1MessageSender() *common.Address { return m.l1MessageSender }
+func (m Message) L1BlockNumber() *big.Int { return m.l1BlockNumber }
+func (m Message) QueueOrigin() QueueOrigin { return m.queueOrigin }
diff --git a/l2geth/core/types/transaction_meta.go b/l2geth/core/types/transaction_meta.go
index a475c53decc7..7f68e6530129 100644
--- a/l2geth/core/types/transaction_meta.go
+++ b/l2geth/core/types/transaction_meta.go
@@ -12,7 +12,7 @@ import (
"github.com/ethereum/go-ethereum/common"
)
-type QueueOrigin int64
+type QueueOrigin uint8
const (
// Possible `queue_origin` values
@@ -20,14 +20,24 @@ const (
QueueOriginL1ToL2 QueueOrigin = 1
)
+func (q QueueOrigin) String() string {
+ switch q {
+ case QueueOriginSequencer:
+ return "sequencer"
+ case QueueOriginL1ToL2:
+ return "l1"
+ default:
+ return ""
+ }
+}
+
//go:generate gencodec -type TransactionMeta -out gen_tx_meta_json.go
type TransactionMeta struct {
- L1BlockNumber *big.Int `json:"l1BlockNumber"`
- L1Timestamp uint64 `json:"l1Timestamp"`
- L1MessageSender *common.Address `json:"l1MessageSender" gencodec:"required"`
- SignatureHashType SignatureHashType `json:"signatureHashType" gencodec:"required"`
- QueueOrigin *big.Int `json:"queueOrigin" gencodec:"required"`
+ L1BlockNumber *big.Int `json:"l1BlockNumber"`
+ L1Timestamp uint64 `json:"l1Timestamp"`
+ L1MessageSender *common.Address `json:"l1MessageSender" gencodec:"required"`
+ QueueOrigin QueueOrigin `json:"queueOrigin" gencodec:"required"`
// The canonical transaction chain index
Index *uint64 `json:"index" gencodec:"required"`
// The queue index, nil for queue origin sequencer transactions
@@ -36,22 +46,20 @@ type TransactionMeta struct {
}
// NewTransactionMeta creates a TransactionMeta
-func NewTransactionMeta(l1BlockNumber *big.Int, l1timestamp uint64, l1MessageSender *common.Address, sighashType SignatureHashType, queueOrigin QueueOrigin, index *uint64, queueIndex *uint64, rawTransaction []byte) *TransactionMeta {
+func NewTransactionMeta(l1BlockNumber *big.Int, l1timestamp uint64, l1MessageSender *common.Address, queueOrigin QueueOrigin, index *uint64, queueIndex *uint64, rawTransaction []byte) *TransactionMeta {
return &TransactionMeta{
- L1BlockNumber: l1BlockNumber,
- L1Timestamp: l1timestamp,
- L1MessageSender: l1MessageSender,
- SignatureHashType: sighashType,
- QueueOrigin: big.NewInt(int64(queueOrigin)),
- Index: index,
- QueueIndex: queueIndex,
- RawTransaction: rawTransaction,
+ L1BlockNumber: l1BlockNumber,
+ L1Timestamp: l1timestamp,
+ L1MessageSender: l1MessageSender,
+ QueueOrigin: queueOrigin,
+ Index: index,
+ QueueIndex: queueIndex,
+ RawTransaction: rawTransaction,
}
}
// TxMetaDecode deserializes bytes as a TransactionMeta struct.
// The schema is:
-// varbytes(SignatureHashType) ||
// varbytes(L1BlockNumber) ||
// varbytes(L1MessageSender) ||
// varbytes(QueueOrigin) ||
@@ -61,14 +69,6 @@ func TxMetaDecode(input []byte) (*TransactionMeta, error) {
meta := TransactionMeta{}
b := bytes.NewReader(input)
- sb, err := common.ReadVarBytes(b, 0, 1024, "SignatureHashType")
- if err != nil {
- return nil, err
- }
- var sighashType SignatureHashType
- binary.Read(bytes.NewReader(sb), binary.LittleEndian, &sighashType)
- meta.SignatureHashType = sighashType
-
lb, err := common.ReadVarBytes(b, 0, 1024, "l1BlockNumber")
if err != nil {
return nil, err
@@ -94,7 +94,7 @@ func TxMetaDecode(input []byte) (*TransactionMeta, error) {
}
if !isNullValue(qo) {
queueOrigin := new(big.Int).SetBytes(qo)
- meta.QueueOrigin = queueOrigin
+ meta.QueueOrigin = QueueOrigin(queueOrigin.Uint64())
}
l, err := common.ReadVarBytes(b, 0, 1024, "L1Timestamp")
@@ -138,10 +138,6 @@ func TxMetaDecode(input []byte) (*TransactionMeta, error) {
func TxMetaEncode(meta *TransactionMeta) []byte {
b := new(bytes.Buffer)
- s := new(bytes.Buffer)
- binary.Write(s, binary.LittleEndian, &meta.SignatureHashType)
- common.WriteVarBytes(b, 0, s.Bytes())
-
L1BlockNumber := meta.L1BlockNumber
if L1BlockNumber == nil {
common.WriteVarBytes(b, 0, getNullValue())
@@ -161,13 +157,9 @@ func TxMetaEncode(meta *TransactionMeta) []byte {
}
queueOrigin := meta.QueueOrigin
- if queueOrigin == nil {
- common.WriteVarBytes(b, 0, getNullValue())
- } else {
- q := new(bytes.Buffer)
- binary.Write(q, binary.LittleEndian, queueOrigin.Bytes())
- common.WriteVarBytes(b, 0, q.Bytes())
- }
+ q := new(bytes.Buffer)
+ binary.Write(q, binary.LittleEndian, queueOrigin)
+ common.WriteVarBytes(b, 0, q.Bytes())
l := new(bytes.Buffer)
binary.Write(l, binary.LittleEndian, &meta.L1Timestamp)
diff --git a/l2geth/core/types/transaction_meta_test.go b/l2geth/core/types/transaction_meta_test.go
index 6471b5f77614..ec630d7bdcd3 100644
--- a/l2geth/core/types/transaction_meta_test.go
+++ b/l2geth/core/types/transaction_meta_test.go
@@ -17,7 +17,6 @@ var (
l1BlockNumber *big.Int
l1Timestamp uint64
msgSender *common.Address
- sighashType SignatureHashType
queueOrigin QueueOrigin
rawTransaction []byte
}{
@@ -25,7 +24,6 @@ var (
l1BlockNumber: l1BlockNumber,
l1Timestamp: 100,
msgSender: &addr,
- sighashType: SighashEthSign,
queueOrigin: QueueOriginL1ToL2,
rawTransaction: []byte{255, 255, 255, 255},
},
@@ -33,7 +31,6 @@ var (
l1BlockNumber: nil,
l1Timestamp: 45,
msgSender: &addr,
- sighashType: SighashEthSign,
queueOrigin: QueueOriginL1ToL2,
rawTransaction: []byte{42, 69, 42, 69},
},
@@ -41,7 +38,6 @@ var (
l1BlockNumber: l1BlockNumber,
l1Timestamp: 0,
msgSender: nil,
- sighashType: SighashEthSign,
queueOrigin: QueueOriginSequencer,
rawTransaction: []byte{0, 0, 0, 0},
},
@@ -49,7 +45,6 @@ var (
l1BlockNumber: l1BlockNumber,
l1Timestamp: 0,
msgSender: &addr,
- sighashType: SighashEthSign,
queueOrigin: QueueOriginSequencer,
rawTransaction: []byte{0, 0, 0, 0},
},
@@ -57,7 +52,6 @@ var (
l1BlockNumber: nil,
l1Timestamp: 0,
msgSender: nil,
- sighashType: SighashEthSign,
queueOrigin: QueueOriginL1ToL2,
rawTransaction: []byte{0, 0, 0, 0},
},
@@ -65,30 +59,15 @@ var (
l1BlockNumber: l1BlockNumber,
l1Timestamp: 0,
msgSender: &addr,
- sighashType: SighashEthSign,
queueOrigin: QueueOriginL1ToL2,
rawTransaction: []byte{0, 0, 0, 0},
},
}
-
- txMetaSighashEncodeTests = []struct {
- input SignatureHashType
- output SignatureHashType
- }{
- {
- input: SighashEIP155,
- output: SighashEIP155,
- },
- {
- input: SighashEthSign,
- output: SighashEthSign,
- },
- }
)
func TestTransactionMetaEncode(t *testing.T) {
for _, test := range txMetaSerializationTests {
- txmeta := NewTransactionMeta(test.l1BlockNumber, test.l1Timestamp, test.msgSender, test.sighashType, test.queueOrigin, nil, nil, test.rawTransaction)
+ txmeta := NewTransactionMeta(test.l1BlockNumber, test.l1Timestamp, test.msgSender, test.queueOrigin, nil, nil, test.rawTransaction)
encoded := TxMetaEncode(txmeta)
decoded, err := TxMetaDecode(encoded)
@@ -103,22 +82,6 @@ func TestTransactionMetaEncode(t *testing.T) {
}
}
-func TestTransactionSighashEncode(t *testing.T) {
- for _, test := range txMetaSighashEncodeTests {
- txmeta := NewTransactionMeta(l1BlockNumber, 0, &addr, test.input, QueueOriginSequencer, nil, nil, nil)
- encoded := TxMetaEncode(txmeta)
- decoded, err := TxMetaDecode(encoded)
-
- if err != nil {
- t.Fatal(err)
- }
-
- if decoded.SignatureHashType != test.output {
- t.Fatal("SighashTypes do not match")
- }
- }
-}
-
func isTxMetaEqual(meta1 *TransactionMeta, meta2 *TransactionMeta) bool {
// Maybe can just return this
if !reflect.DeepEqual(meta1, meta2) {
@@ -149,18 +112,7 @@ func isTxMetaEqual(meta1 *TransactionMeta, meta2 *TransactionMeta) bool {
}
}
- if meta1.SignatureHashType != meta2.SignatureHashType {
- return false
- }
-
- if meta1.QueueOrigin == nil || meta2.QueueOrigin == nil {
- // Note: this only works because it is the final comparison
- if meta1.QueueOrigin == nil && meta2.QueueOrigin == nil {
- return true
- }
- }
-
- if !bytes.Equal(meta1.QueueOrigin.Bytes(), meta2.QueueOrigin.Bytes()) {
+ if meta1.QueueOrigin != meta2.QueueOrigin {
return false
}
diff --git a/l2geth/core/types/transaction_signing.go b/l2geth/core/types/transaction_signing.go
index a22e7fd99a9b..842fedbd03d6 100644
--- a/l2geth/core/types/transaction_signing.go
+++ b/l2geth/core/types/transaction_signing.go
@@ -17,67 +17,16 @@
package types
import (
- "bytes"
"crypto/ecdsa"
- "encoding/binary"
"errors"
"fmt"
"math/big"
- "strings"
- "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
- "golang.org/x/crypto/sha3"
)
-var codec abi.ABI
-
-func init() {
- const abidata = `
- [
- {
- "type": "function",
- "name": "encode",
- "constant": true,
- "inputs": [
- {
- "name": "nonce",
- "type": "uint256"
- },
- {
- "name": "gasLimit",
- "type": "uint256"
- },
- {
- "name": "gasPrice",
- "type": "uint256"
- },
- {
- "name": "chainId",
- "type": "uint256"
- },
- {
- "name": "to",
- "type": "address"
- },
- {
- "name": "data",
- "type": "bytes"
- }
- ]
- }
- ]
- `
-
- var err error
- codec, err = abi.JSON(strings.NewReader(abidata))
- if err != nil {
- panic(fmt.Errorf("unable to create Eth Sign abi reader: %v", err))
- }
-}
-
var (
ErrInvalidChainId = errors.New("invalid chain id for signer")
)
@@ -91,7 +40,16 @@ type sigCache struct {
// MakeSigner returns a Signer based on the given chain config and block number.
func MakeSigner(config *params.ChainConfig, blockNumber *big.Int) Signer {
- return NewOVMSigner(config.ChainID)
+ var signer Signer
+ switch {
+ case config.IsEIP155(blockNumber):
+ signer = NewEIP155Signer(config.ChainID)
+ case config.IsHomestead(blockNumber):
+ signer = HomesteadSigner{}
+ default:
+ signer = FrontierSigner{}
+ }
+ return signer
}
// SignTx signs the transaction using the given signer and private key
@@ -144,97 +102,6 @@ type Signer interface {
Equal(Signer) bool
}
-// OVMSigner implements Signers using the EIP155 rules along with a new
-// `eth_sign` based signature hash.
-type OVMSigner struct {
- EIP155Signer
-}
-
-func NewOVMSigner(chainId *big.Int) OVMSigner {
- signer := NewEIP155Signer(chainId)
- return OVMSigner{signer}
-}
-
-func (s OVMSigner) Equal(s2 Signer) bool {
- ovm, ok := s2.(OVMSigner)
- return ok && ovm.chainId.Cmp(s.chainId) == 0
-}
-
-// Hash returns the hash to be signed by the sender.
-// It does not uniquely identify the transaction.
-func (s OVMSigner) Hash(tx *Transaction) common.Hash {
- if tx.IsEthSignSighash() {
- msg := s.OVMSignerTemplateSighashPreimage(tx)
-
- hasher := sha3.NewLegacyKeccak256()
- hasher.Write(msg[:])
- digest := hasher.Sum(nil)
-
- return common.BytesToHash(digest)
- }
-
- return rlpHash([]interface{}{
- tx.data.AccountNonce,
- tx.data.Price,
- tx.data.GasLimit,
- tx.data.Recipient,
- tx.data.Amount,
- tx.data.Payload,
- s.chainId, uint(0), uint(0),
- })
-}
-
-// Sender will ecrecover the public key that created the signature
-// and then hash the public key to create an address. In the
-// case of L1ToL2 transactions, Layer One did the authentication
-// for us so there is no signature involved. The concept of a "from"
-// is only required for bookkeeping within this codebase
-func (s OVMSigner) Sender(tx *Transaction) (common.Address, error) {
- qo := tx.QueueOrigin()
- if qo != nil && qo.Uint64() == uint64(QueueOriginL1ToL2) {
- return common.Address{}, nil
- }
- if !tx.Protected() {
- return HomesteadSigner{}.Sender(tx)
- }
- if tx.ChainId().Cmp(s.chainId) != 0 {
- return common.Address{}, ErrInvalidChainId
- }
- V := new(big.Int).Sub(tx.data.V, s.chainIdMul)
- V.Sub(V, big8)
- return recoverPlain(s.Hash(tx), tx.data.R, tx.data.S, V, true)
-}
-
-// OVMSignerTemplateSighashPreimage creates the preimage for the `eth_sign` like
-// signature hash. The transaction is `ABI.encodePacked`.
-func (s OVMSigner) OVMSignerTemplateSighashPreimage(tx *Transaction) []byte {
- data := []interface{}{
- big.NewInt(int64(tx.data.AccountNonce)),
- big.NewInt(int64(tx.data.GasLimit)),
- tx.data.Price,
- s.chainId,
- *tx.data.Recipient,
- tx.data.Payload,
- }
-
- ret, err := codec.Pack("encode", data...)
- if err != nil {
- panic(fmt.Errorf("unable to pack Eth Sign data: %v", err))
- }
-
- hasher := sha3.NewLegacyKeccak256()
- // Slice off the function selector before hashing
- hasher.Write(ret[4:])
- digest := hasher.Sum(nil)
-
- preimage := new(bytes.Buffer)
- prefix := []byte("\x19Ethereum Signed Message:\n32")
- binary.Write(preimage, binary.BigEndian, prefix)
- binary.Write(preimage, binary.BigEndian, digest)
-
- return preimage.Bytes()
-}
-
// EIP155Transaction implements Signer using the EIP155 rules.
type EIP155Signer struct {
chainId, chainIdMul *big.Int
diff --git a/l2geth/core/types/transaction_signing_test.go b/l2geth/core/types/transaction_signing_test.go
index f0102710b132..689fc38a9b66 100644
--- a/l2geth/core/types/transaction_signing_test.go
+++ b/l2geth/core/types/transaction_signing_test.go
@@ -136,100 +136,3 @@ func TestChainId(t *testing.T) {
t.Error("expected no error")
}
}
-
-func TestOVMSigner(t *testing.T) {
- key, _ := defaultTestKey()
-
- tx := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil)
- txMeta := NewTransactionMeta(nil, 0, nil, SighashEthSign, QueueOriginSequencer, nil, nil, nil)
- tx.SetTransactionMeta(txMeta)
-
- var err error
- tx, err = SignTx(tx, NewOVMSigner(big.NewInt(1)), key)
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = Sender(NewOVMSigner(big.NewInt(2)), tx)
- if err != ErrInvalidChainId {
- t.Error("expected error:", ErrInvalidChainId)
- }
-
- _, err = Sender(NewOVMSigner(big.NewInt(1)), tx)
- if err != nil {
- t.Error("expected no error")
- }
-}
-
-func TestOVMSignerHash(t *testing.T) {
- signer := NewOVMSigner(big.NewInt(1))
-
- txNil := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil)
- txEIP155 := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil)
-
- hashNil := signer.Hash(txNil)
- hashEIP155 := signer.Hash(txEIP155)
- if hashNil != hashEIP155 {
- t.Errorf("Signature hashes should be equal: %s != %s", hashNil.Hex(), hashEIP155.Hex())
- }
-
- // The signature hash should be different when using `SighashEthSign`
- txEthSign := NewTransaction(0, common.Address{}, new(big.Int), 0, new(big.Int), nil)
- txMeta := NewTransactionMeta(nil, 0, nil, SighashEthSign, QueueOriginSequencer, nil, nil, nil)
- txEthSign.SetTransactionMeta(txMeta)
-
- hashEthSign := signer.Hash(txEthSign)
- if hashEIP155 == hashEthSign {
- t.Errorf("Signature hashes should not be equal: %s == %s", hashEIP155.Hex(), hashEthSign.Hex())
- }
-}
-
-func TestOVMSignerSender(t *testing.T) {
- // Create a keypair to sign transactions with and the corresponding address
- // from the public key.
- key, _ := crypto.GenerateKey()
- addr := crypto.PubkeyToAddress(key.PublicKey)
-
- // This test makes sure that both the EIP155 and EthSign signature hash
- // codepaths work when using the OVMSigner.
- signer := NewOVMSigner(big.NewInt(1))
- var err error
-
- // Create a transaction with EIP155 signature hash, sign the transaction,
- // recover the address and assert that the address matches the key.
- txEIP155 := NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil)
-
- txEIP155, err = SignTx(txEIP155, signer, key)
- if err != nil {
- t.Errorf("No error expected")
- }
-
- recEIP155, err := signer.Sender(txEIP155)
- if err != nil {
- t.Errorf("No error expected")
- }
-
- if addr != recEIP155 {
- t.Errorf("Recovered address doesn't match. Got %s, expected %s", recEIP155.Hex(), addr.Hex())
- }
-
- // Create a transaction with EthSign signature hash, sign the transaction,
- // recover the address and assert that the address matches the key.
- txEthSign := NewTransaction(0, addr, new(big.Int), 0, new(big.Int), nil)
- txMeta := NewTransactionMeta(nil, 0, nil, SighashEthSign, QueueOriginSequencer, nil, nil, nil)
- txEthSign.SetTransactionMeta(txMeta)
-
- txEthSign, err = SignTx(txEthSign, signer, key)
- if err != nil {
- t.Errorf("No error expected")
- }
-
- recEthSign, err := signer.Sender(txEthSign)
- if err != nil {
- t.Errorf("No error expected")
- }
-
- if addr != recEthSign {
- t.Errorf("Recovered address doesn't match. Got %s, expected %s", recEthSign.Hex(), addr.Hex())
- }
-}
diff --git a/l2geth/core/types/transaction_test.go b/l2geth/core/types/transaction_test.go
index 8ed4da8204c8..6106362f4bf1 100644
--- a/l2geth/core/types/transaction_test.go
+++ b/l2geth/core/types/transaction_test.go
@@ -208,7 +208,7 @@ func TestTransactionJSON(t *testing.T) {
if err != nil {
t.Fatalf("could not generate key: %v", err)
}
- signer := NewOVMSigner(common.Big1)
+ signer := NewEIP155Signer(common.Big1)
transactions := make([]*Transaction, 0, 50)
for i := uint64(0); i < 25; i++ {
@@ -263,8 +263,4 @@ func TestOVMMetaDataHash(t *testing.T) {
if emptyTx.Hash() != emptyTxEmptyL1Sender.Hash() {
t.Errorf("L1MessageSender, should not affect the hash, want %x, got %x with L1MessageSender", emptyTx.Hash(), emptyTxEmptyL1Sender.Hash())
}
-
- if emptyTx.Hash() != emptyTxSighashEthSign.Hash() {
- t.Errorf("SignatureHashType, should not affect the hash, want %x, got %x with SighashEthSign", emptyTx.Hash(), emptyTxSighashEthSign.Hash())
- }
}
diff --git a/l2geth/core/vm/evm.go b/l2geth/core/vm/evm.go
index d7811e6b660c..18355c6c2473 100644
--- a/l2geth/core/vm/evm.go
+++ b/l2geth/core/vm/evm.go
@@ -20,10 +20,13 @@ import (
"bytes"
"crypto/rand"
"encoding/hex"
+ "fmt"
"math/big"
+ "strings"
"sync/atomic"
"time"
+ "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
@@ -32,10 +35,66 @@ import (
"github.com/ethereum/go-ethereum/rollup/dump"
)
+// codec is a decoder for the return values of the execution manager. It decodes
+// (bool, bytes) from the bytes that are returned from both
+// `ExecutionManager.run()` and `ExecutionManager.simulateMessage()`
+var codec abi.ABI
+
+// innerData represents the results returned from the ExecutionManager
+// that are wrapped in `bytes`
+type innerData struct {
+ Success bool `abi:"_success"`
+ ReturnData []byte `abi:"_returndata"`
+}
+
+// runReturnData represents the actual return data of the ExecutionManager.
+// It wraps (bool, bytes) in an ABI encoded bytes
+type runReturnData struct {
+ ReturnData []byte `abi:"_returndata"`
+}
+
// Will be removed when we update EM to return data in `run`.
var deadPrefix, fortyTwoPrefix, zeroPrefix []byte
func init() {
+ const abidata = `
+ [
+ {
+ "type": "function",
+ "name": "call",
+ "constant": true,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "_success",
+ "type": "bool"
+ },
+ {
+ "name": "_returndata",
+ "type": "bytes"
+ }
+ ]
+ },
+ {
+ "type": "function",
+ "name": "blob",
+ "constant": true,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "_returndata",
+ "type": "bytes"
+ }
+ ]
+ }
+ ]
+`
+
+ var err error
+ codec, err = abi.JSON(strings.NewReader(abidata))
+ if err != nil {
+ panic(fmt.Errorf("unable to create abi decoder: %v", err))
+ }
deadPrefix = hexutil.MustDecode("0xdeaddeaddeaddeaddeaddeaddeaddeaddead")
zeroPrefix = hexutil.MustDecode("0x000000000000000000000000000000000000")
fortyTwoPrefix = hexutil.MustDecode("0x420000000000000000000000000000000000")
@@ -133,13 +192,15 @@ type Context struct {
Difficulty *big.Int // Provides information for DIFFICULTY
// OVM_ADDITION
- EthCallSender *common.Address
- OriginalTargetAddress *common.Address
- OriginalTargetResult []byte
- OriginalTargetReached bool
- OvmExecutionManager dump.OvmDumpAccount
- OvmStateManager dump.OvmDumpAccount
- OvmSafetyChecker dump.OvmDumpAccount
+ EthCallSender *common.Address
+ IsL1ToL2Message bool
+ IsSuccessfulL1ToL2Message bool
+ OvmExecutionManager dump.OvmDumpAccount
+ OvmStateManager dump.OvmDumpAccount
+ OvmSafetyChecker dump.OvmDumpAccount
+ OvmL2CrossDomainMessenger dump.OvmDumpAccount
+ OvmETH dump.OvmDumpAccount
+ OvmL2StandardBridge dump.OvmDumpAccount
}
// EVM is the Ethereum Virtual Machine base object and provides
@@ -190,6 +251,9 @@ func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmCon
ctx.OvmExecutionManager = chainConfig.StateDump.Accounts["OVM_ExecutionManager"]
ctx.OvmStateManager = chainConfig.StateDump.Accounts["OVM_StateManager"]
ctx.OvmSafetyChecker = chainConfig.StateDump.Accounts["OVM_SafetyChecker"]
+ ctx.OvmL2CrossDomainMessenger = chainConfig.StateDump.Accounts["OVM_L2CrossDomainMessenger"]
+ ctx.OvmETH = chainConfig.StateDump.Accounts["OVM_ETH"]
+ ctx.OvmL2StandardBridge = chainConfig.StateDump.Accounts["OVM_L2StandardBridge"]
}
id := make([]byte, 4)
@@ -251,34 +315,6 @@ func (evm *EVM) Interpreter() Interpreter {
// the necessary steps to create accounts and reverses the state in case of an
// execution error or failed value transfer.
func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) {
- var isTarget = false
- if UsingOVM {
- // OVM_ENABLED
- if evm.depth == 0 {
- // We're inside a new transaction, so make sure to wipe these variables beforehand.
- evm.Context.OriginalTargetAddress = nil
- evm.Context.OriginalTargetResult = []byte("00")
- evm.Context.OriginalTargetReached = false
- }
-
- if caller.Address() == evm.Context.OvmExecutionManager.Address &&
- !bytes.HasPrefix(addr.Bytes(), deadPrefix) &&
- !bytes.HasPrefix(addr.Bytes(), zeroPrefix) &&
- !bytes.HasPrefix(addr.Bytes(), fortyTwoPrefix) &&
- evm.Context.OriginalTargetAddress == nil {
- // Whew. Okay, so: we consider ourselves to be at a "target" as long as we were called
- // by the execution manager, and we're not a precompile or "dead" address.
- evm.Context.OriginalTargetAddress = &addr
- evm.Context.OriginalTargetReached = true
- isTarget = true
- }
- // Handle eth_call
- if evm.Context.EthCallSender != nil && (caller.Address() == common.Address{}) {
- evm.Context.OriginalTargetReached = true
- isTarget = true
- }
- }
-
if evm.vmConfig.NoRecursion && evm.depth > 0 {
return nil, gas, nil
}
@@ -296,6 +332,19 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
}
}
+ // We need to be able to show a status of 1 ("no error") for successful L1 => L2 messages.
+ // The current way we figure out the success of the transaction (by parsing the
+ // returned data) would require an upgrade to the contracts that we likely won't make for a
+ // while. As a result, we'll use this mechanism where we set IsL1ToL2Message = true if
+ // we detect an L1 => L2 message and then IsSuccessfulL1ToL2Message = true if the message is
+ // successfully executed.
+ // Just to be safe (if the evm object ever gets reused), we set both values to false on the
+ // start of a new EVM execution.
+ if evm.depth == 0 {
+ evm.Context.IsL1ToL2Message = false
+ evm.Context.IsSuccessfulL1ToL2Message = false
+ }
+
var (
to = AccountRef(addr)
snapshot = evm.StateDB.Snapshot()
@@ -342,8 +391,35 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
}()
}
+ // Here's where we detect L1 => L2 messages. Based on the current contracts, we're guaranteed
+ // that the target address will only be the OVM_L2CrossDomainMessenger at a depth of 1 if this
+ // is an L1 => L2 message.
+ if evm.depth == 1 && addr == evm.Context.OvmL2CrossDomainMessenger.Address {
+ evm.Context.IsL1ToL2Message = true
+ }
+
ret, err = run(evm, contract, input, false)
+ // If all of these very particular conditions hold then we're guaranteed to be in a successful
+ // L1 => L2 message. It's not pretty, but it works. Broke this out into a series of checks to
+ // make it a bit more legible.
+ if evm.Context.IsL1ToL2Message && evm.depth == 3 {
+ var isValidMessageTarget = true
+ // 0x420... addresses are not valid targets except for the ETH predeploy.
+ if bytes.HasPrefix(addr.Bytes(), fortyTwoPrefix) && addr != evm.Context.OvmL2StandardBridge.Address {
+ isValidMessageTarget = false
+ }
+ // 0xdead... addresses are not valid targets.
+ if bytes.HasPrefix(addr.Bytes(), deadPrefix) {
+ isValidMessageTarget = false
+ }
+ // As long as this is a valid target and the message didn't revert then we can consider
+ // this a successful L1 => L2 message.
+ if isValidMessageTarget && err == nil {
+ evm.Context.IsSuccessfulL1ToL2Message = true
+ }
+ }
+
// When an error was returned by the EVM or when setting the creation code
// above we revert to the snapshot and consume any gas remaining. Additionally
// when we're in homestead this also counts for code storage gas errors.
@@ -356,58 +432,40 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
if UsingOVM {
// OVM_ENABLED
-
- if isTarget {
- // If this was our target contract, store the result so that it can be later re-inserted
- // into the user-facing return data (as seen below).
- evm.Context.OriginalTargetResult = ret
- }
-
if evm.depth == 0 {
// We're back at the root-level message call, so we'll need to modify the return data
// sent to us by the OVM_ExecutionManager to instead be the intended return data.
- if !evm.Context.OriginalTargetReached {
- // If we didn't get to the target contract, then our execution somehow failed
- // (perhaps due to insufficient gas). Just return an error that represents this.
- ret = common.FromHex("0x")
- err = ErrOvmExecutionFailed
- } else if len(evm.Context.OriginalTargetResult) >= 96 {
- // We expect that EOA contracts return at least 96 bytes of data, where the first
- // 32 bytes are the boolean success value and the next 64 bytes are unnecessary
- // ABI encoding data. The actual return data starts at the 96th byte and can be
- // empty.
- success := evm.Context.OriginalTargetResult[:32]
- ret = evm.Context.OriginalTargetResult[96:]
-
- if !bytes.Equal(success, AbiBytesTrue) && !bytes.Equal(success, AbiBytesFalse) {
- // If the first 32 bytes not either are the ABI encoding of "true" or "false",
- // then the user hasn't correctly ABI encoded the result. We return the null
- // hex string as a default here (an annoying default that would convince most
- // people to just use the standard form).
- ret = common.FromHex("0x")
- } else if bytes.Equal(success, AbiBytesFalse) {
- // If the first 32 bytes are the ABI encoding of "false", then we need to add an
- // artificial error that represents the revert.
- err = errExecutionReverted
-
- // We also currently need to add an extra four empty bytes to the return data
- // to appease ethers.js. Our return correctly inserts the four specific bytes
- // that represent a "string error" to clients, but somehow the returndata size
- // is a multiple of 32 (when we expect size % 32 == 4). ethers.js checks that
- // [size % 32 == 4] before trying to decode a string error result. Adding these
- // four empty bytes tricks ethers into correctly decoding the error string.
- // ovmTODO: Figure out how to actually deal with this.
- // ovmTODO: This may actually be completely broken if the first four bytes of
- // the return data are **not** the specific "string error" bytes.
- ret = append(ret, make([]byte, 4)...)
+ // We skip the parsing step if this was a successful L1 => L2 message. Note that if err
+ // is set (perhaps because of an error in ExecutionManager.run) we'll still return that
+ // error.
+ if !evm.Context.IsSuccessfulL1ToL2Message {
+ // Attempt to decode the returndata as as ExecutionManager.run when
+ // it is not an `eth_call` and as ExecutionManager.simulateMessage
+ // when it is an `eth_call`. If the data is not decodable as ABI
+ // encoded bytes, then return nothing. If the data is able to be
+ // decoded as bytes, then attempt to decode as (bool, bytes)
+ isDecodable := true
+ returnData := runReturnData{}
+ if err := codec.Unpack(&returnData, "blob", ret); err != nil {
+ isDecodable = false
}
- } else {
- // User hasn't conformed the standard format, just return "null" for the success
- // (with no return data) to convince them to use the standard.
- ret = common.FromHex("0x")
- }
+ switch isDecodable {
+ case true:
+ inner := innerData{}
+ // If this fails to decode, the nil values will be set in
+ // `inner`, meaning that it will be interpreted as reverted
+ // execution with empty returndata
+ _ = codec.Unpack(&inner, "call", returnData.ReturnData)
+ if !inner.Success {
+ err = errExecutionReverted
+ }
+ ret = inner.ReturnData
+ case false:
+ ret = []byte{}
+ }
+ }
if evm.Context.EthCallSender == nil {
log.Debug("Reached the end of an OVM execution", "ID", evm.Id, "Return Data", hexutil.Encode(ret), "Error", err)
}
diff --git a/l2geth/eth/api_backend.go b/l2geth/eth/api_backend.go
index 1f1b0ae6ac84..c26b337b5b5d 100644
--- a/l2geth/eth/api_backend.go
+++ b/l2geth/eth/api_backend.go
@@ -130,6 +130,16 @@ func (b *EthAPIBackend) SetHead(number uint64) {
b.eth.syncService.SetLatestL1BlockNumber(blockNumber.Uint64())
}
+func (b *EthAPIBackend) IngestTransactions(txs []*types.Transaction) error {
+ for _, tx := range txs {
+ err := b.eth.syncService.IngestTransaction(tx)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) {
// Pending block is only known by the miner
if number == rpc.PendingBlockNumber {
@@ -297,20 +307,11 @@ func (b *EthAPIBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscri
// a lock can be used around the remotes for when the sequencer is reorganizing.
func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error {
if b.UsingOVM {
- // The value field is not rolled up so it must be set to 0
- if signedTx.Value().Cmp(new(big.Int)) != 0 {
- return fmt.Errorf("Cannot send transaction with non-zero value. Use WETH.transfer()")
- }
-
to := signedTx.To()
if to != nil {
if *to == (common.Address{}) {
return errors.New("Cannot send transaction to zero address")
}
- // Prevent transactions from being submitted if the gas limit too high
- if signedTx.Gas() >= b.gasLimit {
- return fmt.Errorf("Transaction gasLimit (%d) is greater than max gasLimit (%d)", signedTx.Gas(), b.gasLimit)
- }
// Prevent QueueOriginSequencer transactions that are too large to
// be included in a batch. The `MaxCallDataSize` should be set to
// the layer one consensus max transaction size in bytes minus the
@@ -321,7 +322,7 @@ func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction)
return fmt.Errorf("Calldata cannot be larger than %d, sent %d", b.MaxCallDataSize, len(signedTx.Data()))
}
}
- return b.eth.syncService.ApplyTransaction(signedTx)
+ return b.eth.syncService.ValidateAndApplySequencerTransaction(signedTx)
}
// OVM Disabled
return b.eth.txPool.AddLocal(signedTx)
@@ -380,20 +381,20 @@ func (b *EthAPIBackend) SuggestPrice(ctx context.Context) (*big.Int, error) {
return b.gpo.SuggestPrice(ctx)
}
-func (b *EthAPIBackend) SuggestDataPrice(ctx context.Context) (*big.Int, error) {
- return b.rollupGpo.SuggestDataPrice(ctx)
+func (b *EthAPIBackend) SuggestL1GasPrice(ctx context.Context) (*big.Int, error) {
+ return b.rollupGpo.SuggestL1GasPrice(ctx)
}
-func (b *EthAPIBackend) SuggestExecutionPrice(ctx context.Context) (*big.Int, error) {
- return b.rollupGpo.SuggestExecutionPrice(ctx)
+func (b *EthAPIBackend) SuggestL2GasPrice(ctx context.Context) (*big.Int, error) {
+ return b.rollupGpo.SuggestL2GasPrice(ctx)
}
-func (b *EthAPIBackend) SetDataPrice(ctx context.Context, gasPrice *big.Int) {
- b.rollupGpo.SetDataPrice(gasPrice)
+func (b *EthAPIBackend) SetL1GasPrice(ctx context.Context, gasPrice *big.Int) error {
+ return b.rollupGpo.SetL1GasPrice(gasPrice)
}
-func (b *EthAPIBackend) SetExecutionPrice(ctx context.Context, gasPrice *big.Int) {
- b.rollupGpo.SetExecutionPrice(gasPrice)
+func (b *EthAPIBackend) SetL2GasPrice(ctx context.Context, gasPrice *big.Int) error {
+ return b.rollupGpo.SetL2GasPrice(gasPrice)
}
func (b *EthAPIBackend) ChainDb() ethdb.Database {
diff --git a/l2geth/eth/api_backend_test.go b/l2geth/eth/api_backend_test.go
deleted file mode 100644
index 7f84758c6c86..000000000000
--- a/l2geth/eth/api_backend_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package eth
-
-import (
- "context"
- "fmt"
- "math/big"
- "testing"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
-)
-
-func TestGasLimit(t *testing.T) {
- backend := &EthAPIBackend{
- extRPCEnabled: false,
- eth: nil,
- gpo: nil,
- verifier: false,
- gasLimit: 0,
- UsingOVM: true,
- }
-
- nonce := uint64(0)
- to := common.HexToAddress("0x5A0b54D5dc17e0AadC383d2db43B0a0D3E029c4c")
- value := big.NewInt(0)
- gasPrice := big.NewInt(0)
- data := []byte{}
-
- // Set the gas limit to 1 so that the transaction will not be
- // able to be added.
- gasLimit := uint64(1)
- tx := types.NewTransaction(nonce, to, value, gasLimit, gasPrice, data)
-
- err := backend.SendTx(context.Background(), tx)
- if err == nil {
- t.Fatal("Transaction with too large of gas limit accepted")
- }
- if err.Error() != fmt.Sprintf("Transaction gasLimit (%d) is greater than max gasLimit (%d)", gasLimit, backend.GasLimit()) {
- t.Fatalf("Unexpected error type: %s", err)
- }
-}
diff --git a/l2geth/eth/backend.go b/l2geth/eth/backend.go
index 740b73ac1ff7..1892d2f3ef75 100644
--- a/l2geth/eth/backend.go
+++ b/l2geth/eth/backend.go
@@ -226,7 +226,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock)
eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData))
- log.Info("Backend Config", "max-calldata-size", config.Rollup.MaxCallDataSize, "gas-limit", config.Rollup.GasLimit, "is-verifier", config.Rollup.IsVerifier, "using-ovm", vm.UsingOVM, "data-price", config.Rollup.DataPrice, "execution-price", config.Rollup.ExecutionPrice)
+ log.Info("Backend Config", "max-calldata-size", config.Rollup.MaxCallDataSize, "gas-limit", config.Rollup.GasLimit, "is-verifier", config.Rollup.IsVerifier, "using-ovm", vm.UsingOVM)
eth.APIBackend = &EthAPIBackend{ctx.ExtRPCEnabled(), eth, nil, nil, config.Rollup.IsVerifier, config.Rollup.GasLimit, vm.UsingOVM, config.Rollup.MaxCallDataSize}
gpoParams := config.GPO
if gpoParams.Default == nil {
@@ -234,7 +234,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
}
eth.APIBackend.gpo = gasprice.NewOracle(eth.APIBackend, gpoParams)
// create the Rollup GPO and allow the API backend and the sync service to access it
- rollupGpo := gasprice.NewRollupOracle(config.Rollup.DataPrice, config.Rollup.ExecutionPrice)
+ rollupGpo := gasprice.NewRollupOracle()
eth.APIBackend.rollupGpo = rollupGpo
eth.syncService.RollupGpo = rollupGpo
return eth, nil
diff --git a/l2geth/eth/config.go b/l2geth/eth/config.go
index 33186b0935cc..63b0e1ad091d 100644
--- a/l2geth/eth/config.go
+++ b/l2geth/eth/config.go
@@ -81,8 +81,6 @@ var DefaultConfig = Config{
// is additional overhead that is unaccounted. Round down to 127000 for
// safety.
MaxCallDataSize: 127000,
- DataPrice: big.NewInt(100 * params.GWei),
- ExecutionPrice: big.NewInt(0),
},
DiffDbCache: 256,
}
diff --git a/l2geth/eth/gasprice/rollup_gasprice.go b/l2geth/eth/gasprice/rollup_gasprice.go
index 120a212fa1de..ac4166dea95e 100644
--- a/l2geth/eth/gasprice/rollup_gasprice.go
+++ b/l2geth/eth/gasprice/rollup_gasprice.go
@@ -4,48 +4,58 @@ import (
"context"
"math/big"
"sync"
+
+ "github.com/ethereum/go-ethereum/log"
)
+// RollupOracle holds the L1 and L2 gas prices for fee calculation
type RollupOracle struct {
- dataPrice *big.Int
- executionPrice *big.Int
- dataPriceLock sync.RWMutex
- executionPriceLock sync.RWMutex
+ l1GasPrice *big.Int
+ l2GasPrice *big.Int
+ l1GasPriceLock sync.RWMutex
+ l2GasPriceLock sync.RWMutex
}
-func NewRollupOracle(dataPrice *big.Int, executionPrice *big.Int) *RollupOracle {
+// NewRollupOracle returns an initialized RollupOracle
+func NewRollupOracle() *RollupOracle {
return &RollupOracle{
- dataPrice: dataPrice,
- executionPrice: executionPrice,
+ l1GasPrice: new(big.Int),
+ l2GasPrice: new(big.Int),
+ l1GasPriceLock: sync.RWMutex{},
+ l2GasPriceLock: sync.RWMutex{},
}
}
-/// SuggestDataPrice returns the gas price which should be charged per byte of published
-/// data by the sequencer.
-func (gpo *RollupOracle) SuggestDataPrice(ctx context.Context) (*big.Int, error) {
- gpo.dataPriceLock.RLock()
- price := gpo.dataPrice
- gpo.dataPriceLock.RUnlock()
- return price, nil
+// SuggestL1GasPrice returns the gas price which should be charged per byte of published
+// data by the sequencer.
+func (gpo *RollupOracle) SuggestL1GasPrice(ctx context.Context) (*big.Int, error) {
+ gpo.l1GasPriceLock.RLock()
+ defer gpo.l1GasPriceLock.RUnlock()
+ return gpo.l1GasPrice, nil
}
-func (gpo *RollupOracle) SetDataPrice(dataPrice *big.Int) {
- gpo.dataPriceLock.Lock()
- gpo.dataPrice = dataPrice
- gpo.dataPriceLock.Unlock()
+// SetL1GasPrice returns the current L1 gas price
+func (gpo *RollupOracle) SetL1GasPrice(gasPrice *big.Int) error {
+ gpo.l1GasPriceLock.Lock()
+ defer gpo.l1GasPriceLock.Unlock()
+ gpo.l1GasPrice = gasPrice
+ log.Info("Set L1 Gas Price", "gasprice", gpo.l1GasPrice)
+ return nil
}
-/// SuggestExecutionPrice returns the gas price which should be charged per unit of gas
-/// set manually by the sequencer depending on congestion
-func (gpo *RollupOracle) SuggestExecutionPrice(ctx context.Context) (*big.Int, error) {
- gpo.executionPriceLock.RLock()
- price := gpo.executionPrice
- gpo.executionPriceLock.RUnlock()
- return price, nil
+// SuggestL2GasPrice returns the gas price which should be charged per unit of gas
+// set manually by the sequencer depending on congestion
+func (gpo *RollupOracle) SuggestL2GasPrice(ctx context.Context) (*big.Int, error) {
+ gpo.l2GasPriceLock.RLock()
+ defer gpo.l2GasPriceLock.RUnlock()
+ return gpo.l2GasPrice, nil
}
-func (gpo *RollupOracle) SetExecutionPrice(executionPrice *big.Int) {
- gpo.executionPriceLock.Lock()
- gpo.executionPrice = executionPrice
- gpo.executionPriceLock.Unlock()
+// SetL2GasPrice returns the current L2 gas price
+func (gpo *RollupOracle) SetL2GasPrice(gasPrice *big.Int) error {
+ gpo.l2GasPriceLock.Lock()
+ defer gpo.l2GasPriceLock.Unlock()
+ gpo.l2GasPrice = gasPrice
+ log.Info("Set L2 Gas Price", "gasprice", gpo.l2GasPrice)
+ return nil
}
diff --git a/l2geth/go.mod b/l2geth/go.mod
index 47277f950dba..d8239f1d0c52 100644
--- a/l2geth/go.mod
+++ b/l2geth/go.mod
@@ -1,6 +1,6 @@
module github.com/ethereum/go-ethereum
-go 1.13
+go 1.15
require (
github.com/Azure/azure-pipeline-go v0.2.2 // indirect
diff --git a/l2geth/interfaces.go b/l2geth/interfaces.go
index 50bde19ddf8c..aaf10f31c5d7 100644
--- a/l2geth/interfaces.go
+++ b/l2geth/interfaces.go
@@ -120,10 +120,9 @@ type CallMsg struct {
Value *big.Int // amount of wei sent along with the call
Data []byte // input data, usually an ABI-encoded contract method invocation
- L1MessageSender *common.Address
- L1BlockNumber *big.Int
- QueueOrigin *big.Int
- SignatureHashType types.SignatureHashType
+ L1MessageSender *common.Address
+ L1BlockNumber *big.Int
+ QueueOrigin types.QueueOrigin
}
// A ContractCaller provides contract calls, essentially transactions that are executed by
diff --git a/l2geth/internal/ethapi/api.go b/l2geth/internal/ethapi/api.go
index 2f3f9940e082..097a8e16b3c0 100644
--- a/l2geth/internal/ethapi/api.go
+++ b/l2geth/internal/ethapi/api.go
@@ -27,6 +27,7 @@ import (
"github.com/davecgh/go-spew/spew"
"github.com/ethereum/go-ethereum/accounts"
+ "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/accounts/scwallet"
"github.com/ethereum/go-ethereum/common"
@@ -44,14 +45,18 @@ import (
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
+ "github.com/ethereum/go-ethereum/rollup/fees"
"github.com/ethereum/go-ethereum/rpc"
"github.com/tyler-smith/go-bip39"
)
const (
- defaultGasPrice = params.GWei
+ defaultGasPrice = params.Wei * fees.TxGasPrice
)
+var errOVMUnsupported = errors.New("OVM: Unsupported RPC Method")
+var bigDefaultGasPrice = new(big.Int).SetUint64(defaultGasPrice)
+
// PublicEthereumAPI provides an API to access Ethereum related information.
// It offers only methods that operate on public data that is freely available to anyone.
type PublicEthereumAPI struct {
@@ -65,7 +70,7 @@ func NewPublicEthereumAPI(b Backend) *PublicEthereumAPI {
// GasPrice always returns 1 gwei. See `DoEstimateGas` below for context.
func (s *PublicEthereumAPI) GasPrice(ctx context.Context) (*hexutil.Big, error) {
- return (*hexutil.Big)(big.NewInt(defaultGasPrice)), nil
+ return (*hexutil.Big)(bigDefaultGasPrice), nil
}
// ProtocolVersion returns the current Ethereum protocol version this node supports
@@ -928,7 +933,7 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.Blo
// Create new call message
var msg core.Message
- msg = types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false, &addr, nil, types.QueueOriginSequencer, 0)
+ msg = types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false, &addr, nil, types.QueueOriginSequencer)
if vm.UsingOVM {
cfg := b.ChainConfig()
executionManager := cfg.StateDump.Accounts["OVM_ExecutionManager"]
@@ -1008,7 +1013,18 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNrOr
if overrides != nil {
accounts = *overrides
}
- result, _, _, err := DoCall(ctx, s.b, args, blockNrOrHash, accounts, vm.Config{}, 5*time.Second, s.b.RPCGasCap())
+ result, _, failed, err := DoCall(ctx, s.b, args, blockNrOrHash, accounts, vm.Config{}, 5*time.Second, s.b.RPCGasCap())
+ if err != nil {
+ return nil, err
+ }
+ if failed {
+ reason, errUnpack := abi.UnpackRevert(result)
+ err := errors.New("execution reverted")
+ if errUnpack == nil {
+ err = fmt.Errorf("execution reverted: %v", reason)
+ }
+ return (hexutil.Bytes)(result), err
+ }
return (hexutil.Bytes)(result), err
}
@@ -1018,32 +1034,34 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNrOr
// fees can compensate for the additional costs the sequencer pays for publishing the
// transaction calldata
func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap *big.Int) (hexutil.Uint64, error) {
- if args.Data == nil {
- return 0, errors.New("transaction data cannot be nil")
- }
-
// 1. get the gas that would be used by the transaction
gasUsed, err := legacyDoEstimateGas(ctx, b, args, blockNrOrHash, gasCap)
if err != nil {
return 0, err
}
-
// 2a. fetch the data price, depends on how the sequencer has chosen to update their values based on the
// l1 gas prices
- dataPrice, err := b.SuggestDataPrice(ctx)
+ l1GasPrice, err := b.SuggestL1GasPrice(ctx)
if err != nil {
return 0, err
}
-
// 2b. fetch the execution gas price, by the typical mempool dynamics
- executionPrice, err := b.SuggestExecutionPrice(ctx)
+ l2GasPrice, err := b.SuggestL2GasPrice(ctx)
if err != nil {
return 0, err
}
-
- // 3. calculate the fee and normalize by the default gas price
- fee := core.CalculateRollupFee(*args.Data, uint64(gasUsed), dataPrice, executionPrice).Uint64() / defaultGasPrice
- return (hexutil.Uint64)(fee), nil
+ data := []byte{}
+ if args.Data != nil {
+ data = *args.Data
+ }
+ // 3. calculate the fee using just the calldata. The additional overhead of
+ // RLP encoding is covered inside of EncodeL2GasLimit
+ l2GasLimit := new(big.Int).SetUint64(uint64(gasUsed))
+ fee := fees.EncodeTxGasLimit(data, l1GasPrice, l2GasLimit, l2GasPrice)
+ if !fee.IsUint64() {
+ return 0, fmt.Errorf("estimate gas overflow: %s", fee)
+ }
+ return (hexutil.Uint64)(fee.Uint64()), nil
}
func legacyDoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap *big.Int) (hexutil.Uint64, error) {
@@ -1082,19 +1100,21 @@ func legacyDoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrO
args.From = &common.Address{}
}
// Create a helper to check if a gas allowance results in an executable transaction
- executable := func(gas uint64) bool {
+ executable := func(gas uint64) (bool, []byte) {
args.Gas = (*hexutil.Uint64)(&gas)
- _, _, failed, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap)
+ res, _, failed, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap)
if err != nil || failed {
- return false
+ return false, res
}
- return true
+ return true, res
}
// Execute the binary search and hone in on an executable gas limit
for lo+1 < hi {
mid := (hi + lo) / 2
- if !executable(mid) {
+ ok, _ := executable(mid)
+
+ if !ok {
lo = mid
} else {
hi = mid
@@ -1102,20 +1122,45 @@ func legacyDoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrO
}
// Reject the transaction as invalid if it still fails at the highest allowance
if hi == cap {
- if !executable(hi) {
- return 0, fmt.Errorf("gas required exceeds allowance (%d) or always failing transaction", cap)
+ ok, res := executable(hi)
+ if !ok {
+ if len(res) >= 4 && bytes.Equal(res[:4], abi.RevertSelector) {
+ reason, errUnpack := abi.UnpackRevert(res)
+ err := errors.New("execution reverted")
+ if errUnpack == nil {
+ err = fmt.Errorf("execution reverted: %v", reason)
+ }
+ return 0, err
+ }
+ return 0, fmt.Errorf("gas required exceeds allowance (%d)", cap)
}
}
return hexutil.Uint64(hi), nil
}
// EstimateGas returns an estimate of the amount of gas needed to execute the
-// given transaction against the current pending block.
+// given transaction against the current pending block. This is modified to
+// encode the fee in wei as gas price is always 1
func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) {
blockNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber)
return DoEstimateGas(ctx, s.b, args, blockNrOrHash, s.b.RPCGasCap())
}
+// EstimateExecutionGas returns an estimate of the amount of gas needed to execute the
+// given transaction against the current pending block.
+func (s *PublicBlockChainAPI) EstimateExecutionGas(ctx context.Context, args CallArgs, round *bool) (hexutil.Uint64, error) {
+ blockNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber)
+ estimate, err := legacyDoEstimateGas(ctx, s.b, args, blockNrOrHash, s.b.RPCGasCap())
+ if err != nil {
+ return estimate, err
+ }
+ if round != nil && *round {
+ rounded := fees.Ceilmod(new(big.Int).SetUint64(uint64(estimate)), fees.BigTenThousand)
+ estimate = (hexutil.Uint64)(rounded.Uint64())
+ }
+ return estimate, nil
+}
+
// ExecutionResult groups all structured logs emitted by the EVM
// while replaying a transaction in debug mode as well as transaction
// execution status, the amount of gas used and the return value
@@ -1286,7 +1331,10 @@ type RPCTransaction struct {
// newRPCTransaction returns a transaction that will serialize to the RPC
// representation, with the given location metadata set (if available).
func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction {
- var signer types.Signer = types.NewOVMSigner(tx.ChainId())
+ var signer types.Signer = types.FrontierSigner{}
+ if tx.Protected() {
+ signer = types.NewEIP155Signer(tx.ChainId())
+ }
from, _ := types.Sender(signer, tx)
v, r, s := tx.RawSignatureValues()
@@ -1316,14 +1364,8 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber
if meta.L1BlockNumber != nil {
result.L1BlockNumber = (*hexutil.Big)(meta.L1BlockNumber)
}
- if meta.QueueOrigin != nil {
- switch meta.QueueOrigin.Uint64() {
- case uint64(types.QueueOriginSequencer):
- result.QueueOrigin = "sequencer"
- case uint64(types.QueueOriginL1ToL2):
- result.QueueOrigin = "l1"
- }
- }
+
+ result.QueueOrigin = fmt.Sprint(meta.QueueOrigin)
if meta.Index != nil {
index := (hexutil.Uint64)(*meta.Index)
@@ -1333,15 +1375,6 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber
queueIndex := (hexutil.Uint64)(*meta.QueueIndex)
result.QueueIndex = &queueIndex
}
-
- switch meta.SignatureHashType {
- case types.SighashEthSign:
- result.TxType = "EthSign"
- case types.SighashEIP155:
- result.TxType = "EIP155"
- case types.CreateEOA:
- result.TxType = "CreateEOA"
- }
}
return result
}
@@ -1514,7 +1547,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(ctx context.Context, ha
var signer types.Signer = types.FrontierSigner{}
if tx.Protected() {
- signer = types.NewOVMSigner(tx.ChainId())
+ signer = types.NewEIP155Signer(tx.ChainId())
}
from, _ := types.Sender(signer, tx)
@@ -1574,9 +1607,8 @@ type SendTxArgs struct {
Data *hexutil.Bytes `json:"data"`
Input *hexutil.Bytes `json:"input"`
- L1BlockNumber *big.Int `json:"l1BlockNumber"`
- L1MessageSender *common.Address `json:"l1MessageSender"`
- SignatureHashType types.SignatureHashType `json:"signatureHashType"`
+ L1BlockNumber *big.Int `json:"l1BlockNumber"`
+ L1MessageSender *common.Address `json:"l1MessageSender"`
}
// setDefaults is a helper function that fills in default values for unspecified tx fields.
@@ -1648,12 +1680,14 @@ func (args *SendTxArgs) toTransaction() *types.Transaction {
}
if args.To == nil {
tx := types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input)
- txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil)
+ raw, _ := rlp.EncodeToBytes(tx)
+ txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, nil, types.QueueOriginSequencer, nil, nil, raw)
tx.SetTransactionMeta(txMeta)
return tx
}
tx := types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input)
- txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, args.L1MessageSender, args.SignatureHashType, types.QueueOriginSequencer, nil, nil, nil)
+ raw, _ := rlp.EncodeToBytes(tx)
+ txMeta := types.NewTransactionMeta(args.L1BlockNumber, 0, args.L1MessageSender, types.QueueOriginSequencer, nil, nil, raw)
tx.SetTransactionMeta(txMeta)
return tx
}
@@ -1683,10 +1717,9 @@ func SubmitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c
// SendTransaction creates a transaction for the given argument, sign it and submit it to the
// transaction pool.
func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) {
- if s.b.IsVerifier() {
- return common.Hash{}, errors.New("Cannot send transaction in verifier mode")
+ if vm.UsingOVM {
+ return common.Hash{}, errOVMUnsupported
}
-
// Look up the wallet containing the requested signer
account := accounts.Account{Address: args.From}
@@ -1719,6 +1752,9 @@ func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args Sen
// FillTransaction fills the defaults (nonce, gas, gasPrice) on a given unsigned transaction,
// and returns it to the caller for further processing (signing + broadcast)
func (s *PublicTransactionPoolAPI) FillTransaction(ctx context.Context, args SendTxArgs) (*SignTransactionResult, error) {
+ if vm.UsingOVM {
+ return nil, errOVMUnsupported
+ }
// Set some sanity defaults and terminate on failure
if err := args.setDefaults(ctx, s.b); err != nil {
return nil, err
@@ -1747,39 +1783,8 @@ func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encod
if err := rlp.DecodeBytes(encodedTx, tx); err != nil {
return common.Hash{}, err
}
-
- if new(big.Int).Mod(tx.GasPrice(), big.NewInt(1000000)).Cmp(big.NewInt(0)) != 0 {
- return common.Hash{}, errors.New("Gas price must be a multiple of 1,000,000 wei")
- }
- // L1Timestamp and L1BlockNumber will be set by the miner
- txMeta := types.NewTransactionMeta(nil, 0, nil, types.SighashEIP155, types.QueueOriginSequencer, nil, nil, nil)
- tx.SetTransactionMeta(txMeta)
- return SubmitTransaction(ctx, s.b, tx)
-}
-
-// SendRawEthSignTransaction will add the signed transaction to the mempool.
-// The signature hash was computed with `eth_sign`, meaning that the
-// `abi.encodedPacked` transaction was prefixed with the string
-// "Ethereum Signed Message".
-func (s *PublicTransactionPoolAPI) SendRawEthSignTransaction(ctx context.Context, encodedTx hexutil.Bytes) (common.Hash, error) {
- if s.b.IsVerifier() {
- return common.Hash{}, errors.New("Cannot send raw ethsign transaction in verifier mode")
- }
-
- if s.b.IsSyncing() {
- return common.Hash{}, errors.New("Cannot send raw transaction while syncing")
- }
-
- tx := new(types.Transaction)
- if err := rlp.DecodeBytes(encodedTx, tx); err != nil {
- return common.Hash{}, err
- }
-
- if new(big.Int).Mod(tx.GasPrice(), big.NewInt(1000000)).Cmp(big.NewInt(0)) != 0 {
- return common.Hash{}, errors.New("Gas price must be a multiple of 1,000,000 wei")
- }
- // L1Timestamp and L1BlockNumber will be set by the miner
- txMeta := types.NewTransactionMeta(nil, 0, nil, types.SighashEthSign, types.QueueOriginSequencer, nil, nil, nil)
+ // L1Timestamp and L1BlockNumber will be set right before execution
+ txMeta := types.NewTransactionMeta(nil, 0, nil, types.QueueOriginSequencer, nil, nil, encodedTx)
tx.SetTransactionMeta(txMeta)
return SubmitTransaction(ctx, s.b, tx)
}
@@ -1794,6 +1799,9 @@ func (s *PublicTransactionPoolAPI) SendRawEthSignTransaction(ctx context.Context
//
// https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign
func (s *PublicTransactionPoolAPI) Sign(addr common.Address, data hexutil.Bytes) (hexutil.Bytes, error) {
+ if vm.UsingOVM {
+ return nil, errOVMUnsupported
+ }
// Look up the wallet containing the requested signer
account := accounts.Account{Address: addr}
@@ -1819,6 +1827,9 @@ type SignTransactionResult struct {
// The node needs to have the private key of the account corresponding with
// the given from address and it needs to be unlocked.
func (s *PublicTransactionPoolAPI) SignTransaction(ctx context.Context, args SendTxArgs) (*SignTransactionResult, error) {
+ if vm.UsingOVM {
+ return nil, errOVMUnsupported
+ }
if args.Gas == nil {
return nil, fmt.Errorf("gas not specified")
}
@@ -1859,7 +1870,7 @@ func (s *PublicTransactionPoolAPI) PendingTransactions() ([]*RPCTransaction, err
for _, tx := range pending {
var signer types.Signer = types.HomesteadSigner{}
if tx.Protected() {
- signer = types.NewOVMSigner(tx.ChainId())
+ signer = types.NewEIP155Signer(tx.ChainId())
}
from, _ := types.Sender(signer, tx)
if _, exists := accounts[from]; exists {
@@ -1887,7 +1898,7 @@ func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxAr
for _, p := range pending {
var signer types.Signer = types.HomesteadSigner{}
if p.Protected() {
- signer = types.NewOVMSigner(p.ChainId())
+ signer = types.NewEIP155Signer(p.ChainId())
}
wantSigHash := signer.Hash(matchTx)
@@ -1972,6 +1983,27 @@ func (api *PublicRollupAPI) GetInfo(ctx context.Context) rollupInfo {
}
}
+type gasPrices struct {
+ L1GasPrice *hexutil.Big `json:"l1GasPrice"`
+ L2GasPrice *hexutil.Big `json:"l2GasPrice"`
+}
+
+// GasPrices returns the L1 and L2 gas price known by the node
+func (api *PublicRollupAPI) GasPrices(ctx context.Context) (*gasPrices, error) {
+ l1GasPrice, err := api.b.SuggestL1GasPrice(ctx)
+ if err != nil {
+ return nil, err
+ }
+ l2GasPrice, err := api.b.SuggestL2GasPrice(ctx)
+ if err != nil {
+ return nil, err
+ }
+ return &gasPrices{
+ L1GasPrice: (*hexutil.Big)(l1GasPrice),
+ L2GasPrice: (*hexutil.Big)(l2GasPrice),
+ }, nil
+}
+
// PrivatelRollupAPI provides private RPC methods to control the sequencer.
// These methods can be abused by external users and must be considered insecure for use by untrusted users.
type PrivateRollupAPI struct {
@@ -1984,15 +2016,15 @@ func NewPrivateRollupAPI(b Backend) *PrivateRollupAPI {
return &PrivateRollupAPI{b: b}
}
-// SetDataPrice sets the gas price to be used when quoting calldata publishing costs
+// SetL1GasPrice sets the gas price to be used when quoting calldata publishing costs
// to users
-func (api *PrivateRollupAPI) SetDataPrice(ctx context.Context, gasPrice hexutil.Big) {
- api.b.SetDataPrice(ctx, (*big.Int)(&gasPrice))
+func (api *PrivateRollupAPI) SetL1GasPrice(ctx context.Context, gasPrice hexutil.Big) error {
+ return api.b.SetL1GasPrice(ctx, (*big.Int)(&gasPrice))
}
-// SetExecutionPrice sets the gas price to be used when executing transactions on
-func (api *PrivateRollupAPI) SetExecutionPrice(ctx context.Context, gasPrice hexutil.Big) {
- api.b.SetExecutionPrice(ctx, (*big.Int)(&gasPrice))
+// SetL2GasPrice sets the gas price to be used when executing transactions on
+func (api *PrivateRollupAPI) SetL2GasPrice(ctx context.Context, gasPrice hexutil.Big) error {
+ return api.b.SetL2GasPrice(ctx, (*big.Int)(&gasPrice))
}
// PublicDebugAPI is the collection of Ethereum APIs exposed over the public
@@ -2117,6 +2149,51 @@ func (api *PrivateDebugAPI) SetHead(number hexutil.Uint64) {
api.b.SetHead(uint64(number))
}
+func (api *PrivateDebugAPI) IngestTransactions(txs []*RPCTransaction) error {
+ transactions := make([]*types.Transaction, len(txs))
+
+ for i, tx := range txs {
+ nonce := uint64(tx.Nonce)
+ value := tx.Value.ToInt()
+ gasLimit := uint64(tx.Gas)
+ gasPrice := tx.GasPrice.ToInt()
+ data := tx.Input
+ l1BlockNumber := tx.L1BlockNumber.ToInt()
+ l1Timestamp := uint64(tx.L1Timestamp)
+ rawTransaction := tx.RawTransaction
+
+ var queueOrigin types.QueueOrigin
+ switch tx.QueueOrigin {
+ case "sequencer":
+ queueOrigin = types.QueueOriginSequencer
+ case "l1":
+ queueOrigin = types.QueueOriginL1ToL2
+ default:
+ return fmt.Errorf("Transaction with unknown queue origin: %s", tx.TxType)
+ }
+
+ var transaction *types.Transaction
+ if tx.To == nil {
+ transaction = types.NewContractCreation(nonce, value, gasLimit, gasPrice, data)
+ } else {
+ transaction = types.NewTransaction(nonce, *tx.To, value, gasLimit, gasPrice, data)
+ }
+
+ meta := types.TransactionMeta{
+ L1BlockNumber: l1BlockNumber,
+ L1Timestamp: l1Timestamp,
+ L1MessageSender: tx.L1TxOrigin,
+ QueueOrigin: queueOrigin,
+ Index: (*uint64)(tx.Index),
+ QueueIndex: (*uint64)(tx.QueueIndex),
+ RawTransaction: rawTransaction,
+ }
+ transaction.SetTransactionMeta(&meta)
+ transactions[i] = transaction
+ }
+ return api.b.IngestTransactions(transactions)
+}
+
// PublicNetAPI offers network related RPC methods
type PublicNetAPI struct {
net *p2p.Server
diff --git a/l2geth/internal/ethapi/backend.go b/l2geth/internal/ethapi/backend.go
index 7845a1cca2c9..a8b1d7d5040e 100644
--- a/l2geth/internal/ethapi/backend.go
+++ b/l2geth/internal/ethapi/backend.go
@@ -94,10 +94,11 @@ type Backend interface {
GetRollupContext() (uint64, uint64, uint64)
GasLimit() uint64
GetDiff(*big.Int) (diffdb.Diff, error)
- SuggestDataPrice(ctx context.Context) (*big.Int, error)
- SetDataPrice(context.Context, *big.Int)
- SuggestExecutionPrice(context.Context) (*big.Int, error)
- SetExecutionPrice(context.Context, *big.Int)
+ SuggestL1GasPrice(ctx context.Context) (*big.Int, error)
+ SetL1GasPrice(context.Context, *big.Int) error
+ SuggestL2GasPrice(context.Context) (*big.Int, error)
+ SetL2GasPrice(context.Context, *big.Int) error
+ IngestTransactions([]*types.Transaction) error
}
func GetAPIs(apiBackend Backend) []rpc.API {
diff --git a/l2geth/les/api_backend.go b/l2geth/les/api_backend.go
index 86dc33636e55..5b847298f55e 100644
--- a/l2geth/les/api_backend.go
+++ b/l2geth/les/api_backend.go
@@ -87,6 +87,10 @@ func (b *LesApiBackend) SetHead(number uint64) {
b.eth.blockchain.SetHead(number)
}
+func (b *LesApiBackend) IngestTransactions([]*types.Transaction) error {
+ panic("not implemented")
+}
+
func (b *LesApiBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) {
if number == rpc.LatestBlockNumber || number == rpc.PendingBlockNumber {
return b.eth.blockchain.CurrentHeader(), nil
@@ -282,22 +286,22 @@ func (b *LesApiBackend) SuggestPrice(ctx context.Context) (*big.Int, error) {
}
// NB: Non sequencer nodes cannot suggest L1 gas prices.
-func (b *LesApiBackend) SuggestDataPrice(ctx context.Context) (*big.Int, error) {
- panic("SuggestDataPrice not implemented")
+func (b *LesApiBackend) SuggestL1GasPrice(ctx context.Context) (*big.Int, error) {
+ panic("SuggestL1GasPrice not implemented")
}
// NB: Non sequencer nodes cannot suggest L2 execution gas prices.
-func (b *LesApiBackend) SuggestExecutionPrice(ctx context.Context) (*big.Int, error) {
- panic("SuggestExecutionPrice not implemented")
+func (b *LesApiBackend) SuggestL2GasPrice(ctx context.Context) (*big.Int, error) {
+ panic("SuggestL2GasPrice not implemented")
}
// NB: Non sequencer nodes cannot set L1 gas prices.
-func (b *LesApiBackend) SetDataPrice(ctx context.Context, gasPrice *big.Int) {
+func (b *LesApiBackend) SetL1GasPrice(ctx context.Context, gasPrice *big.Int) error {
panic("SetDataPrice is not implemented")
}
// NB: Non sequencer nodes cannot set L2 execution prices.
-func (b *LesApiBackend) SetExecutionPrice(ctx context.Context, gasPrice *big.Int) {
+func (b *LesApiBackend) SetL2GasPrice(ctx context.Context, gasPrice *big.Int) error {
panic("SetExecutionPrice is not implemented")
}
diff --git a/l2geth/les/odr_test.go b/l2geth/les/odr_test.go
index c1004326d093..42df067ac92e 100644
--- a/l2geth/les/odr_test.go
+++ b/l2geth/les/odr_test.go
@@ -128,7 +128,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai
from := statedb.GetOrNewStateObject(bankAddr)
from.SetBalance(math.MaxBig256)
- msg := callmsg{types.NewMessage(from.Address(), &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false, nil, nil, types.QueueOriginSequencer, 0)}
+ msg := callmsg{types.NewMessage(from.Address(), &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false, nil, nil, types.QueueOriginSequencer)}
context := core.NewEVMContext(msg, header, bc, nil)
vmenv := vm.NewEVM(context, statedb, config, vm.Config{})
@@ -142,7 +142,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai
header := lc.GetHeaderByHash(bhash)
state := light.NewState(ctx, header, lc.Odr())
state.SetBalance(bankAddr, math.MaxBig256)
- msg := callmsg{types.NewMessage(bankAddr, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false, nil, nil, types.QueueOriginSequencer, 0)}
+ msg := callmsg{types.NewMessage(bankAddr, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false, nil, nil, types.QueueOriginSequencer)}
context := core.NewEVMContext(msg, header, lc, nil)
vmenv := vm.NewEVM(context, state, config, vm.Config{})
gp := new(core.GasPool).AddGas(math.MaxUint64)
diff --git a/l2geth/light/odr_test.go b/l2geth/light/odr_test.go
index 387f705b0315..70873e74f9e2 100644
--- a/l2geth/light/odr_test.go
+++ b/l2geth/light/odr_test.go
@@ -194,7 +194,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, bc *core.BlockChain
// Perform read-only call.
st.SetBalance(testBankAddress, math.MaxBig256)
- msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), 1000000, new(big.Int), data, false, nil, nil, types.QueueOriginSequencer, 0)}
+ msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), 1000000, new(big.Int), data, false, nil, nil, types.QueueOriginSequencer)}
context := core.NewEVMContext(msg, header, chain, nil)
vmenv := vm.NewEVM(context, st, config, vm.Config{})
gp := new(core.GasPool).AddGas(math.MaxUint64)
diff --git a/l2geth/miner/worker.go b/l2geth/miner/worker.go
index 3ebc34e9d824..3d9e10defb4f 100644
--- a/l2geth/miner/worker.go
+++ b/l2geth/miner/worker.go
@@ -196,7 +196,7 @@ func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus
unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), miningLogAtDepth),
pendingTasks: make(map[common.Hash]*task),
txsCh: make(chan core.NewTxsEvent, txChanSize),
- rollupCh: make(chan core.NewTxsEvent, txChanSize),
+ rollupCh: make(chan core.NewTxsEvent, 1),
chainHeadCh: make(chan core.ChainHeadEvent, chainHeadChanSize),
chainSideCh: make(chan core.ChainSideEvent, chainSideChanSize),
newWorkCh: make(chan *newWorkReq),
@@ -646,7 +646,7 @@ func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error {
return err
}
env := &environment{
- signer: types.NewOVMSigner(w.chainConfig.ChainID),
+ signer: types.NewEIP155Signer(w.chainConfig.ChainID),
state: state,
ancestors: mapset.NewSet(),
family: mapset.NewSet(),
@@ -863,22 +863,22 @@ func (w *worker) commitNewTx(tx *types.Transaction) error {
tstart := time.Now()
parent := w.chain.CurrentBlock()
- timestamp := tx.L1Timestamp()
num := parent.Number()
// Preserve liveliness as best as possible. Must panic on L1 to L2
// transactions as the timestamp cannot be malleated
- if parent.Time() > timestamp {
+ if parent.Time() > tx.L1Timestamp() {
log.Error("Monotonicity violation", "index", num)
- if tx.QueueOrigin().Uint64() == uint64(types.QueueOriginSequencer) {
+ if tx.QueueOrigin() == types.QueueOriginSequencer {
tx.SetL1Timestamp(parent.Time())
prev := parent.Transactions()
- if len(prev) != 1 {
- panic("Cannot recover L1BlockNumber")
+ if len(prev) == 1 {
+ tx.SetL1BlockNumber(prev[0].L1BlockNumber().Uint64())
+ } else {
+ log.Error("Cannot recover L1 Blocknumber")
}
- tx.SetL1BlockNumber(prev[0].L1BlockNumber().Uint64())
} else {
- panic("Monotonicity violation")
+ log.Error("Cannot recover from monotonicity violation")
}
}
@@ -898,7 +898,7 @@ func (w *worker) commitNewTx(tx *types.Transaction) error {
Number: num.Add(num, common.Big1),
GasLimit: w.config.GasFloor,
Extra: w.extra,
- Time: timestamp,
+ Time: tx.L1Timestamp(),
}
if err := w.engine.Prepare(w.chain, header); err != nil {
return fmt.Errorf("Failed to prepare header for mining: %w", err)
@@ -1073,7 +1073,7 @@ func (w *worker) commit(uncles []*types.Header, interval func(), update bool, st
bn = new(big.Int)
}
log.Info("New block", "index", block.Number().Uint64()-uint64(1), "l1-timestamp", tx.L1Timestamp(), "l1-blocknumber", bn.Uint64(), "tx-hash", tx.Hash().Hex(),
- "queue-orign", tx.QueueOrigin(), "type", tx.SignatureHashType(), "gas", block.GasUsed(), "fees", feesEth, "elapsed", common.PrettyDuration(time.Since(start)))
+ "queue-orign", tx.QueueOrigin(), "gas", block.GasUsed(), "fees", feesEth, "elapsed", common.PrettyDuration(time.Since(start)))
case <-w.exitCh:
log.Info("Worker has exited")
diff --git a/l2geth/miner/worker_test.go b/l2geth/miner/worker_test.go
index 8534084f7ee5..0ba36d8259e7 100644
--- a/l2geth/miner/worker_test.go
+++ b/l2geth/miner/worker_test.go
@@ -195,9 +195,9 @@ func TestGenerateBlockAndImportEthash(t *testing.T) {
testGenerateBlockAndImport(t, false)
}
-func TestGenerateBlockAndImportClique(t *testing.T) {
- testGenerateBlockAndImport(t, true)
-}
+// func TestGenerateBlockAndImportClique(t *testing.T) {
+// testGenerateBlockAndImport(t, true)
+// }
func testGenerateBlockAndImport(t *testing.T, isClique bool) {
var (
diff --git a/l2geth/package.json b/l2geth/package.json
index 35d04a6d9ac1..45c088fb6023 100644
--- a/l2geth/package.json
+++ b/l2geth/package.json
@@ -1,6 +1,6 @@
{
"name": "@eth-optimism/l2geth",
- "version": "0.2.6",
+ "version": "0.4.4",
"private": true,
"devDependencies": {}
}
diff --git a/l2geth/rollup/client.go b/l2geth/rollup/client.go
index 795c8d39453c..ad31f5649e6c 100644
--- a/l2geth/rollup/client.go
+++ b/l2geth/rollup/client.go
@@ -18,14 +18,16 @@ import (
const (
sequencer = "sequencer"
l1 = "l1"
- EIP155 = "EIP155"
- ETH_SIGN = "ETH_SIGN"
)
// errElementNotFound represents the error case of the remote element not being
// found. It applies to transactions, queue elements and batches
var errElementNotFound = errors.New("element not found")
+// errHttpError represents the error case of when the remote server
+// returns a 400 or greater error
+var errHTTPError = errors.New("http error")
+
// Batch represents the data structure that is submitted with
// a series of transactions to layer one
type Batch struct {
@@ -70,13 +72,12 @@ type transaction struct {
BatchIndex uint64 `json:"batchIndex"`
BlockNumber uint64 `json:"blockNumber"`
Timestamp uint64 `json:"timestamp"`
- Value hexutil.Uint64 `json:"value"`
- GasLimit uint64 `json:"gasLimit"`
+ Value *hexutil.Big `json:"value"`
+ GasLimit uint64 `json:"gasLimit,string"`
Target common.Address `json:"target"`
Origin *common.Address `json:"origin"`
Data hexutil.Bytes `json:"data"`
QueueOrigin string `json:"queueOrigin"`
- Type string `json:"type"`
QueueIndex *uint64 `json:"queueIndex"`
Decoded *decoded `json:"decoded"`
}
@@ -86,7 +87,7 @@ type Enqueue struct {
Index *uint64 `json:"ctcIndex"`
Target *common.Address `json:"target"`
Data *hexutil.Bytes `json:"data"`
- GasLimit *uint64 `json:"gasLimit"`
+ GasLimit *uint64 `json:"gasLimit,string"`
Origin *common.Address `json:"origin"`
BlockNumber *uint64 `json:"blockNumber"`
Timestamp *uint64 `json:"timestamp"`
@@ -104,13 +105,13 @@ type signature struct {
// When this struct exists in other structs and is set to `nil`,
// it means that the decoding failed.
type decoded struct {
- Signature signature `json:"sig"`
- Value hexutil.Uint64 `json:"value"`
- GasLimit uint64 `json:"gasLimit"`
- GasPrice uint64 `json:"gasPrice"`
- Nonce uint64 `json:"nonce"`
- Target common.Address `json:"target"`
- Data hexutil.Bytes `json:"data"`
+ Signature signature `json:"sig"`
+ Value *hexutil.Big `json:"value"`
+ GasLimit uint64 `json:"gasLimit,string"`
+ GasPrice uint64 `json:"gasPrice,string"`
+ Nonce uint64 `json:"nonce,string"`
+ Target *common.Address `json:"target"`
+ Data hexutil.Bytes `json:"data"`
}
// RollupClient is able to query for information
@@ -118,21 +119,24 @@ type decoded struct {
type RollupClient interface {
GetEnqueue(index uint64) (*types.Transaction, error)
GetLatestEnqueue() (*types.Transaction, error)
- GetTransaction(uint64) (*types.Transaction, error)
- GetLatestTransaction() (*types.Transaction, error)
+ GetLatestEnqueueIndex() (*uint64, error)
+ GetTransaction(uint64, Backend) (*types.Transaction, error)
+ GetLatestTransaction(Backend) (*types.Transaction, error)
+ GetLatestTransactionIndex(Backend) (*uint64, error)
GetEthContext(uint64) (*EthContext, error)
GetLatestEthContext() (*EthContext, error)
GetLastConfirmedEnqueue() (*types.Transaction, error)
GetLatestTransactionBatch() (*Batch, []*types.Transaction, error)
+ GetLatestTransactionBatchIndex() (*uint64, error)
GetTransactionBatch(uint64) (*Batch, []*types.Transaction, error)
- SyncStatus() (*SyncStatus, error)
+ SyncStatus(Backend) (*SyncStatus, error)
GetL1GasPrice() (*big.Int, error)
}
// Client is an HTTP based RollupClient
type Client struct {
client *resty.Client
- signer *types.OVMSigner
+ signer *types.EIP155Signer
}
// TransactionResponse represents the response from the remote server when
@@ -154,7 +158,16 @@ func NewClient(url string, chainID *big.Int) *Client {
client := resty.New()
client.SetHostURL(url)
client.SetHeader("User-Agent", "sequencer")
- signer := types.NewOVMSigner(chainID)
+ client.OnAfterResponse(func(c *resty.Client, r *resty.Response) error {
+ statusCode := r.StatusCode()
+ if statusCode >= 400 {
+ method := r.Request.Method
+ url := r.Request.URL
+ return fmt.Errorf("%d cannot %s %s: %w", statusCode, method, url, errHTTPError)
+ }
+ return nil
+ })
+ signer := types.NewEIP155Signer(chainID)
return &Client{
client: client,
@@ -240,7 +253,6 @@ func enqueueToTransaction(enqueue *Enqueue) (*types.Transaction, error) {
blockNumber,
timestamp,
&origin,
- types.SighashEIP155,
types.QueueOriginL1ToL2,
enqueue.Index,
enqueue.QueueIndex,
@@ -272,9 +284,46 @@ func (c *Client) GetLatestEnqueue() (*types.Transaction, error) {
return tx, nil
}
+// GetLatestEnqueueIndex returns the latest `enqueue()` index
+func (c *Client) GetLatestEnqueueIndex() (*uint64, error) {
+ tx, err := c.GetLatestEnqueue()
+ if err != nil {
+ return nil, err
+ }
+ index := tx.GetMeta().QueueIndex
+ if index == nil {
+ return nil, errors.New("Latest queue index is nil")
+ }
+ return index, nil
+}
+
+// GetLatestTransactionIndex returns the latest CTC index that has been batch
+// submitted or not, depending on the backend
+func (c *Client) GetLatestTransactionIndex(backend Backend) (*uint64, error) {
+ tx, err := c.GetLatestTransaction(backend)
+ if err != nil {
+ return nil, err
+ }
+ index := tx.GetMeta().Index
+ if index == nil {
+ return nil, errors.New("Latest index is nil")
+ }
+ return index, nil
+}
+
+// GetLatestTransactionBatchIndex returns the latest transaction batch index
+func (c *Client) GetLatestTransactionBatchIndex() (*uint64, error) {
+ batch, _, err := c.GetLatestTransactionBatch()
+ if err != nil {
+ return nil, err
+ }
+ index := batch.Index
+ return &index, nil
+}
+
// batchedTransactionToTransaction converts a transaction into a
// types.Transaction that can be consumed by the SyncService
-func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) (*types.Transaction, error) {
+func batchedTransactionToTransaction(res *transaction, signer *types.EIP155Signer) (*types.Transaction, error) {
// `nil` transactions are not found
if res == nil {
return nil, errElementNotFound
@@ -289,24 +338,12 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner)
} else {
return nil, fmt.Errorf("Unknown queue origin: %s", res.QueueOrigin)
}
- // The transaction type must be EIP155 or EthSign. Throughout this
- // codebase, it is referred to as "sighash type" but it could actually
- // be generalized to transaction type. Right now the only different
- // types use a different signature hashing scheme.
- var sighashType types.SignatureHashType
- if res.Type == EIP155 {
- sighashType = types.SighashEIP155
- } else if res.Type == ETH_SIGN {
- sighashType = types.SighashEthSign
- } else {
- return nil, fmt.Errorf("Unknown transaction type: %s", res.Type)
- }
// Transactions that have been decoded are
// Queue Origin Sequencer transactions
if res.Decoded != nil {
nonce := res.Decoded.Nonce
to := res.Decoded.Target
- value := new(big.Int).SetUint64(uint64(res.Decoded.Value))
+ value := (*big.Int)(res.Decoded.Value)
// Note: there are two gas limits, one top level and
// another on the raw transaction itself. Maybe maxGasLimit
// for the top level?
@@ -315,17 +352,16 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner)
data := res.Decoded.Data
var tx *types.Transaction
- if to == (common.Address{}) {
+ if to == nil {
tx = types.NewContractCreation(nonce, value, gasLimit, gasPrice, data)
} else {
- tx = types.NewTransaction(nonce, to, value, gasLimit, gasPrice, data)
+ tx = types.NewTransaction(nonce, *to, value, gasLimit, gasPrice, data)
}
txMeta := types.NewTransactionMeta(
new(big.Int).SetUint64(res.BlockNumber),
res.Timestamp,
res.Origin,
- sighashType,
queueOrigin,
&res.Index,
res.QueueIndex,
@@ -360,13 +396,12 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner)
gasLimit := res.GasLimit
data := res.Data
origin := res.Origin
- value := new(big.Int).SetUint64(uint64(res.Value))
+ value := (*big.Int)(res.Value)
tx := types.NewTransaction(nonce, target, value, gasLimit, big.NewInt(0), data)
txMeta := types.NewTransactionMeta(
new(big.Int).SetUint64(res.BlockNumber),
res.Timestamp,
origin,
- sighashType,
queueOrigin,
&res.Index,
res.QueueIndex,
@@ -377,12 +412,15 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner)
}
// GetTransaction will get a transaction by Canonical Transaction Chain index
-func (c *Client) GetTransaction(index uint64) (*types.Transaction, error) {
+func (c *Client) GetTransaction(index uint64, backend Backend) (*types.Transaction, error) {
str := strconv.FormatUint(index, 10)
response, err := c.client.R().
SetPathParams(map[string]string{
"index": str,
}).
+ SetQueryParams(map[string]string{
+ "backend": backend.String(),
+ }).
SetResult(&TransactionResponse{}).
Get("/transaction/index/{index}")
@@ -398,9 +436,12 @@ func (c *Client) GetTransaction(index uint64) (*types.Transaction, error) {
// GetLatestTransaction will get the latest transaction, meaning the transaction
// with the greatest Canonical Transaction Chain index
-func (c *Client) GetLatestTransaction() (*types.Transaction, error) {
+func (c *Client) GetLatestTransaction(backend Backend) (*types.Transaction, error) {
response, err := c.client.R().
SetResult(&TransactionResponse{}).
+ SetQueryParams(map[string]string{
+ "backend": backend.String(),
+ }).
Get("/transaction/latest")
if err != nil {
@@ -460,23 +501,26 @@ func (c *Client) GetLastConfirmedEnqueue() (*types.Transaction, error) {
if err != nil {
return nil, fmt.Errorf("Cannot get latest enqueue: %w", err)
}
- // This should only happen if the database is empty
+ // This should only happen if there are no L1 to L2 transactions yet
if enqueue == nil {
- return nil, nil
+ return nil, errElementNotFound
}
// Work backwards looking for the first enqueue
// to have an index, which means it has been included
// in the canonical transaction chain.
for {
meta := enqueue.GetMeta()
+ // The enqueue has an index so it has been confirmed
if meta.Index != nil {
return enqueue, nil
}
+ // There is no queue index so this is a bug
if meta.QueueIndex == nil {
return nil, fmt.Errorf("queue index is nil")
}
+ // No enqueue transactions have been confirmed yet
if *meta.QueueIndex == uint64(0) {
- return enqueue, nil
+ return nil, errElementNotFound
}
next, err := c.GetEnqueue(*meta.QueueIndex - 1)
if err != nil {
@@ -487,9 +531,12 @@ func (c *Client) GetLastConfirmedEnqueue() (*types.Transaction, error) {
}
// SyncStatus will query the remote server to determine if it is still syncing
-func (c *Client) SyncStatus() (*SyncStatus, error) {
+func (c *Client) SyncStatus(backend Backend) (*SyncStatus, error) {
response, err := c.client.R().
SetResult(&SyncStatus{}).
+ SetQueryParams(map[string]string{
+ "backend": backend.String(),
+ }).
Get("/eth/syncing")
if err != nil {
@@ -531,7 +578,7 @@ func (c *Client) GetTransactionBatch(index uint64) (*Batch, []*types.Transaction
Get("/batch/transaction/index/{index}")
if err != nil {
- return nil, nil, fmt.Errorf("Cannot get transaction batch %d", index)
+ return nil, nil, fmt.Errorf("Cannot get transaction batch %d: %w", index, err)
}
txBatch, ok := response.Result().(*TransactionBatchResponse)
if !ok {
@@ -542,9 +589,9 @@ func (c *Client) GetTransactionBatch(index uint64) (*Batch, []*types.Transaction
// parseTransactionBatchResponse will turn a TransactionBatchResponse into a
// Batch and its corresponding types.Transactions
-func parseTransactionBatchResponse(txBatch *TransactionBatchResponse, signer *types.OVMSigner) (*Batch, []*types.Transaction, error) {
- if txBatch == nil {
- return nil, nil, nil
+func parseTransactionBatchResponse(txBatch *TransactionBatchResponse, signer *types.EIP155Signer) (*Batch, []*types.Transaction, error) {
+ if txBatch == nil || txBatch.Batch == nil {
+ return nil, nil, errElementNotFound
}
batch := txBatch.Batch
txs := make([]*types.Transaction, len(txBatch.Transactions))
diff --git a/l2geth/rollup/client_test.go b/l2geth/rollup/client_test.go
index a391f6c87534..125c8348f4ef 100644
--- a/l2geth/rollup/client_test.go
+++ b/l2geth/rollup/client_test.go
@@ -1,6 +1,8 @@
package rollup
import (
+ "encoding/json"
+ "errors"
"fmt"
"math/big"
"testing"
@@ -8,8 +10,9 @@ import (
"github.com/jarcoal/httpmock"
)
+const url = "http://localhost:9999"
+
func TestRollupClientGetL1GasPrice(t *testing.T) {
- url := "http://localhost:9999"
endpoint := fmt.Sprintf("%s/eth/gasprice", url)
// url/chain-id does not matter, we'll mock the responses
client := NewClient(url, big.NewInt(1))
@@ -41,3 +44,65 @@ func TestRollupClientGetL1GasPrice(t *testing.T) {
t.Fatal("gasPrice is not parsed properly in the client")
}
}
+
+func TestRollupClientCannotConnect(t *testing.T) {
+ endpoint := fmt.Sprintf("%s/eth/context/latest", url)
+ client := NewClient(url, big.NewInt(1))
+
+ httpmock.ActivateNonDefault(client.client.GetClient())
+
+ response, _ := httpmock.NewJsonResponder(
+ 400,
+ map[string]interface{}{},
+ )
+ httpmock.RegisterResponder(
+ "GET",
+ endpoint,
+ response,
+ )
+
+ context, err := client.GetLatestEthContext()
+ if context != nil {
+ t.Fatal("returned value is not nil")
+ }
+ if !errors.Is(err, errHTTPError) {
+ t.Fatalf("Incorrect error returned: %s", err)
+ }
+}
+func TestDecodedJSON(t *testing.T) {
+ str := []byte(`
+ {
+ "index": 643116,
+ "batchIndex": 21083,
+ "blockNumber": 25954867,
+ "timestamp": 1625605288,
+ "gasLimit": "11000000",
+ "target": "0x4200000000000000000000000000000000000005",
+ "origin": null,
+ "data": "0xf86d0283e4e1c08343eab8941a5245ea5210c3b57b7cfdf965990e63534a7b528901a055690d9db800008081aea019f7c6719f1718475f39fb9e5a6a897c3bd5057488a014666e5ad573ec71cf0fa008836030e686f3175dd7beb8350809b47791c23a19092a8c2fab1f0b4211a466",
+ "queueOrigin": "sequencer",
+ "value": "0x1a055690d9db80000",
+ "queueIndex": null,
+ "decoded": {
+ "nonce": "2",
+ "gasPrice": "15000000",
+ "gasLimit": "4451000",
+ "value": "0x1a055690d9db80000",
+ "target": "0x1a5245ea5210c3b57b7cfdf965990e63534a7b52",
+ "data": "0x",
+ "sig": {
+ "v": 1,
+ "r": "0x19f7c6719f1718475f39fb9e5a6a897c3bd5057488a014666e5ad573ec71cf0f",
+ "s": "0x08836030e686f3175dd7beb8350809b47791c23a19092a8c2fab1f0b4211a466"
+ }
+ },
+ "confirmed": true
+ }`)
+
+ tx := new(transaction)
+ json.Unmarshal(str, tx)
+ cmp, _ := new(big.Int).SetString("1a055690d9db80000", 16)
+ if tx.Value.ToInt().Cmp(cmp) != 0 {
+ t.Fatal("Cannot decode")
+ }
+}
diff --git a/l2geth/rollup/config.go b/l2geth/rollup/config.go
index 572626a804d8..ebd758aac10e 100644
--- a/l2geth/rollup/config.go
+++ b/l2geth/rollup/config.go
@@ -10,8 +10,6 @@ import (
type Config struct {
// Maximum calldata size for a Queue Origin Sequencer Tx
MaxCallDataSize int
- // Number of confs before applying a L1 to L2 tx
- Eth1ConfirmationDepth uint64
// Verifier mode
IsVerifier bool
// Enable the sync service
@@ -23,8 +21,12 @@ type Config struct {
// HTTP endpoint of the data transport layer
RollupClientHttp string
L1CrossDomainMessengerAddress common.Address
+ L1FeeWalletAddress common.Address
AddressManagerOwnerAddress common.Address
- L1ETHGatewayAddress common.Address
+ GasPriceOracleOwnerAddress common.Address
+ L1StandardBridgeAddress common.Address
+ // Turns on checking of state for L2 gas price
+ EnableL2GasPolling bool
// Deployment Height of the canonical transaction chain
CanonicalTransactionChainDeployHeight *big.Int
// Path to the state dump
@@ -33,8 +35,13 @@ type Config struct {
PollInterval time.Duration
// Interval for updating the timestamp
TimestampRefreshThreshold time.Duration
- // The gas price to use when estimating L1 calldata publishing costs
- DataPrice *big.Int
- // The gas price to use for L2 congestion costs
- ExecutionPrice *big.Int
+ // Represents the source of the transactions that is being synced
+ Backend Backend
+ // Only accept transactions with fees
+ EnforceFees bool
+ // Allow fees within a buffer upwards or downwards
+ // to take fee volatility into account between being
+ // quoted and the transaction being executed
+ FeeThresholdDown *big.Float
+ FeeThresholdUp *big.Float
}
diff --git a/l2geth/rollup/fees/rollup_fee.go b/l2geth/rollup/fees/rollup_fee.go
new file mode 100644
index 000000000000..229568c0fa24
--- /dev/null
+++ b/l2geth/rollup/fees/rollup_fee.go
@@ -0,0 +1,171 @@
+package fees
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+var (
+ // errFeeTooLow represents the error case of then the user pays too little
+ ErrFeeTooLow = errors.New("fee too low")
+ // errFeeTooHigh represents the error case of when the user pays too much
+ ErrFeeTooHigh = errors.New("fee too high")
+ // errMissingInput represents the error case of missing required input to
+ // PaysEnough
+ errMissingInput = errors.New("missing input")
+)
+
+// overhead represents the fixed cost of batch submission of a single
+// transaction in gas.
+const overhead uint64 = 4200 + 200*params.TxDataNonZeroGasEIP2028
+
+// feeScalar is used to scale the calculations in EncodeL2GasLimit
+// to prevent them from being too large
+const feeScalar uint64 = 10_000_000
+
+// TxGasPrice is a constant that determines the result of `eth_gasPrice`
+// It is scaled upwards by 50%
+// tx.gasPrice is hard coded to 1500 * wei and all transactions must set that
+// gas price.
+const TxGasPrice uint64 = feeScalar + (feeScalar / 2)
+
+// BigTxGasPrice is the L2GasPrice as type big.Int
+var BigTxGasPrice = new(big.Int).SetUint64(TxGasPrice)
+var bigFeeScalar = new(big.Int).SetUint64(feeScalar)
+
+const tenThousand = 10000
+
+var BigTenThousand = new(big.Int).SetUint64(tenThousand)
+
+// EncodeTxGasLimit computes the `tx.gasLimit` based on the L1/L2 gas prices and
+// the L2 gas limit. The L2 gas limit is encoded inside of the lower order bits
+// of the number like so: [ | l2GasLimit ]
+// [ tx.gaslimit ]
+// The lower order bits must be large enough to fit the L2 gas limit, so 10**8
+// is chosen. If higher order bits collide with any bits from the L2 gas limit,
+// the L2 gas limit will not be able to be decoded.
+// An explicit design goal of this scheme was to make the L2 gas limit be human
+// readable. The entire number is interpreted as the gas limit when computing
+// the fee, so increasing the L2 Gas limit will increase the fee paid.
+// The calculation is:
+// l1GasLimit = zero_count(data) * 4 + non_zero_count(data) * 16 + overhead
+// roundedL2GasLimit = ceilmod(l2GasLimit, 10_000)
+// l1Fee = l1GasPrice * l1GasLimit
+// l2Fee = l2GasPrice * roundedL2GasLimit
+// sum = l1Fee + l2Fee
+// scaled = sum / scalar
+// rounded = ceilmod(scaled, tenThousand)
+// roundedScaledL2GasLimit = roundedL2GasLimit / tenThousand
+// result = rounded + roundedScaledL2GasLimit
+// Note that for simplicity purposes, only the calldata is passed into this
+// function when in reality the RLP encoded transaction should be. The
+// additional cost is added to the overhead constant to prevent the need to RLP
+// encode transactions during calls to `eth_estimateGas`
+func EncodeTxGasLimit(data []byte, l1GasPrice, l2GasLimit, l2GasPrice *big.Int) *big.Int {
+ l1GasLimit := calculateL1GasLimit(data, overhead)
+ roundedL2GasLimit := Ceilmod(l2GasLimit, BigTenThousand)
+ l1Fee := new(big.Int).Mul(l1GasPrice, l1GasLimit)
+ l2Fee := new(big.Int).Mul(l2GasPrice, roundedL2GasLimit)
+ sum := new(big.Int).Add(l1Fee, l2Fee)
+ scaled := new(big.Int).Div(sum, bigFeeScalar)
+ rounded := Ceilmod(scaled, BigTenThousand)
+ roundedScaledL2GasLimit := new(big.Int).Div(roundedL2GasLimit, BigTenThousand)
+ result := new(big.Int).Add(rounded, roundedScaledL2GasLimit)
+ return result
+}
+
+func Ceilmod(a, b *big.Int) *big.Int {
+ remainder := new(big.Int).Mod(a, b)
+ if remainder.Cmp(common.Big0) == 0 {
+ return a
+ }
+ sum := new(big.Int).Add(a, b)
+ rounded := new(big.Int).Sub(sum, remainder)
+ return rounded
+}
+
+// DecodeL2GasLimit decodes the L2 gas limit from an encoded L2 gas limit
+func DecodeL2GasLimit(gasLimit *big.Int) *big.Int {
+ scaled := new(big.Int).Mod(gasLimit, BigTenThousand)
+ return new(big.Int).Mul(scaled, BigTenThousand)
+}
+
+func DecodeL2GasLimitU64(gasLimit uint64) uint64 {
+ scaled := gasLimit % tenThousand
+ return scaled * tenThousand
+}
+
+// PaysEnoughOpts represent the options to PaysEnough
+type PaysEnoughOpts struct {
+ UserFee, ExpectedFee *big.Int
+ ThresholdUp, ThresholdDown *big.Float
+}
+
+// PaysEnough returns an error if the fee is not large enough
+// `GasPrice` and `Fee` are required arguments.
+func PaysEnough(opts *PaysEnoughOpts) error {
+ if opts.UserFee == nil {
+ return fmt.Errorf("%w: no user fee", errMissingInput)
+ }
+ if opts.ExpectedFee == nil {
+ return fmt.Errorf("%w: no expected fee", errMissingInput)
+ }
+
+ fee := opts.ExpectedFee
+ // Allow for a downward buffer to protect against L1 gas price volatility
+ if opts.ThresholdDown != nil {
+ fee = mulByFloat(fee, opts.ThresholdDown)
+ }
+ // Protect the sequencer from being underpaid
+ // if user fee < expected fee, return error
+ if opts.UserFee.Cmp(fee) == -1 {
+ return ErrFeeTooLow
+ }
+ // Protect users from overpaying by too much
+ if opts.ThresholdUp != nil {
+ // overpaying = user fee - expected fee
+ overpaying := new(big.Int).Sub(opts.UserFee, opts.ExpectedFee)
+ threshold := mulByFloat(overpaying, opts.ThresholdUp)
+ // if overpaying > threshold, return error
+ if overpaying.Cmp(threshold) == 1 {
+ return ErrFeeTooHigh
+ }
+ }
+ return nil
+}
+
+func mulByFloat(num *big.Int, float *big.Float) *big.Int {
+ n := new(big.Float).SetUint64(num.Uint64())
+ n = n.Mul(n, float)
+ value, _ := float.Uint64()
+ return new(big.Int).SetUint64(value)
+}
+
+// calculateL1GasLimit computes the L1 gasLimit based on the calldata and
+// constant sized overhead. The overhead can be decreased as the cost of the
+// batch submission goes down via contract optimizations. This will not overflow
+// under standard network conditions.
+func calculateL1GasLimit(data []byte, overhead uint64) *big.Int {
+ zeroes, ones := zeroesAndOnes(data)
+ zeroesCost := zeroes * params.TxDataZeroGas
+ onesCost := ones * params.TxDataNonZeroGasEIP2028
+ gasLimit := zeroesCost + onesCost + overhead
+ return new(big.Int).SetUint64(gasLimit)
+}
+
+func zeroesAndOnes(data []byte) (uint64, uint64) {
+ var zeroes uint64
+ var ones uint64
+ for _, byt := range data {
+ if byt == 0 {
+ zeroes++
+ } else {
+ ones++
+ }
+ }
+ return zeroes, ones
+}
diff --git a/l2geth/rollup/fees/rollup_fee_test.go b/l2geth/rollup/fees/rollup_fee_test.go
new file mode 100644
index 000000000000..53a5b96e9e15
--- /dev/null
+++ b/l2geth/rollup/fees/rollup_fee_test.go
@@ -0,0 +1,177 @@
+package fees
+
+import (
+ "errors"
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+var l1GasLimitTests = map[string]struct {
+ data []byte
+ overhead uint64
+ expect *big.Int
+}{
+ "simple": {[]byte{}, 0, big.NewInt(0)},
+ "simple-overhead": {[]byte{}, 10, big.NewInt(10)},
+ "zeros": {[]byte{0x00, 0x00, 0x00, 0x00}, 10, big.NewInt(26)},
+ "ones": {[]byte{0x01, 0x02, 0x03, 0x04}, 200, big.NewInt(16*4 + 200)},
+}
+
+func TestL1GasLimit(t *testing.T) {
+ for name, tt := range l1GasLimitTests {
+ t.Run(name, func(t *testing.T) {
+ got := calculateL1GasLimit(tt.data, tt.overhead)
+ if got.Cmp(tt.expect) != 0 {
+ t.Fatal("Calculated gas limit does not match")
+ }
+ })
+ }
+}
+
+var feeTests = map[string]struct {
+ dataLen int
+ l1GasPrice uint64
+ l2GasLimit uint64
+ l2GasPrice uint64
+}{
+ "simple": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 437118,
+ l2GasPrice: params.GWei,
+ },
+ "zero-l2-gasprice": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 196205,
+ l2GasPrice: 0,
+ },
+ "one-l2-gasprice": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 196205,
+ l2GasPrice: 1,
+ },
+ "zero-l1-gasprice": {
+ dataLen: 10,
+ l1GasPrice: 0,
+ l2GasLimit: 196205,
+ l2GasPrice: params.GWei,
+ },
+ "one-l1-gasprice": {
+ dataLen: 10,
+ l1GasPrice: 1,
+ l2GasLimit: 23255,
+ l2GasPrice: params.GWei,
+ },
+ "zero-gasprices": {
+ dataLen: 10,
+ l1GasPrice: 0,
+ l2GasLimit: 23255,
+ l2GasPrice: 0,
+ },
+ "max-gaslimit": {
+ dataLen: 10,
+ l1GasPrice: params.GWei,
+ l2GasLimit: 99_970_000,
+ l2GasPrice: params.GWei,
+ },
+ "larger-divisor": {
+ dataLen: 10,
+ l1GasPrice: 0,
+ l2GasLimit: 10,
+ l2GasPrice: 0,
+ },
+}
+
+func TestCalculateRollupFee(t *testing.T) {
+ for name, tt := range feeTests {
+ t.Run(name, func(t *testing.T) {
+ data := make([]byte, tt.dataLen)
+ l1GasPrice := new(big.Int).SetUint64(tt.l1GasPrice)
+ l2GasLimit := new(big.Int).SetUint64(tt.l2GasLimit)
+ l2GasPrice := new(big.Int).SetUint64(tt.l2GasPrice)
+
+ fee := EncodeTxGasLimit(data, l1GasPrice, l2GasLimit, l2GasPrice)
+ decodedGasLimit := DecodeL2GasLimit(fee)
+ roundedL2GasLimit := Ceilmod(l2GasLimit, BigTenThousand)
+ if roundedL2GasLimit.Cmp(decodedGasLimit) != 0 {
+ t.Errorf("rollup fee check failed: expected %d, got %d", l2GasLimit.Uint64(), decodedGasLimit)
+ }
+ })
+ }
+}
+
+func TestPaysEnough(t *testing.T) {
+ tests := map[string]struct {
+ opts *PaysEnoughOpts
+ err error
+ }{
+ "missing-gas-price": {
+ opts: &PaysEnoughOpts{
+ UserFee: nil,
+ ExpectedFee: new(big.Int),
+ ThresholdUp: nil,
+ ThresholdDown: nil,
+ },
+ err: errMissingInput,
+ },
+ "missing-fee": {
+ opts: &PaysEnoughOpts{
+ UserFee: nil,
+ ExpectedFee: nil,
+ ThresholdUp: nil,
+ ThresholdDown: nil,
+ },
+ err: errMissingInput,
+ },
+ "equal-fee": {
+ opts: &PaysEnoughOpts{
+ UserFee: common.Big1,
+ ExpectedFee: common.Big1,
+ ThresholdUp: nil,
+ ThresholdDown: nil,
+ },
+ err: nil,
+ },
+ "fee-too-low": {
+ opts: &PaysEnoughOpts{
+ UserFee: common.Big1,
+ ExpectedFee: common.Big2,
+ ThresholdUp: nil,
+ ThresholdDown: nil,
+ },
+ err: ErrFeeTooLow,
+ },
+ "fee-threshold-down": {
+ opts: &PaysEnoughOpts{
+ UserFee: common.Big1,
+ ExpectedFee: common.Big2,
+ ThresholdUp: nil,
+ ThresholdDown: new(big.Float).SetFloat64(0.5),
+ },
+ err: nil,
+ },
+ "fee-threshold-up": {
+ opts: &PaysEnoughOpts{
+ UserFee: common.Big3,
+ ExpectedFee: common.Big1,
+ ThresholdUp: new(big.Float).SetFloat64(1.5),
+ ThresholdDown: nil,
+ },
+ err: ErrFeeTooHigh,
+ },
+ }
+
+ for name, tt := range tests {
+ t.Run(name, func(t *testing.T) {
+ err := PaysEnough(tt.opts)
+ if !errors.Is(err, tt.err) {
+ t.Fatalf("%s: got %s, expected %s", name, err, tt.err)
+ }
+ })
+ }
+}
diff --git a/l2geth/rollup/sync_service.go b/l2geth/rollup/sync_service.go
index d9b31237bb12..d240a12fbc29 100644
--- a/l2geth/rollup/sync_service.go
+++ b/l2geth/rollup/sync_service.go
@@ -1,7 +1,6 @@
package rollup
import (
- "bytes"
"context"
"errors"
"fmt"
@@ -13,6 +12,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/log"
@@ -21,36 +21,65 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/eth/gasprice"
+ "github.com/ethereum/go-ethereum/rollup/fees"
)
-// OVMContext represents the blocknumber and timestamp
-// that exist during L2 execution
-type OVMContext struct {
- blockNumber uint64
- timestamp uint64
-}
+var (
+ // errBadConfig is the error when the SyncService is started with invalid
+ // configuration options
+ errBadConfig = errors.New("bad config")
+ // errShortRemoteTip is an error for when the remote tip is shorter than the
+ // local tip
+ errShortRemoteTip = errors.New("unexpected remote less than tip")
+ // errZeroGasPriceTx is the error for when a user submits a transaction
+ // with gas price zero and fees are currently enforced
+ errZeroGasPriceTx = errors.New("cannot accept 0 gas price transaction")
+ float1 = big.NewFloat(1)
+)
+
+var (
+ // l2GasPriceSlot refers to the storage slot that the L2 gas price is stored
+ // in in the OVM_GasPriceOracle predeploy
+ l2GasPriceSlot = common.BigToHash(big.NewInt(1))
+ // l2GasPriceOracleOwnerSlot refers to the storage slot that the owner of
+ // the OVM_GasPriceOracle is stored in
+ l2GasPriceOracleOwnerSlot = common.BigToHash(big.NewInt(0))
+ // l2GasPriceOracleAddress is the address of the OVM_GasPriceOracle
+ // predeploy
+ l2GasPriceOracleAddress = common.HexToAddress("0x420000000000000000000000000000000000000F")
+)
-// SyncService implements the verifier functionality as well as the reorg
-// protection for the sequencer.
+// SyncService implements the main functionality around pulling in transactions
+// and executing them. It can be configured to run in both sequencer mode and in
+// verifier mode.
type SyncService struct {
- ctx context.Context
- cancel context.CancelFunc
- verifier bool
- db ethdb.Database
- scope event.SubscriptionScope
- txFeed event.Feed
- txLock sync.Mutex
- enable bool
- eth1ChainId uint64
- bc *core.BlockChain
- txpool *core.TxPool
- RollupGpo *gasprice.RollupOracle
- client RollupClient
- syncing atomic.Value
- OVMContext OVMContext
- confirmationDepth uint64
- pollInterval time.Duration
- timestampRefreshThreshold time.Duration
+ ctx context.Context
+ cancel context.CancelFunc
+ verifier bool
+ db ethdb.Database
+ scope event.SubscriptionScope
+ txFeed event.Feed
+ txLock sync.Mutex
+ loopLock sync.Mutex
+ enable bool
+ eth1ChainId uint64
+ bc *core.BlockChain
+ txpool *core.TxPool
+ RollupGpo *gasprice.RollupOracle
+ client RollupClient
+ syncing atomic.Value
+ chainHeadSub event.Subscription
+ OVMContext OVMContext
+ pollInterval time.Duration
+ timestampRefreshThreshold time.Duration
+ chainHeadCh chan core.ChainHeadEvent
+ backend Backend
+ gasPriceOracleOwnerAddress common.Address
+ gasPriceOracleOwnerAddressLock *sync.RWMutex
+ enforceFees bool
+ signer types.Signer
+ feeThresholdUp *big.Float
+ feeThresholdDown *big.Float
}
// NewSyncService returns an initialized sync service
@@ -63,9 +92,12 @@ func NewSyncService(ctx context.Context, cfg Config, txpool *core.TxPool, bc *co
_ = cancel // satisfy govet
if cfg.IsVerifier {
- log.Info("Running in verifier mode")
+ log.Info("Running in verifier mode", "sync-backend", cfg.Backend.String())
} else {
- log.Info("Running in sequencer mode")
+ log.Info("Running in sequencer mode", "sync-backend", cfg.Backend.String())
+ log.Info("Fees", "gas-price", fees.BigTxGasPrice, "threshold-up", cfg.FeeThresholdUp,
+ "threshold-down", cfg.FeeThresholdDown)
+ log.Info("Enforce Fees", "set", cfg.EnforceFees)
}
pollInterval := cfg.PollInterval
@@ -87,75 +119,111 @@ func NewSyncService(ctx context.Context, cfg Config, txpool *core.TxPool, bc *co
// Initialize the rollup client
client := NewClient(cfg.RollupClientHttp, chainID)
log.Info("Configured rollup client", "url", cfg.RollupClientHttp, "chain-id", chainID.Uint64(), "ctc-deploy-height", cfg.CanonicalTransactionChainDeployHeight)
+
+ // Ensure sane values for the fee thresholds
+ if cfg.FeeThresholdDown != nil {
+ // The fee threshold down should be less than 1
+ if cfg.FeeThresholdDown.Cmp(float1) != -1 {
+ return nil, fmt.Errorf("%w: fee threshold down not lower than 1: %f", errBadConfig,
+ cfg.FeeThresholdDown)
+ }
+ }
+ if cfg.FeeThresholdUp != nil {
+ // The fee threshold up should be greater than 1
+ if cfg.FeeThresholdUp.Cmp(float1) != 1 {
+ return nil, fmt.Errorf("%w: fee threshold up not larger than 1: %f", errBadConfig,
+ cfg.FeeThresholdUp)
+ }
+ }
+
service := SyncService{
- ctx: ctx,
- cancel: cancel,
- verifier: cfg.IsVerifier,
- enable: cfg.Eth1SyncServiceEnable,
- confirmationDepth: cfg.Eth1ConfirmationDepth,
- syncing: atomic.Value{},
- bc: bc,
- txpool: txpool,
- eth1ChainId: cfg.Eth1ChainId,
- client: client,
- db: db,
- pollInterval: pollInterval,
- timestampRefreshThreshold: timestampRefreshThreshold,
+ ctx: ctx,
+ cancel: cancel,
+ verifier: cfg.IsVerifier,
+ enable: cfg.Eth1SyncServiceEnable,
+ syncing: atomic.Value{},
+ bc: bc,
+ txpool: txpool,
+ chainHeadCh: make(chan core.ChainHeadEvent, 1),
+ eth1ChainId: cfg.Eth1ChainId,
+ client: client,
+ db: db,
+ pollInterval: pollInterval,
+ timestampRefreshThreshold: timestampRefreshThreshold,
+ backend: cfg.Backend,
+ gasPriceOracleOwnerAddress: cfg.GasPriceOracleOwnerAddress,
+ gasPriceOracleOwnerAddressLock: new(sync.RWMutex),
+ enforceFees: cfg.EnforceFees,
+ signer: types.NewEIP155Signer(chainID),
+ feeThresholdDown: cfg.FeeThresholdDown,
+ feeThresholdUp: cfg.FeeThresholdUp,
}
+ // The chainHeadSub is used to synchronize the SyncService with the chain.
+ // As the SyncService processes transactions, it waits until the transaction
+ // is added to the chain. This synchronization is required for handling
+ // reorgs and also favors safety over liveliness. If a transaction breaks
+ // things downstream, it is expected that this channel will halt ingestion
+ // of additional transactions by the SyncService.
+ service.chainHeadSub = service.bc.SubscribeChainHeadEvent(service.chainHeadCh)
+
// Initial sync service setup if it is enabled. This code depends on
// a remote server that indexes the layer one contracts. Place this
// code behind this if statement so that this can run without the
// requirement of the remote server being up.
if service.enable {
// Ensure that the rollup client can connect to a remote server
- // before starting.
- err := service.ensureClient()
- if err != nil {
- return nil, fmt.Errorf("Rollup client unable to connect: %w", err)
+ // before starting. Retry until it can connect.
+ tEnsure := time.NewTicker(10 * time.Second)
+ for ; true; <-tEnsure.C {
+ err := service.ensureClient()
+ if err != nil {
+ log.Info("Cannot connect to upstream service", "msg", err)
+ } else {
+ log.Info("Connected to upstream service")
+ tEnsure.Stop()
+ break
+ }
}
- // Ensure that the remote is still not syncing
- for {
- status, err := service.client.SyncStatus()
+ // Wait until the remote service is done syncing
+ tStatus := time.NewTicker(10 * time.Second)
+ for ; true; <-tStatus.C {
+ status, err := service.client.SyncStatus(service.backend)
if err != nil {
log.Error("Cannot get sync status")
continue
}
if !status.Syncing {
+ tStatus.Stop()
break
}
log.Info("Still syncing", "index", status.CurrentTransactionIndex, "tip", status.HighestKnownTransactionIndex)
- time.Sleep(10 * time.Second)
}
// Initialize the latest L1 data here to make sure that
// it happens before the RPC endpoints open up
// Only do it if the sync service is enabled so that this
- // can be ran without needing to have a configured client.
- err = service.initializeLatestL1(cfg.CanonicalTransactionChainDeployHeight)
+ // can be ran without needing to have a configured RollupClient.
+ err := service.initializeLatestL1(cfg.CanonicalTransactionChainDeployHeight)
if err != nil {
return nil, fmt.Errorf("Cannot initialize latest L1 data: %w", err)
}
+ // Log the OVMContext information on startup
bn := service.GetLatestL1BlockNumber()
ts := service.GetLatestL1Timestamp()
log.Info("Initialized Latest L1 Info", "blocknumber", bn, "timestamp", ts)
- var i, q string
index := service.GetLatestIndex()
queueIndex := service.GetLatestEnqueueIndex()
- if index == nil {
- i = ""
- } else {
- i = strconv.FormatUint(*index, 10)
- }
- if queueIndex == nil {
- q = ""
- } else {
- q = strconv.FormatUint(*queueIndex, 10)
+ verifiedIndex := service.GetLatestVerifiedIndex()
+ block := service.bc.CurrentBlock()
+ if block == nil {
+ block = types.NewBlock(&types.Header{}, nil, nil, nil)
}
- log.Info("Initialized Eth Context", "index", i, "queue-index", q)
+ header := block.Header()
+ log.Info("Initial Rollup State", "state", header.Root.Hex(), "index", stringify(index), "queue-index", stringify(queueIndex), "verified-index", verifiedIndex)
// The sequencer needs to sync to the tip at start up
// By setting the sync status to true, it will prevent RPC calls.
@@ -164,10 +232,11 @@ func NewSyncService(ctx context.Context, cfg Config, txpool *core.TxPool, bc *co
service.setSyncStatus(true)
}
}
-
return &service, nil
}
+// ensureClient checks to make sure that the remote transaction source is
+// available. It will return an error if it cannot connect via HTTP
func (s *SyncService) ensureClient() error {
_, err := s.client.GetLatestEthContext()
if err != nil {
@@ -176,31 +245,33 @@ func (s *SyncService) ensureClient() error {
return nil
}
-// Start initializes the service, connecting to Ethereum1 and starting the
-// subservices required for the operation of the SyncService.
-// txs through syncservice go to mempool.locals
-// txs through rpc go to mempool.remote
+// Start initializes the service
func (s *SyncService) Start() error {
if !s.enable {
+ log.Info("Running without syncing enabled")
return nil
}
log.Info("Initializing Sync Service", "eth1-chainid", s.eth1ChainId)
-
- // When a sequencer, be sure to sync to the tip of the ctc before allowing
- // user transactions.
- if !s.verifier {
- err := s.syncTransactionsToTip()
- if err != nil {
- return fmt.Errorf("Cannot sync transactions to the tip: %w", err)
- }
- // TODO: This should also sync the enqueue'd transactions that have not
- // been synced yet
- s.setSyncStatus(false)
+ if err := s.updateGasPriceOracleCache(nil); err != nil {
+ return err
+ }
+ if err := s.updateL1GasPrice(); err != nil {
+ return err
}
if s.verifier {
go s.VerifierLoop()
} else {
+ // The sequencer must sync the transactions to the tip and the
+ // pending queue transactions on start before setting sync status
+ // to false and opening up the RPC to accept transactions.
+ if err := s.syncTransactionsToTip(); err != nil {
+ return fmt.Errorf("Sequencer cannot sync transactions to tip: %w", err)
+ }
+ if err := s.syncQueueToTip(); err != nil {
+ return fmt.Errorf("Sequencer cannot sync queue to tip: %w", err)
+ }
+ s.setSyncStatus(false)
go s.SequencerLoop()
}
return nil
@@ -217,6 +288,7 @@ func (s *SyncService) initializeLatestL1(ctcDeployHeight *big.Int) error {
if ctcDeployHeight == nil {
return errors.New("Must configure with canonical transaction chain deploy height")
}
+ log.Info("Initializing initial OVM Context", "ctc-deploy-height", ctcDeployHeight.Uint64())
context, err := s.client.GetEthContext(ctcDeployHeight.Uint64())
if err != nil {
return fmt.Errorf("Cannot fetch ctc deploy block at height %d: %w", ctcDeployHeight.Uint64(), err)
@@ -225,43 +297,46 @@ func (s *SyncService) initializeLatestL1(ctcDeployHeight *big.Int) error {
s.SetLatestL1BlockNumber(context.BlockNumber)
} else {
log.Info("Found latest index", "index", *index)
- block := s.bc.GetBlockByNumber(*index - 1)
+ block := s.bc.GetBlockByNumber(*index + 1)
if block == nil {
block = s.bc.CurrentBlock()
- idx := block.Number().Uint64()
- if idx > *index {
- // This is recoverable with a reorg
+ blockNum := block.Number().Uint64()
+ if blockNum > *index {
+ // This is recoverable with a reorg but should never happen
return fmt.Errorf("Current block height greater than index")
}
- s.SetLatestIndex(&idx)
- log.Info("Block not found, resetting index", "new", idx, "old", *index-1)
+ var idx *uint64
+ if blockNum > 0 {
+ num := blockNum - 1
+ idx = &num
+ }
+ s.SetLatestIndex(idx)
+ log.Info("Block not found, resetting index", "new", stringify(idx), "old", *index)
}
txs := block.Transactions()
if len(txs) != 1 {
- log.Error("Unexpected number of transactions in block: %d", len(txs))
+ log.Error("Unexpected number of transactions in block", "count", len(txs))
+ panic("Cannot recover OVM Context")
}
tx := txs[0]
s.SetLatestL1Timestamp(tx.L1Timestamp())
s.SetLatestL1BlockNumber(tx.L1BlockNumber().Uint64())
}
- // Only the sequencer cares about latest queue index
- if !s.verifier {
- queueIndex := s.GetLatestEnqueueIndex()
- if queueIndex == nil {
- enqueue, err := s.client.GetLastConfirmedEnqueue()
- // There are no enqueues yet
- if errors.Is(err, errElementNotFound) {
- return nil
- }
- // Other unexpected error
- if err != nil {
- return fmt.Errorf("Cannot fetch last confirmed queue tx: %w", err)
- }
- // No error, the queue element was found
- queueIndex = enqueue.GetMeta().QueueIndex
+ queueIndex := s.GetLatestEnqueueIndex()
+ if queueIndex == nil {
+ enqueue, err := s.client.GetLastConfirmedEnqueue()
+ // There are no enqueues yet
+ if errors.Is(err, errElementNotFound) {
+ return nil
+ }
+ // Other unexpected error
+ if err != nil {
+ return fmt.Errorf("Cannot fetch last confirmed queue tx: %w", err)
}
- s.SetLatestEnqueueIndex(queueIndex)
+ // No error, the queue element was found
+ queueIndex = enqueue.GetMeta().QueueIndex
}
+ s.SetLatestEnqueueIndex(queueIndex)
return nil
}
@@ -288,6 +363,8 @@ func (s *SyncService) IsSyncing() bool {
// started by this service.
func (s *SyncService) Stop() error {
s.scope.Close()
+ s.chainHeadSub.Unsubscribe()
+ close(s.chainHeadCh)
if s.cancel != nil {
defer s.cancel()
@@ -295,165 +372,180 @@ func (s *SyncService) Stop() error {
return nil
}
+// VerifierLoop is the main loop for Verifier mode
func (s *SyncService) VerifierLoop() {
log.Info("Starting Verifier Loop", "poll-interval", s.pollInterval, "timestamp-refresh-threshold", s.timestampRefreshThreshold)
- for {
+ t := time.NewTicker(s.pollInterval)
+ for ; true; <-t.C {
if err := s.updateL1GasPrice(); err != nil {
log.Error("Cannot update L1 gas price", "msg", err)
}
if err := s.verify(); err != nil {
log.Error("Could not verify", "error", err)
}
- time.Sleep(s.pollInterval)
+ if err := s.updateGasPriceOracleCache(nil); err != nil {
+ log.Error("Cannot update L2 gas price", "msg", err)
+ }
}
}
+// verify is the main logic for the Verifier. The verifier logic is different
+// depending on the Backend
func (s *SyncService) verify() error {
- // The verifier polls for ctc transactions.
- // the ctc transactions are extending the chain.
- latest, err := s.client.GetLatestTransaction()
- if errors.Is(err, errElementNotFound) {
- log.Debug("latest transaction not found")
- return nil
- }
- if err != nil {
- return err
- }
-
- var start uint64
- if s.GetLatestIndex() == nil {
- start = 0
- } else {
- start = *s.GetLatestIndex() + 1
- }
- end := *latest.GetMeta().Index
- log.Info("Polling transactions", "start", start, "end", end)
- for i := start; i <= end; i++ {
- tx, err := s.client.GetTransaction(i)
- if err != nil {
- return fmt.Errorf("cannot get tx in loop: %w", err)
+ switch s.backend {
+ case BackendL1:
+ if err := s.syncBatchesToTip(); err != nil {
+ return fmt.Errorf("Verifier cannot sync transaction batches to tip: %w", err)
}
-
- log.Debug("Applying transaction", "index", i)
- err = s.maybeApplyTransaction(tx)
- if err != nil {
- return fmt.Errorf("could not apply transaction: %w", err)
+ case BackendL2:
+ if err := s.syncTransactionsToTip(); err != nil {
+ return fmt.Errorf("Verifier cannot sync transactions with BackendL2: %w", err)
}
- s.SetLatestIndex(&i)
}
-
return nil
}
+// SequencerLoop is the polling loop that runs in sequencer mode. It sequences
+// transactions and then updates the EthContext.
func (s *SyncService) SequencerLoop() {
log.Info("Starting Sequencer Loop", "poll-interval", s.pollInterval, "timestamp-refresh-threshold", s.timestampRefreshThreshold)
- for {
+ t := time.NewTicker(s.pollInterval)
+ for ; true; <-t.C {
if err := s.updateL1GasPrice(); err != nil {
log.Error("Cannot update L1 gas price", "msg", err)
}
s.txLock.Lock()
- err := s.sequence()
- if err != nil {
+ if err := s.sequence(); err != nil {
log.Error("Could not sequence", "error", err)
}
s.txLock.Unlock()
- if s.updateContext() != nil {
+ if err := s.updateGasPriceOracleCache(nil); err != nil {
+ log.Error("Cannot update L2 gas price", "msg", err)
+ }
+ if err := s.updateContext(); err != nil {
log.Error("Could not update execution context", "error", err)
}
-
- time.Sleep(s.pollInterval)
}
}
+// sequence is the main logic for the Sequencer. It will sync any `enqueue`
+// transactions it has yet to sync and then pull in transaction batches to
+// compare against the transactions it has in its local state. The sequencer
+// should reorg based on the transaction batches that are posted because
+// L1 is the source of truth. The sequencer concurrently accepts user
+// transactions via the RPC.
func (s *SyncService) sequence() error {
- // Only the sequencer needs to poll for enqueue transactions
- // and then can choose when to apply them. We choose to apply
- // transactions such that it makes for efficient batch submitting.
- // Place as many L1ToL2 transactions in the same context as possible
- // by executing them one after another.
- latest, err := s.client.GetLatestEnqueue()
- if errors.Is(err, errElementNotFound) {
- log.Debug("No enqueue transactions found")
- return nil
+ if err := s.syncQueueToTip(); err != nil {
+ return fmt.Errorf("Sequencer cannot sequence queue: %w", err)
}
- if err != nil {
- return fmt.Errorf("cannot fetch latest enqueue: %w", err)
- }
- // Compare the remote latest queue index to the local latest
- // queue index. If the remote latest queue index is greater
- // than the local latest queue index, be sure to ingest more
- // enqueued transactions
- var start uint64
- if s.GetLatestEnqueueIndex() == nil {
- start = 0
- } else {
- start = *s.GetLatestEnqueueIndex() + 1
+ if err := s.syncBatchesToTip(); err != nil {
+ return fmt.Errorf("Sequencer cannot sync transaction batches: %w", err)
}
- end := *latest.GetMeta().QueueIndex
+ return nil
+}
- log.Info("Polling enqueued transactions", "start", start, "end", end)
- for i := start; i <= end; i++ {
- enqueue, err := s.client.GetEnqueue(i)
- if err != nil {
- return fmt.Errorf("Cannot get enqueue in loop %d: %w", i, err)
- }
+func (s *SyncService) syncQueueToTip() error {
+ if err := s.syncToTip(s.syncQueue, s.client.GetLatestEnqueueIndex); err != nil {
+ return fmt.Errorf("Cannot sync queue to tip: %w", err)
+ }
+ return nil
+}
- if enqueue == nil {
- log.Debug("No enqueue transaction found")
- return nil
- }
+func (s *SyncService) syncBatchesToTip() error {
+ if err := s.syncToTip(s.syncBatches, s.client.GetLatestTransactionBatchIndex); err != nil {
+ return fmt.Errorf("Cannot sync transaction batches to tip: %w", err)
+ }
+ return nil
+}
- // This should never happen
- if enqueue.L1BlockNumber() == nil {
- return fmt.Errorf("No blocknumber for enqueue idx %d, timestamp %d, blocknumber %d", i, enqueue.L1Timestamp(), enqueue.L1BlockNumber())
- }
+func (s *SyncService) syncTransactionsToTip() error {
+ sync := func() (*uint64, error) {
+ return s.syncTransactions(s.backend)
+ }
+ check := func() (*uint64, error) {
+ return s.client.GetLatestTransactionIndex(s.backend)
+ }
+ if err := s.syncToTip(sync, check); err != nil {
+ return fmt.Errorf("Verifier cannot sync transactions with backend %s: %w", s.backend.String(), err)
+ }
+ return nil
+}
- // Update the timestamp and blocknumber based on the enqueued
- // transactions
- if enqueue.L1Timestamp() > s.GetLatestL1Timestamp() {
- ts := enqueue.L1Timestamp()
- bn := enqueue.L1BlockNumber().Uint64()
- s.SetLatestL1Timestamp(ts)
- s.SetLatestL1BlockNumber(bn)
- log.Info("Updated Eth Context from enqueue", "index", i, "timestamp", ts, "blocknumber", bn)
- }
+// updateL1GasPrice queries for the current L1 gas price and then stores it
+// in the L1 Gas Price Oracle. This must be called over time to properly
+// estimate the transaction fees that the sequencer should charge.
+func (s *SyncService) updateL1GasPrice() error {
+ l1GasPrice, err := s.client.GetL1GasPrice()
+ if err != nil {
+ return fmt.Errorf("cannot fetch L1 gas price: %w", err)
+ }
+ s.RollupGpo.SetL1GasPrice(l1GasPrice)
+ return nil
+}
- log.Debug("Applying enqueue transaction", "index", i)
- err = s.applyTransaction(enqueue)
+// updateL2GasPrice accepts a state db and reads the gas price from the gas
+// price oracle at the state that corresponds to the state db. If no state db
+// is passed in, then the tip is used.
+func (s *SyncService) updateL2GasPrice(statedb *state.StateDB) error {
+ var err error
+ if statedb == nil {
+ statedb, err = s.bc.State()
if err != nil {
- return fmt.Errorf("could not apply transaction: %w", err)
+ return err
}
+ }
+ result := statedb.GetState(l2GasPriceOracleAddress, l2GasPriceSlot)
+ s.RollupGpo.SetL2GasPrice(result.Big())
+ return nil
+}
- s.SetLatestEnqueueIndex(enqueue.GetMeta().QueueIndex)
- if enqueue.GetMeta().Index == nil {
- latest := s.GetLatestIndex()
- index := uint64(0)
- if latest != nil {
- index = *latest + 1
- }
- s.SetLatestIndex(&index)
- } else {
- s.SetLatestIndex(enqueue.GetMeta().Index)
+// cacheGasPriceOracleOwner accepts a statedb and caches the gas price oracle
+// owner address locally
+func (s *SyncService) cacheGasPriceOracleOwner(statedb *state.StateDB) error {
+ var err error
+ if statedb == nil {
+ statedb, err = s.bc.State()
+ if err != nil {
+ return err
}
}
-
+ s.gasPriceOracleOwnerAddressLock.Lock()
+ defer s.gasPriceOracleOwnerAddressLock.Unlock()
+ result := statedb.GetState(l2GasPriceOracleAddress, l2GasPriceOracleOwnerSlot)
+ s.gasPriceOracleOwnerAddress = common.BytesToAddress(result.Bytes())
return nil
}
-// updateL1GasPrice queries for the current L1 gas price and then stores it
-// in the L1 Gas Price Oracle. This must be called over time to properly
-// estimate the transaction fees that the sequencer should charge.
-func (s *SyncService) updateL1GasPrice() error {
- l1GasPrice, err := s.client.GetL1GasPrice()
+// updateGasPriceOracleCache caches the owner as well as updating the
+// the L2 gas price from the OVM_GasPriceOracle
+func (s *SyncService) updateGasPriceOracleCache(hash *common.Hash) error {
+ var statedb *state.StateDB
+ var err error
+ if hash != nil {
+ statedb, err = s.bc.StateAt(*hash)
+ } else {
+ statedb, err = s.bc.State()
+ }
if err != nil {
return err
}
- s.RollupGpo.SetDataPrice(l1GasPrice)
- log.Info("Adjusted L1 Gas Price", "gasprice", l1GasPrice)
+ if err := s.cacheGasPriceOracleOwner(statedb); err != nil {
+ return err
+ }
+ if err := s.updateL2GasPrice(statedb); err != nil {
+ return err
+ }
return nil
}
+// A thread safe getter for the gas price oracle owner address
+func (s *SyncService) GasPriceOracleOwnerAddress() *common.Address {
+ s.gasPriceOracleOwnerAddressLock.RLock()
+ defer s.gasPriceOracleOwnerAddressLock.RUnlock()
+ return &s.gasPriceOracleOwnerAddress
+}
+
/// Update the execution context's timestamp and blocknumber
/// over time. This is only necessary for the sequencer.
func (s *SyncService) updateContext() error {
@@ -461,7 +553,6 @@ func (s *SyncService) updateContext() error {
if err != nil {
return err
}
-
current := time.Unix(int64(s.GetLatestL1Timestamp()), 0)
next := time.Unix(int64(context.Timestamp), 0)
if next.Sub(current) > s.timestampRefreshThreshold {
@@ -469,81 +560,9 @@ func (s *SyncService) updateContext() error {
s.SetLatestL1BlockNumber(context.BlockNumber)
s.SetLatestL1Timestamp(context.Timestamp)
}
-
return nil
}
-// This function must sync all the way to the tip
-// TODO: it should then sync all of the enqueue transactions
-func (s *SyncService) syncTransactionsToTip() error {
- // Then set up a while loop that only breaks when the latest
- // transaction does not change through two runs of the loop.
- // The latest transaction can change during the timeframe of
- // all of the transactions being sync'd.
- for {
- // This function must be sure to sync all the way to the tip.
- // First query the latest transaction
- latest, err := s.client.GetLatestTransaction()
- if errors.Is(err, errElementNotFound) {
- log.Info("No transactions to sync")
- return nil
- }
- if err != nil {
- log.Error("Cannot get latest transaction", "msg", err)
- time.Sleep(time.Second * 2)
- continue
- }
- tipHeight := latest.GetMeta().Index
- index := rawdb.ReadHeadIndex(s.db)
- start := uint64(0)
- if index != nil {
- start = *index + 1
- }
-
- log.Info("Syncing transactions to tip", "start", start, "end", *tipHeight)
- for i := start; i <= *tipHeight; i++ {
- tx, err := s.client.GetTransaction(i)
- if err != nil {
- log.Error("Cannot get transaction", "index", i, "msg", err)
- time.Sleep(time.Second * 2)
- continue
- }
- // The transaction does not yet exist in the ctc
- if tx == nil {
- index := latest.GetMeta().Index
- if index == nil {
- return fmt.Errorf("Unexpected nil index")
- }
- return fmt.Errorf("Transaction %d not found when %d is latest", i, *index)
- }
- err = s.maybeApplyTransaction(tx)
- if err != nil {
- return fmt.Errorf("Cannot apply transaction: %w", err)
- }
- if err != nil {
- log.Error("Cannot ingest transaction", "index", i)
- }
- s.SetLatestIndex(tx.GetMeta().Index)
- if types.QueueOrigin(tx.QueueOrigin().Uint64()) == types.QueueOriginL1ToL2 {
- queueIndex := tx.GetMeta().QueueIndex
- s.SetLatestEnqueueIndex(queueIndex)
- }
- }
- // Be sure to check that no transactions came in while
- // the above loop was running
- post, err := s.client.GetLatestTransaction()
- if err != nil {
- return fmt.Errorf("Cannot get latest transaction: %w", err)
- }
- // These transactions should always have an index since they
- // are already in the ctc.
- if *latest.GetMeta().Index == *post.GetMeta().Index {
- log.Info("Done syncing transactions to tip")
- return nil
- }
- }
-}
-
// Methods for safely accessing and storing the latest
// L1 blocknumber and timestamp. These are held in memory.
@@ -632,227 +651,488 @@ func (s *SyncService) SetLatestVerifiedIndex(index *uint64) {
}
}
-// reorganize will reorganize to directly to the index passed in.
-// The caller must handle the offset relative to the ctc.
-func (s *SyncService) reorganize(index uint64) error {
- if index == 0 {
- return nil
- }
- err := s.bc.SetHead(index)
- if err != nil {
- return fmt.Errorf("Cannot reorganize in syncservice: %w", err)
- }
+// GetLatestBatchIndex reads the last processed transaction batch
+func (s *SyncService) GetLatestBatchIndex() *uint64 {
+ return rawdb.ReadHeadBatchIndex(s.db)
+}
- // TODO: make sure no off by one error here
- s.SetLatestIndex(&index)
+// GetNextBatchIndex reads the index of the next transaction batch to process
+func (s *SyncService) GetNextBatchIndex() uint64 {
+ index := s.GetLatestBatchIndex()
+ if index == nil {
+ return 0
+ }
+ return *index + 1
+}
- // When in sequencer mode, be sure to roll back the latest queue
- // index as well.
- if !s.verifier {
- enqueue, err := s.client.GetLastConfirmedEnqueue()
- if err != nil {
- return fmt.Errorf("cannot reorganize: %w", err)
- }
- s.SetLatestEnqueueIndex(enqueue.GetMeta().QueueIndex)
+// SetLatestBatchIndex writes the last index of the transaction batch that was processed
+func (s *SyncService) SetLatestBatchIndex(index *uint64) {
+ if index != nil {
+ rawdb.WriteHeadBatchIndex(s.db, *index)
}
- log.Info("Reorganizing", "height", index)
- return nil
}
-// SubscribeNewTxsEvent registers a subscription of NewTxsEvent and
-// starts sending event to the given channel.
-func (s *SyncService) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription {
- return s.scope.Track(s.txFeed.Subscribe(ch))
+// applyTransaction is a higher level API for applying a transaction
+func (s *SyncService) applyTransaction(tx *types.Transaction) error {
+ if tx.GetMeta().Index != nil {
+ return s.applyIndexedTransaction(tx)
+ }
+ return s.applyTransactionToTip(tx)
}
-// maybeApplyTransaction will potentially apply the transaction after first
-// inspecting the local database. This is mean to prevent transactions from
-// being replayed.
-func (s *SyncService) maybeApplyTransaction(tx *types.Transaction) error {
+// applyIndexedTransaction applys a transaction that has an index. This means
+// that the source of the transaction was either a L1 batch or from the
+// sequencer.
+func (s *SyncService) applyIndexedTransaction(tx *types.Transaction) error {
if tx == nil {
- return fmt.Errorf("nil transaction passed to maybeApplyTransaction")
+ return errors.New("Transaction is nil in applyIndexedTransaction")
+ }
+ index := tx.GetMeta().Index
+ if index == nil {
+ return errors.New("No index found in applyIndexedTransaction")
+ }
+ log.Trace("Applying indexed transaction", "index", *index)
+ next := s.GetNextIndex()
+ if *index == next {
+ return s.applyTransactionToTip(tx)
+ }
+ if *index < next {
+ return s.applyHistoricalTransaction(tx)
}
+ return fmt.Errorf("Received tx at index %d when looking for %d", *index, next)
+}
- log.Debug("Maybe applying transaction", "hash", tx.Hash().Hex())
+// applyHistoricalTransaction will compare a historical transaction against what
+// is locally indexed. This will trigger a reorg in the future
+func (s *SyncService) applyHistoricalTransaction(tx *types.Transaction) error {
+ if tx == nil {
+ return errors.New("Transaction is nil in applyHistoricalTransaction")
+ }
index := tx.GetMeta().Index
if index == nil {
- return fmt.Errorf("nil index in maybeApplyTransaction")
+ return errors.New("No index is found in applyHistoricalTransaction")
}
- // Handle off by one
+ // Handle the off by one
block := s.bc.GetBlockByNumber(*index + 1)
-
- // The transaction has yet to be played, so it is safe to apply
if block == nil {
- err := s.applyTransaction(tx)
- if err != nil {
- return fmt.Errorf("Maybe apply transaction failed on index %d: %w", *index, err)
- }
- return nil
+ return fmt.Errorf("Block %d is not found", *index+1)
}
- // There is already a transaction at that index, so check
- // for its equality.
txs := block.Transactions()
if len(txs) != 1 {
- log.Info("block", "txs", len(txs), "number", block.Number().Uint64())
- return fmt.Errorf("More than 1 transaction in block")
+ return fmt.Errorf("More than one transaction found in block %d", *index+1)
}
- if isCtcTxEqual(tx, txs[0]) {
- log.Info("Matching transaction found", "index", *index)
+ if !isCtcTxEqual(tx, txs[0]) {
+ log.Error("Mismatched transaction", "index", *index)
} else {
- log.Warn("Non matching transaction found", "index", *index)
+ log.Debug("Historical transaction matches", "index", *index, "hash", tx.Hash().Hex())
}
return nil
}
-// Lower level API used to apply a transaction, must only be used with
-// transactions that came from L1.
-func (s *SyncService) applyTransaction(tx *types.Transaction) error {
- tx = fixType(tx)
+// applyTransactionToTip will do sanity checks on the transaction before
+// applying it to the tip. It blocks until the transaction has been included in
+// the chain. It is assumed that validation around the index has already
+// happened.
+func (s *SyncService) applyTransactionToTip(tx *types.Transaction) error {
+ if tx == nil {
+ return errors.New("nil transaction passed to applyTransactionToTip")
+ }
+ // Queue Origin L1 to L2 transactions must have a timestamp that is set by
+ // the L1 block that holds the transaction. This should never happen but is
+ // a sanity check to prevent fraudulent execution.
+ if tx.QueueOrigin() == types.QueueOriginL1ToL2 {
+ if tx.L1Timestamp() == 0 {
+ return fmt.Errorf("Queue origin L1 to L2 transaction without a timestamp: %s", tx.Hash().Hex())
+ }
+ }
+ // If there is no OVM timestamp assigned to the transaction, then assign a
+ // timestamp and blocknumber to it. This should only be the case for queue
+ // origin sequencer transactions that come in via RPC. The L1 to L2
+ // transactions that come in via `enqueue` should have a timestamp set based
+ // on the L1 block that it was included in.
+ // Note that Ethereum Layer one consensus rules dictate that the timestamp
+ // must be strictly increasing between blocks, so no need to check both the
+ // timestamp and the blocknumber.
+ if tx.L1Timestamp() == 0 {
+ ts := s.GetLatestL1Timestamp()
+ bn := s.GetLatestL1BlockNumber()
+ tx.SetL1Timestamp(ts)
+ tx.SetL1BlockNumber(bn)
+ } else if tx.L1Timestamp() > s.GetLatestL1Timestamp() {
+ // If the timestamp of the transaction is greater than the sync
+ // service's locally maintained timestamp, update the timestamp and
+ // blocknumber to equal that of the transaction's. This should happen
+ // with `enqueue` transactions.
+ ts := tx.L1Timestamp()
+ bn := tx.L1BlockNumber()
+ s.SetLatestL1Timestamp(ts)
+ s.SetLatestL1BlockNumber(bn.Uint64())
+ log.Debug("Updating OVM context based on new transaction", "timestamp", ts, "blocknumber", bn.Uint64(), "queue-origin", tx.QueueOrigin())
+ } else if tx.L1Timestamp() < s.GetLatestL1Timestamp() {
+ log.Error("Timestamp monotonicity violation", "hash", tx.Hash().Hex())
+ }
+
+ if tx.GetMeta().Index == nil {
+ index := s.GetLatestIndex()
+ if index == nil {
+ tx.SetIndex(0)
+ } else {
+ tx.SetIndex(*index + 1)
+ }
+ }
+ s.SetLatestIndex(tx.GetMeta().Index)
+ if tx.GetMeta().QueueIndex != nil {
+ s.SetLatestEnqueueIndex(tx.GetMeta().QueueIndex)
+ }
+ // The index was set above so it is safe to dereference
+ log.Debug("Applying transaction to tip", "index", *tx.GetMeta().Index, "hash", tx.Hash().Hex())
+
txs := types.Transactions{tx}
s.txFeed.Send(core.NewTxsEvent{Txs: txs})
+ // Block until the transaction has been added to the chain
+ log.Trace("Waiting for transaction to be added to chain", "hash", tx.Hash().Hex())
+ <-s.chainHeadCh
+
+ return nil
+}
+
+// applyBatchedTransaction applies transactions that were batched to layer one.
+// The sequencer checks for batches over time to make sure that it does not
+// deviate from the L1 state and this is the main method of transaction
+// ingestion for the verifier.
+func (s *SyncService) applyBatchedTransaction(tx *types.Transaction) error {
+ if tx == nil {
+ return errors.New("nil transaction passed into applyBatchedTransaction")
+ }
+ index := tx.GetMeta().Index
+ if index == nil {
+ return errors.New("No index found on transaction")
+ }
+ log.Trace("Applying batched transaction", "index", *index)
+ err := s.applyIndexedTransaction(tx)
+ if err != nil {
+ return fmt.Errorf("Cannot apply batched transaction: %w", err)
+ }
+ s.SetLatestVerifiedIndex(index)
+ return nil
+}
+
+// verifyFee will verify that a valid fee is being paid.
+func (s *SyncService) verifyFee(tx *types.Transaction) error {
+ if tx.GasPrice().Cmp(common.Big0) == 0 {
+ // Allow 0 gas price transactions only if it is the owner of the gas
+ // price oracle
+ gpoOwner := s.GasPriceOracleOwnerAddress()
+ if gpoOwner != nil {
+ from, err := types.Sender(s.signer, tx)
+ if err != nil {
+ return fmt.Errorf("invalid transaction: %w", core.ErrInvalidSender)
+ }
+ if from == *gpoOwner {
+ return nil
+ }
+ }
+ // Exit early if fees are enforced and the gasPrice is set to 0
+ if s.enforceFees {
+ return errZeroGasPriceTx
+ }
+ // If fees are not enforced and the gas price is 0, return early
+ return nil
+ }
+ // When the gas price is non zero, it must be equal to the constant
+ if tx.GasPrice().Cmp(fees.BigTxGasPrice) != 0 {
+ return fmt.Errorf("tx.gasPrice must be %d", fees.TxGasPrice)
+ }
+ l1GasPrice, err := s.RollupGpo.SuggestL1GasPrice(context.Background())
+ if err != nil {
+ return err
+ }
+ l2GasPrice, err := s.RollupGpo.SuggestL2GasPrice(context.Background())
+ if err != nil {
+ return err
+ }
+ // Calculate the fee based on decoded L2 gas limit
+ gas := new(big.Int).SetUint64(tx.Gas())
+ l2GasLimit := fees.DecodeL2GasLimit(gas)
+
+ // Only count the calldata here as the overhead of the fully encoded
+ // RLP transaction is handled inside of EncodeL2GasLimit
+ expectedTxGasLimit := fees.EncodeTxGasLimit(tx.Data(), l1GasPrice, l2GasLimit, l2GasPrice)
+ if err != nil {
+ return err
+ }
+
+ // This should only happen if the unscaled transaction fee is greater than 18.44 ETH
+ if !expectedTxGasLimit.IsUint64() {
+ return fmt.Errorf("fee overflow: %s", expectedTxGasLimit.String())
+ }
+
+ userFee := new(big.Int).Mul(new(big.Int).SetUint64(tx.Gas()), tx.GasPrice())
+ opts := fees.PaysEnoughOpts{
+ UserFee: userFee,
+ ExpectedFee: expectedTxGasLimit.Mul(expectedTxGasLimit, fees.BigTxGasPrice),
+ ThresholdUp: s.feeThresholdUp,
+ ThresholdDown: s.feeThresholdDown,
+ }
+ // Check the error type and return the correct error message to the user
+ if err := fees.PaysEnough(&opts); err != nil {
+ if errors.Is(err, fees.ErrFeeTooLow) {
+ return fmt.Errorf("%w: %d, use at least tx.gasLimit = %d and tx.gasPrice = %d",
+ fees.ErrFeeTooLow, userFee, expectedTxGasLimit, fees.BigTxGasPrice)
+ }
+ if errors.Is(err, fees.ErrFeeTooHigh) {
+ return fmt.Errorf("%w: %d", fees.ErrFeeTooHigh, userFee)
+ }
+ return err
+ }
return nil
}
// Higher level API for applying transactions. Should only be called for
// queue origin sequencer transactions, as the contracts on L1 manage the same
// validity checks that are done here.
-func (s *SyncService) ApplyTransaction(tx *types.Transaction) error {
+func (s *SyncService) ValidateAndApplySequencerTransaction(tx *types.Transaction) error {
+ if s.verifier {
+ return errors.New("Verifier does not accept transactions out of band")
+ }
if tx == nil {
- return fmt.Errorf("nil transaction passed to ApplyTransaction")
+ return errors.New("nil transaction passed to ValidateAndApplySequencerTransaction")
+ }
+ if err := s.verifyFee(tx); err != nil {
+ return err
}
-
- log.Debug("Sending transaction to sync service", "hash", tx.Hash().Hex())
s.txLock.Lock()
defer s.txLock.Unlock()
- if s.verifier {
- return errors.New("Verifier does not accept transactions out of band")
- }
+ log.Trace("Sequencer transaction validation", "hash", tx.Hash().Hex())
+
qo := tx.QueueOrigin()
- if qo == nil {
- return errors.New("invalid transaction with no queue origin")
+ if qo != types.QueueOriginSequencer {
+ return fmt.Errorf("invalid transaction with queue origin %d", qo)
+ }
+ if err := s.txpool.ValidateTx(tx); err != nil {
+ return fmt.Errorf("invalid transaction: %w", err)
}
- if qo.Uint64() != uint64(types.QueueOriginSequencer) {
- return fmt.Errorf("invalid transaction with queue origin %d", qo.Uint64())
+ return s.applyTransaction(tx)
+}
+
+// syncer represents a function that can sync remote items and then returns the
+// index that it synced to as well as an error if it encountered one. It has
+// side effects on the state and its functionality depends on the current state
+type syncer func() (*uint64, error)
+
+// rangeSyncer represents a function that syncs a range of items between its two
+// arguments (inclusive)
+type rangeSyncer func(uint64, uint64) error
+
+// nextGetter is a type that represents a function that will return the next
+// index
+type nextGetter func() uint64
+
+// indexGetter is a type that represents a function that returns an index and an
+// error if there is a problem fetching the index. The different types of
+// indices are canonical transaction chain indices, queue indices and batch
+// indices. It does not induce side effects on state
+type indexGetter func() (*uint64, error)
+
+// isAtTip is a function that will determine if the local chain is at the tip
+// of the remote datasource
+func (s *SyncService) isAtTip(index *uint64, get indexGetter) (bool, error) {
+ latest, err := get()
+ if errors.Is(err, errElementNotFound) {
+ if index == nil {
+ return true, nil
+ }
+ return false, nil
}
- err := s.txpool.ValidateTx(tx)
if err != nil {
- return fmt.Errorf("invalid transaction: %w", err)
+ return false, err
}
+ // There are no known enqueue transactions locally or remotely
+ if latest == nil && index == nil {
+ return true, nil
+ }
+ // Only one of the transactions are nil due to the check above so they
+ // cannot be equal
+ if latest == nil || index == nil {
+ return false, nil
+ }
+ // The indices are equal
+ if *latest == *index {
+ return true, nil
+ }
+ // The local tip is greater than the remote tip. This should never happen
+ if *latest < *index {
+ return false, fmt.Errorf("is at tip mismatch: remote (%d) - local (%d): %w", *latest, *index, errShortRemoteTip)
+ }
+ // The indices are not equal
+ return false, nil
+}
- if tx.L1Timestamp() == 0 {
- ts := s.GetLatestL1Timestamp()
- bn := s.GetLatestL1BlockNumber()
- tx.SetL1Timestamp(ts)
- tx.SetL1BlockNumber(bn)
+// syncToTip is a function that can be used to sync to the tip of an ordered
+// list of things. It is used to sync transactions, enqueue elements and batches
+func (s *SyncService) syncToTip(sync syncer, getTip indexGetter) error {
+ s.loopLock.Lock()
+ defer s.loopLock.Unlock()
+
+ for {
+ index, err := sync()
+ if errors.Is(err, errElementNotFound) {
+ return nil
+ }
+ if err != nil {
+ return err
+ }
+ isAtTip, err := s.isAtTip(index, getTip)
+ if err != nil {
+ return err
+ }
+ if isAtTip {
+ return nil
+ }
}
+}
- // Set the raw transaction data in the meta
- txRaw, err := getRawTransaction(tx)
+// sync will sync a range of items
+func (s *SyncService) sync(getLatest indexGetter, getNext nextGetter, syncer rangeSyncer) (*uint64, error) {
+ latestIndex, err := getLatest()
if err != nil {
- return fmt.Errorf("invalid transaction: %w", err)
+ return nil, fmt.Errorf("Cannot sync: %w", err)
+ }
+ if latestIndex == nil {
+ return nil, errors.New("Latest index is not defined")
}
- meta := tx.GetMeta()
- newMeta := types.NewTransactionMeta(
- meta.L1BlockNumber,
- meta.L1Timestamp,
- meta.L1MessageSender,
- meta.SignatureHashType,
- types.QueueOrigin(meta.QueueOrigin.Uint64()),
- meta.Index,
- meta.QueueIndex,
- txRaw,
- )
- tx.SetTransactionMeta(newMeta)
- return s.applyTransaction(tx)
+ nextIndex := getNext()
+ if nextIndex == *latestIndex+1 {
+ return latestIndex, nil
+ }
+ if err := syncer(nextIndex, *latestIndex); err != nil {
+ return nil, err
+ }
+ return latestIndex, nil
}
-func getRawTransaction(tx *types.Transaction) ([]byte, error) {
- if tx == nil {
- return nil, errors.New("Cannot process nil transaction")
+// syncBatches will sync a range of batches from the current known tip to the
+// remote tip.
+func (s *SyncService) syncBatches() (*uint64, error) {
+ index, err := s.sync(s.client.GetLatestTransactionBatchIndex, s.GetNextBatchIndex, s.syncTransactionBatchRange)
+ if err != nil {
+ return nil, fmt.Errorf("Cannot sync batches: %w", err)
}
- v, r, s := tx.RawSignatureValues()
+ return index, nil
+}
- // V parameter here will include the chain ID, so we need to recover the original V. If the V
- // does not equal zero or one, we have an invalid parameter and need to throw an error.
- // This is technically a duplicate check because it happens inside of
- // `tx.AsMessage` as well.
- v = new(big.Int).SetUint64(v.Uint64() - 35 - 2*tx.ChainId().Uint64())
- if v.Uint64() != 0 && v.Uint64() != 1 {
- return nil, fmt.Errorf("invalid signature v parameter: %d", v.Uint64())
+// syncTransactionBatchRange will sync a range of batched transactions from
+// start to end (inclusive)
+func (s *SyncService) syncTransactionBatchRange(start, end uint64) error {
+ log.Info("Syncing transaction batch range", "start", start, "end", end)
+ for i := start; i <= end; i++ {
+ log.Debug("Fetching transaction batch", "index", i)
+ _, txs, err := s.client.GetTransactionBatch(i)
+ if err != nil {
+ return fmt.Errorf("Cannot get transaction batch: %w", err)
+ }
+ for _, tx := range txs {
+ if err := s.applyBatchedTransaction(tx); err != nil {
+ return fmt.Errorf("cannot apply batched transaction: %w", err)
+ }
+ }
+ s.SetLatestBatchIndex(&i)
}
+ return nil
+}
- // Since we use a fixed encoding, we need to insert some placeholder address to represent that
- // the user wants to create a contract (in this case, the zero address).
- var target common.Address
- if tx.To() == nil {
- target = common.Address{}
- } else {
- target = *tx.To()
- }
-
- // Divide the gas price by one million to compress it
- // before it is send to the sequencer entrypoint. This is to save
- // space on calldata.
- gasPrice := new(big.Int).Div(tx.GasPrice(), new(big.Int).SetUint64(1000000))
-
- // Sequencer uses a custom encoding structure --
- // We originally receive sequencer transactions encoded in this way, but we decode them before
- // inserting into Geth so we can make transactions easily parseable. However, this means that
- // we need to re-encode the transactions before executing them.
- var data = new(bytes.Buffer)
- data.WriteByte(getSignatureType(tx)) // 1 byte: 00 == EIP 155, 02 == ETH Sign Message
- data.Write(fillBytes(r, 32)) // 32 bytes: Signature `r` parameter
- data.Write(fillBytes(s, 32)) // 32 bytes: Signature `s` parameter
- data.Write(fillBytes(v, 1)) // 1 byte: Signature `v` parameter
- data.Write(fillBytes(new(big.Int).SetUint64(tx.Gas()), 3)) // 3 bytes: Gas limit
- data.Write(fillBytes(gasPrice, 3)) // 3 bytes: Gas price
- data.Write(fillBytes(new(big.Int).SetUint64(tx.Nonce()), 3)) // 3 bytes: Nonce
- data.Write(target.Bytes()) // 20 bytes: Target address
- data.Write(tx.Data())
-
- return data.Bytes(), nil
-}
-
-func fillBytes(x *big.Int, size int) []byte {
- b := x.Bytes()
- switch {
- case len(b) > size:
- panic("math/big: value won't fit requested size")
- case len(b) == size:
- return b
- default:
- buf := make([]byte, size)
- copy(buf[size-len(b):], b)
- return buf
- }
-}
-
-func getSignatureType(tx *types.Transaction) uint8 {
- if tx.SignatureHashType() == 0 {
- return 0
- } else if tx.SignatureHashType() == 1 {
- return 2
- } else {
- return 1
+// syncQueue will sync from the local tip to the known tip of the remote
+// enqueue transaction feed.
+func (s *SyncService) syncQueue() (*uint64, error) {
+ index, err := s.sync(s.client.GetLatestEnqueueIndex, s.GetNextEnqueueIndex, s.syncQueueTransactionRange)
+ if err != nil {
+ return nil, fmt.Errorf("Cannot sync queue: %w", err)
+ }
+ return index, nil
+}
+
+// syncQueueTransactionRange will apply a range of queue transactions from
+// start to end (inclusive)
+func (s *SyncService) syncQueueTransactionRange(start, end uint64) error {
+ log.Info("Syncing enqueue transactions range", "start", start, "end", end)
+ for i := start; i <= end; i++ {
+ tx, err := s.client.GetEnqueue(i)
+ if err != nil {
+ return fmt.Errorf("Canot get enqueue transaction; %w", err)
+ }
+ if err := s.applyTransaction(tx); err != nil {
+ return fmt.Errorf("Cannot apply transaction: %w", err)
+ }
+ }
+ return nil
+}
+
+// syncTransactions will sync transactions to the remote tip based on the
+// backend
+func (s *SyncService) syncTransactions(backend Backend) (*uint64, error) {
+ getLatest := func() (*uint64, error) {
+ return s.client.GetLatestTransactionIndex(backend)
+ }
+ sync := func(start, end uint64) error {
+ return s.syncTransactionRange(start, end, backend)
}
+ index, err := s.sync(getLatest, s.GetNextIndex, sync)
+ if err != nil {
+ return nil, fmt.Errorf("Cannot sync transactions with backend %s: %w", backend.String(), err)
+ }
+ return index, nil
+}
+
+// syncTransactionRange will sync a range of transactions from
+// start to end (inclusive) from a specific Backend
+func (s *SyncService) syncTransactionRange(start, end uint64, backend Backend) error {
+ log.Info("Syncing transaction range", "start", start, "end", end, "backend", backend.String())
+ for i := start; i <= end; i++ {
+ tx, err := s.client.GetTransaction(i, backend)
+ if err != nil {
+ return fmt.Errorf("cannot fetch transaction %d: %w", i, err)
+ }
+ if err = s.applyTransaction(tx); err != nil {
+ return fmt.Errorf("Cannot apply transaction: %w", err)
+ }
+ }
+ return nil
}
-// This is a temporary fix to patch the enums being used in the raw data
-func fixType(tx *types.Transaction) *types.Transaction {
- meta := tx.GetMeta()
- raw := meta.RawTransaction
- if len(raw) == 0 {
- log.Error("Transaction with no raw detected")
- return tx
+// updateEthContext will update the OVM execution context's
+// timestamp and blocknumber if enough time has passed since
+// it was last updated. This is a sequencer only function.
+func (s *SyncService) updateEthContext() error {
+ context, err := s.client.GetLatestEthContext()
+ if err != nil {
+ return fmt.Errorf("Cannot get eth context: %w", err)
}
- if raw[0] == 0x00 {
- return tx
- } else if raw[0] == 0x01 {
- raw[0] = 0x02
+ current := time.Unix(int64(s.GetLatestL1Timestamp()), 0)
+ next := time.Unix(int64(context.Timestamp), 0)
+ if next.Sub(current) > s.timestampRefreshThreshold {
+ log.Info("Updating Eth Context", "timetamp", context.Timestamp, "blocknumber", context.BlockNumber)
+ s.SetLatestL1BlockNumber(context.BlockNumber)
+ s.SetLatestL1Timestamp(context.Timestamp)
}
- queueOrigin := types.QueueOrigin(meta.QueueOrigin.Uint64())
- fixed := types.NewTransactionMeta(meta.L1BlockNumber, meta.L1Timestamp, meta.L1MessageSender, meta.SignatureHashType, queueOrigin, meta.Index, meta.QueueIndex, raw)
- tx.SetTransactionMeta(fixed)
- return tx
+ return nil
+}
+
+// SubscribeNewTxsEvent registers a subscription of NewTxsEvent and
+// starts sending event to the given channel.
+func (s *SyncService) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription {
+ return s.scope.Track(s.txFeed.Subscribe(ch))
+}
+
+func stringify(i *uint64) string {
+ if i == nil {
+ return ""
+ }
+ return strconv.FormatUint(*i, 10)
+}
+
+// IngestTransaction should only be called by trusted parties as it skips all
+// validation and applies the transaction
+func (s *SyncService) IngestTransaction(tx *types.Transaction) error {
+ return s.applyTransaction(tx)
}
diff --git a/l2geth/rollup/sync_service_test.go b/l2geth/rollup/sync_service_test.go
index f5e2ea175bfa..8d5b57dfd16a 100644
--- a/l2geth/rollup/sync_service_test.go
+++ b/l2geth/rollup/sync_service_test.go
@@ -2,11 +2,14 @@ package rollup
import (
"context"
+ "crypto/rand"
"errors"
"fmt"
"math/big"
"reflect"
+ "sync"
"testing"
+ "time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus/ethash"
@@ -14,7 +17,9 @@ import (
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth/gasprice"
+ "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/params"
)
@@ -111,14 +116,13 @@ func TestSyncServiceTransactionEnqueued(t *testing.T) {
// The queue index of the L1 to L2 transaction
queueIndex := uint64(0)
// The index in the ctc
- index := uint64(5)
+ index := uint64(0)
tx := types.NewTransaction(0, target, big.NewInt(0), gasLimit, big.NewInt(0), data)
txMeta := types.NewTransactionMeta(
l1BlockNumber,
timestamp,
&l1TxOrigin,
- types.SighashEIP155,
types.QueueOriginL1ToL2,
&index,
&queueIndex,
@@ -133,14 +137,16 @@ func TestSyncServiceTransactionEnqueued(t *testing.T) {
})
// Run an iteration of the eloop
- err = service.sequence()
- if err != nil {
- t.Fatal("sequencing failed", err)
- }
-
+ err = nil
+ go func() {
+ err = service.syncQueueToTip()
+ }()
// Wait for the tx to be confirmed into the chain and then
// make sure it is the transactions that was set up with in the mockclient
event := <-txCh
+ if err != nil {
+ t.Fatal("sequencing failed", err)
+ }
if len(event.Txs) != 1 {
t.Fatal("Unexpected number of transactions")
}
@@ -151,16 +157,340 @@ func TestSyncServiceTransactionEnqueued(t *testing.T) {
}
}
+func TestTransactionToTipNoIndex(t *testing.T) {
+ service, txCh, _, err := newTestSyncService(false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Get a reference to the current next index to compare with the index that
+ // is set to the transaction that is ingested
+ nextIndex := service.GetNextIndex()
+
+ timestamp := uint64(24)
+ target := common.HexToAddress("0x04668ec2f57cc15c381b461b9fedab5d451c8f7f")
+ l1TxOrigin := common.HexToAddress("0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8")
+ gasLimit := uint64(66)
+ data := []byte{0x02, 0x92}
+ l1BlockNumber := big.NewInt(100)
+
+ tx := types.NewTransaction(0, target, big.NewInt(0), gasLimit, big.NewInt(0), data)
+ meta := types.NewTransactionMeta(
+ l1BlockNumber,
+ timestamp,
+ &l1TxOrigin,
+ types.QueueOriginL1ToL2,
+ nil, // The index is `nil`, expect it to be set afterwards
+ nil,
+ nil,
+ )
+ tx.SetTransactionMeta(meta)
+
+ go func() {
+ err = service.applyTransactionToTip(tx)
+ }()
+ event := <-txCh
+ if err != nil {
+ t.Fatal("Cannot apply transaction to the tip")
+ }
+ confirmed := event.Txs[0]
+ // The transaction was applied without an index so the chain gave it the
+ // next index
+ index := confirmed.GetMeta().Index
+ if index == nil {
+ t.Fatal("Did not set index after applying tx to tip")
+ }
+ if *index != *service.GetLatestIndex() {
+ t.Fatal("Incorrect latest index")
+ }
+ if *index != nextIndex {
+ t.Fatal("Incorrect index")
+ }
+}
+
+func TestTransactionToTipTimestamps(t *testing.T) {
+ service, txCh, _, err := newTestSyncService(false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Create two mock transactions with `nil` indices. This will allow
+ // assertions around the indices being updated correctly. Set the timestamp
+ // to 1 and 2 and assert that the timestamps in the sync service are updated
+ // correctly
+ tx1 := setMockTxL1Timestamp(mockTx(), 1)
+ tx2 := setMockTxL1Timestamp(mockTx(), 2)
+
+ txs := []*types.Transaction{
+ tx1,
+ tx2,
+ }
+
+ for _, tx := range txs {
+ nextIndex := service.GetNextIndex()
+
+ go func() {
+ err = service.applyTransactionToTip(tx)
+ }()
+ event := <-txCh
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ conf := event.Txs[0]
+ // The index should be set to the next
+ if conf.GetMeta().Index == nil {
+ t.Fatal("Index is nil")
+ }
+ // The index that the sync service is tracking should be updated
+ if *conf.GetMeta().Index != *service.GetLatestIndex() {
+ t.Fatal("index on the service was not updated")
+ }
+ // The indexes should be incrementing by 1
+ if *conf.GetMeta().Index != nextIndex {
+ t.Fatalf("Mismatched index: got %d, expect %d", *conf.GetMeta().Index, nextIndex)
+ }
+ // The tx timestamp should be setting the services timestamp
+ if conf.L1Timestamp() != service.GetLatestL1Timestamp() {
+ t.Fatal("Mismatched timestamp")
+ }
+ }
+
+ // Send a transaction with no timestamp and then let it be updated
+ // by the sync service. This will prevent monotonicity errors as well
+ // as give timestamps to queue origin sequencer transactions
+ ts := service.GetLatestL1Timestamp()
+ tx3 := setMockTxL1Timestamp(mockTx(), 0)
+ go func() {
+ err = service.applyTransactionToTip(tx3)
+ }()
+ result := <-txCh
+ service.chainHeadCh <- core.ChainHeadEvent{}
+
+ if result.Txs[0].L1Timestamp() != ts {
+ t.Fatal("Timestamp not updated correctly")
+ }
+}
+
+func TestApplyIndexedTransaction(t *testing.T) {
+ service, txCh, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Create three transactions, two of which have a duplicate index.
+ // The first two transactions can be ingested without a problem and the
+ // third transaction has a duplicate index so it will not be ingested.
+ // Expect an error for the third transaction and expect the SyncService
+ // global index to be updated with the first two transactions
+ tx0 := setMockTxIndex(mockTx(), 0)
+ tx1 := setMockTxIndex(mockTx(), 1)
+ tx1a := setMockTxIndex(mockTx(), 1)
+
+ go func() {
+ err = service.applyIndexedTransaction(tx0)
+ }()
+ <-txCh
+ if err != nil {
+ t.Fatal(err)
+ }
+ if *tx0.GetMeta().Index != *service.GetLatestIndex() {
+ t.Fatal("Latest index mismatch")
+ }
+
+ go func() {
+ err = service.applyIndexedTransaction(tx1)
+ }()
+ <-txCh
+ if err != nil {
+ t.Fatal(err)
+ }
+ if *tx1.GetMeta().Index != *service.GetLatestIndex() {
+ t.Fatal("Latest index mismatch")
+ }
+
+ err = service.applyIndexedTransaction(tx1a)
+ if err == nil {
+ t.Fatal(err)
+ }
+}
+
+func TestApplyBatchedTransaction(t *testing.T) {
+ service, txCh, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Create a transactoin with the index of 0
+ tx0 := setMockTxIndex(mockTx(), 0)
+
+ // Ingest through applyBatchedTransaction which should set the latest
+ // verified index to the index of the transaction
+ go func() {
+ err = service.applyBatchedTransaction(tx0)
+ }()
+ service.chainHeadCh <- core.ChainHeadEvent{}
+ <-txCh
+
+ // Catch race conditions with the database write
+ wg := new(sync.WaitGroup)
+ wg.Add(1)
+ go func() {
+ for {
+ if service.GetLatestVerifiedIndex() != nil {
+ wg.Done()
+ return
+ }
+ time.Sleep(100 * time.Millisecond)
+ }
+ }()
+ wg.Wait()
+
+ // Assert that the verified index is the same as the transaction index
+ if *tx0.GetMeta().Index != *service.GetLatestVerifiedIndex() {
+ t.Fatal("Latest verified index mismatch")
+ }
+}
+
+func TestIsAtTip(t *testing.T) {
+ service, _, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ data := []struct {
+ tip *uint64
+ get indexGetter
+ expect bool
+ err error
+ }{
+ {
+ tip: newUint64(1),
+ get: func() (*uint64, error) {
+ return newUint64(1), nil
+ },
+ expect: true,
+ err: nil,
+ },
+ {
+ tip: newUint64(0),
+ get: func() (*uint64, error) {
+ return newUint64(1), nil
+ },
+ expect: false,
+ err: nil,
+ },
+ {
+ tip: newUint64(1),
+ get: func() (*uint64, error) {
+ return newUint64(0), nil
+ },
+ expect: false,
+ err: errShortRemoteTip,
+ },
+ {
+ tip: nil,
+ get: func() (*uint64, error) {
+ return nil, nil
+ },
+ expect: true,
+ err: nil,
+ },
+ {
+ tip: nil,
+ get: func() (*uint64, error) {
+ return nil, errElementNotFound
+ },
+ expect: true,
+ err: nil,
+ },
+ {
+ tip: newUint64(0),
+ get: func() (*uint64, error) {
+ return nil, errElementNotFound
+ },
+ expect: false,
+ err: nil,
+ },
+ }
+
+ for _, d := range data {
+ isAtTip, err := service.isAtTip(d.tip, d.get)
+ if isAtTip != d.expect {
+ t.Fatal("expected does not match")
+ }
+ if !errors.Is(err, d.err) {
+ t.Fatal("error no match")
+ }
+ }
+}
+
+func TestSyncQueue(t *testing.T) {
+ service, txCh, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ setupMockClient(service, map[string]interface{}{
+ "GetEnqueue": []*types.Transaction{
+ setMockQueueIndex(mockTx(), 0),
+ setMockQueueIndex(mockTx(), 1),
+ setMockQueueIndex(mockTx(), 2),
+ setMockQueueIndex(mockTx(), 3),
+ },
+ })
+
+ var tip *uint64
+ go func() {
+ tip, err = service.syncQueue()
+ }()
+
+ for i := 0; i < 4; i++ {
+ service.chainHeadCh <- core.ChainHeadEvent{}
+ event := <-txCh
+ tx := event.Txs[0]
+ if *tx.GetMeta().QueueIndex != uint64(i) {
+ t.Fatal("queue index mismatch")
+ }
+ }
+
+ wg := new(sync.WaitGroup)
+ wg.Add(1)
+ go func() {
+ for {
+ if tip != nil {
+ wg.Done()
+ return
+ }
+ time.Sleep(100 * time.Millisecond)
+ }
+ }()
+ wg.Wait()
+ if tip == nil {
+ t.Fatal("tip is nil")
+ }
+ // There were a total of 4 transactions synced and the indexing starts at 0
+ if *service.GetLatestIndex() != 3 {
+ t.Fatalf("Latest index mismatch")
+ }
+ // All of the transactions are `enqueue()`s
+ if *service.GetLatestEnqueueIndex() != 3 {
+ t.Fatal("Latest queue index mismatch")
+ }
+ if *tip != 3 {
+ t.Fatal("Tip mismatch")
+ }
+}
+
func TestSyncServiceL1GasPrice(t *testing.T) {
service, _, _, err := newTestSyncService(true)
setupMockClient(service, map[string]interface{}{})
- service.RollupGpo = gasprice.NewRollupOracle(big.NewInt(0), big.NewInt(0))
if err != nil {
t.Fatal(err)
}
- gasBefore, err := service.RollupGpo.SuggestDataPrice(context.Background())
+ gasBefore, err := service.RollupGpo.SuggestL1GasPrice(context.Background())
if err != nil {
t.Fatal(err)
}
@@ -172,16 +502,141 @@ func TestSyncServiceL1GasPrice(t *testing.T) {
// Update the gas price
service.updateL1GasPrice()
- gasAfter, err := service.RollupGpo.SuggestDataPrice(context.Background())
+ gasAfter, err := service.RollupGpo.SuggestL1GasPrice(context.Background())
if err != nil {
t.Fatal(err)
}
- if gasAfter.Cmp(big.NewInt(100*int64(params.GWei))) != 0 {
+ expect, _ := service.client.GetL1GasPrice()
+ if gasAfter.Cmp(expect) != 0 {
t.Fatal("expected 100 gas price, got", gasAfter)
}
}
+func TestSyncServiceL2GasPrice(t *testing.T) {
+ service, _, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ price, err := service.RollupGpo.SuggestL2GasPrice(context.Background())
+ if err != nil {
+ t.Fatal("Cannot fetch execution price")
+ }
+
+ if price.Cmp(common.Big0) != 0 {
+ t.Fatal("Incorrect gas price")
+ }
+
+ state, err := service.bc.State()
+ if err != nil {
+ t.Fatal("Cannot get state db")
+ }
+ l2GasPrice := big.NewInt(100000000000)
+ state.SetState(l2GasPriceOracleAddress, l2GasPriceSlot, common.BigToHash(l2GasPrice))
+ _, _ = state.Commit(false)
+
+ service.updateL2GasPrice(state)
+
+ post, err := service.RollupGpo.SuggestL2GasPrice(context.Background())
+ if err != nil {
+ t.Fatal("Cannot fetch execution price")
+ }
+
+ if l2GasPrice.Cmp(post) != 0 {
+ t.Fatal("Gas price not updated")
+ }
+}
+
+func TestSyncServiceGasPriceOracleOwnerAddress(t *testing.T) {
+ service, _, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+ // newTestSyncService doesn't set the initial owner address
+ // so it initializes to the zero value
+ owner := service.GasPriceOracleOwnerAddress()
+ if *owner != (common.Address{}) {
+ t.Fatal("address not initialized to 0")
+ }
+
+ state, err := service.bc.State()
+ if err != nil {
+ t.Fatal("cannot get state db")
+ }
+
+ // Update the owner in the state to a non zero address
+ updatedOwner := common.HexToAddress("0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8")
+ state.SetState(l2GasPriceOracleAddress, l2GasPriceOracleOwnerSlot, updatedOwner.Hash())
+ hash, _ := state.Commit(false)
+
+ // Update the cache based on the latest state root
+ if err := service.updateGasPriceOracleCache(&hash); err != nil {
+ t.Fatal(err)
+ }
+ got := service.GasPriceOracleOwnerAddress()
+ if *got != updatedOwner {
+ t.Fatalf("mismatch:\ngot %s\nexpected %s", got.Hex(), updatedOwner.Hex())
+ }
+}
+
+// Only the gas price oracle owner can send 0 gas price txs
+// when fees are enforced
+func TestFeeGasPriceOracleOwnerTransactions(t *testing.T) {
+ service, _, _, err := newTestSyncService(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+ signer := types.NewEIP155Signer(big.NewInt(420))
+
+ // Fees must be enforced for this test
+ service.enforceFees = true
+ // Generate a key
+ key, _ := crypto.GenerateKey()
+ owner := crypto.PubkeyToAddress(key.PublicKey)
+ // Set as the owner on the SyncService
+ service.gasPriceOracleOwnerAddress = owner
+ if owner != *service.GasPriceOracleOwnerAddress() {
+ t.Fatal("owner mismatch")
+ }
+ // Create a mock transaction and sign using the
+ // owner's key
+ tx := mockTx()
+ // Make sure the gas price is 0 on the dummy tx
+ if tx.GasPrice().Cmp(common.Big0) != 0 {
+ t.Fatal("gas price not 0")
+ }
+ // Sign the dummy tx with the owner key
+ signedTx, err := types.SignTx(tx, signer, key)
+ if err != nil {
+ t.Fatal(err)
+ }
+ // Verify the fee of the signed tx, ensure it does not error
+ if err := service.verifyFee(signedTx); err != nil {
+ t.Fatal(err)
+ }
+ // Generate a new random key that is not the owner
+ badKey, _ := crypto.GenerateKey()
+ // Ensure that it is not the owner
+ if owner == crypto.PubkeyToAddress(badKey.PublicKey) {
+ t.Fatal("key mismatch")
+ }
+ // Sign the transaction with the bad key
+ badSignedTx, err := types.SignTx(tx, signer, badKey)
+ if err != nil {
+ t.Fatal(err)
+ }
+ // Attempt to verify the fee of the bad tx
+ // It should error and be a errZeroGasPriceTx
+ if err := service.verifyFee(badSignedTx); err != nil {
+ if !errors.Is(errZeroGasPriceTx, err) {
+ t.Fatal(err)
+ }
+ } else {
+ t.Fatal("err is nil")
+ }
+}
+
// Pass true to set as a verifier
func TestSyncServiceSync(t *testing.T) {
service, txCh, sub, err := newTestSyncService(true)
@@ -203,7 +658,6 @@ func TestSyncServiceSync(t *testing.T) {
l1BlockNumber,
timestamp,
&l1TxOrigin,
- types.SighashEIP155,
types.QueueOriginL1ToL2,
&index,
&queueIndex,
@@ -217,12 +671,15 @@ func TestSyncServiceSync(t *testing.T) {
},
})
- err = service.verify()
+ err = nil
+ go func() {
+ err = service.syncTransactionsToTip()
+ }()
+ event := <-txCh
if err != nil {
t.Fatal("verification failed", err)
}
- event := <-txCh
if len(event.Txs) != 1 {
t.Fatal("Unexpected number of transactions")
}
@@ -252,7 +709,6 @@ func TestInitializeL1ContextPostGenesis(t *testing.T) {
l1BlockNumber,
timestamp,
&l1TxOrigin,
- types.SighashEIP155,
types.QueueOriginL1ToL2,
&index,
&queueIndex,
@@ -299,7 +755,54 @@ func TestInitializeL1ContextPostGenesis(t *testing.T) {
}
}
-func newTestSyncService(isVerifier bool) (*SyncService, chan core.NewTxsEvent, event.Subscription, error) {
+func TestBadFeeThresholds(t *testing.T) {
+ // Create the deps for the sync service
+ cfg, txPool, chain, db, err := newTestSyncServiceDeps(false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ tests := map[string]struct {
+ thresholdUp *big.Float
+ thresholdDown *big.Float
+ err error
+ }{
+ "nil-values": {
+ thresholdUp: nil,
+ thresholdDown: nil,
+ err: nil,
+ },
+ "good-values": {
+ thresholdUp: new(big.Float).SetFloat64(2),
+ thresholdDown: new(big.Float).SetFloat64(0.8),
+ err: nil,
+ },
+ "bad-value-up": {
+ thresholdUp: new(big.Float).SetFloat64(0.8),
+ thresholdDown: nil,
+ err: errBadConfig,
+ },
+ "bad-value-down": {
+ thresholdUp: nil,
+ thresholdDown: new(big.Float).SetFloat64(1.1),
+ err: errBadConfig,
+ },
+ }
+
+ for name, tt := range tests {
+ t.Run(name, func(t *testing.T) {
+ cfg.FeeThresholdDown = tt.thresholdDown
+ cfg.FeeThresholdUp = tt.thresholdUp
+
+ _, err := NewSyncService(context.Background(), cfg, txPool, chain, db)
+ if !errors.Is(err, tt.err) {
+ t.Fatalf("%s: %s", name, err)
+ }
+ })
+ }
+}
+
+func newTestSyncServiceDeps(isVerifier bool) (Config, *core.TxPool, *core.BlockChain, ethdb.Database, error) {
chainCfg := params.AllEthashProtocolChanges
chainID := big.NewInt(420)
chainCfg.ChainID = chainID
@@ -309,7 +812,7 @@ func newTestSyncService(isVerifier bool) (*SyncService, chan core.NewTxsEvent, e
_ = new(core.Genesis).MustCommit(db)
chain, err := core.NewBlockChain(db, nil, chainCfg, engine, vm.Config{}, nil)
if err != nil {
- return nil, nil, nil, fmt.Errorf("Cannot initialize blockchain: %w", err)
+ return Config{}, nil, nil, nil, fmt.Errorf("Cannot initialize blockchain: %w", err)
}
chaincfg := params.ChainConfig{ChainID: chainID}
@@ -320,13 +823,22 @@ func newTestSyncService(isVerifier bool) (*SyncService, chan core.NewTxsEvent, e
// Set as an empty string as this is a dummy value anyways.
// The client needs to be mocked with a mockClient
RollupClientHttp: "",
+ Backend: BackendL2,
}
+ return cfg, txPool, chain, db, nil
+}
+func newTestSyncService(isVerifier bool) (*SyncService, chan core.NewTxsEvent, event.Subscription, error) {
+ cfg, txPool, chain, db, err := newTestSyncServiceDeps(isVerifier)
+ if err != nil {
+ return nil, nil, nil, fmt.Errorf("Cannot initialize syncservice: %w", err)
+ }
service, err := NewSyncService(context.Background(), cfg, txPool, chain, db)
if err != nil {
return nil, nil, nil, fmt.Errorf("Cannot initialize syncservice: %w", err)
}
+ service.RollupGpo = gasprice.NewRollupOracle()
txCh := make(chan core.NewTxsEvent, 1)
sub := service.SubscribeNewTxsEvent(txCh)
@@ -334,19 +846,21 @@ func newTestSyncService(isVerifier bool) (*SyncService, chan core.NewTxsEvent, e
}
type mockClient struct {
- getEnqueueCallCount int
- getEnqueue []*types.Transaction
- getTransactionCallCount int
- getTransaction []*types.Transaction
- getEthContextCallCount int
- getEthContext []*EthContext
- getLatestEthContext *EthContext
+ getEnqueueCallCount int
+ getEnqueue []*types.Transaction
+ getTransactionCallCount int
+ getTransaction []*types.Transaction
+ getEthContextCallCount int
+ getEthContext []*EthContext
+ getLatestEthContext *EthContext
+ getLatestEnqueueIndex []func() (*uint64, error)
+ getLatestEnqueueIndexCallCount int
}
func setupMockClient(service *SyncService, responses map[string]interface{}) {
client := newMockClient(responses)
service.client = client
- service.RollupGpo = gasprice.NewRollupOracle(big.NewInt(0), big.NewInt(0))
+ service.RollupGpo = gasprice.NewRollupOracle()
}
func newMockClient(responses map[string]interface{}) *mockClient {
@@ -354,6 +868,7 @@ func newMockClient(responses map[string]interface{}) *mockClient {
getTransactionResponses := []*types.Transaction{}
getEthContextResponses := []*EthContext{}
getLatestEthContextResponse := &EthContext{}
+ getLatestEnqueueIndexResponses := []func() (*uint64, error){}
enqueue, ok := responses["GetEnqueue"]
if ok {
@@ -371,11 +886,17 @@ func newMockClient(responses map[string]interface{}) *mockClient {
if ok {
getLatestEthContextResponse = getLatestCtx.(*EthContext)
}
+ getLatestEnqueueIdx, ok := responses["GetLatestEnqueueIndex"]
+ if ok {
+ getLatestEnqueueIndexResponses = getLatestEnqueueIdx.([]func() (*uint64, error))
+ }
+
return &mockClient{
- getEnqueue: getEnqueueResponses,
- getTransaction: getTransactionResponses,
- getEthContext: getEthContextResponses,
- getLatestEthContext: getLatestEthContextResponse,
+ getEnqueue: getEnqueueResponses,
+ getTransaction: getTransactionResponses,
+ getEthContext: getEthContextResponses,
+ getLatestEthContext: getLatestEthContextResponse,
+ getLatestEnqueueIndex: getLatestEnqueueIndexResponses,
}
}
@@ -390,23 +911,23 @@ func (m *mockClient) GetEnqueue(index uint64) (*types.Transaction, error) {
func (m *mockClient) GetLatestEnqueue() (*types.Transaction, error) {
if len(m.getEnqueue) == 0 {
- return &types.Transaction{}, errors.New("")
+ return &types.Transaction{}, errors.New("enqueue not found")
}
return m.getEnqueue[len(m.getEnqueue)-1], nil
}
-func (m *mockClient) GetTransaction(index uint64) (*types.Transaction, error) {
+func (m *mockClient) GetTransaction(index uint64, backend Backend) (*types.Transaction, error) {
if m.getTransactionCallCount < len(m.getTransaction) {
tx := m.getTransaction[m.getTransactionCallCount]
m.getTransactionCallCount++
return tx, nil
}
- return nil, errors.New("")
+ return nil, fmt.Errorf("Cannot get transaction: mocks (%d), call count (%d)", len(m.getTransaction), m.getTransactionCallCount)
}
-func (m *mockClient) GetLatestTransaction() (*types.Transaction, error) {
+func (m *mockClient) GetLatestTransaction(backend Backend) (*types.Transaction, error) {
if len(m.getTransaction) == 0 {
- return nil, errors.New("")
+ return nil, errors.New("No transactions")
}
return m.getTransaction[len(m.getTransaction)-1], nil
}
@@ -417,7 +938,7 @@ func (m *mockClient) GetEthContext(index uint64) (*EthContext, error) {
m.getEthContextCallCount++
return ctx, nil
}
- return nil, errors.New("")
+ return nil, errors.New("Cannot get eth context")
}
func (m *mockClient) GetLatestEthContext() (*EthContext, error) {
@@ -425,7 +946,7 @@ func (m *mockClient) GetLatestEthContext() (*EthContext, error) {
}
func (m *mockClient) GetLastConfirmedEnqueue() (*types.Transaction, error) {
- return nil, nil
+ return nil, errElementNotFound
}
func (m *mockClient) GetLatestTransactionBatch() (*Batch, []*types.Transaction, error) {
@@ -436,12 +957,89 @@ func (m *mockClient) GetTransactionBatch(index uint64) (*Batch, []*types.Transac
return nil, nil, nil
}
-func (m *mockClient) SyncStatus() (*SyncStatus, error) {
+func (m *mockClient) SyncStatus(backend Backend) (*SyncStatus, error) {
return &SyncStatus{
Syncing: false,
}, nil
}
func (m *mockClient) GetL1GasPrice() (*big.Int, error) {
- return big.NewInt(100 * int64(params.GWei)), nil
+ price := big.NewInt(1)
+ return price, nil
+}
+
+func (m *mockClient) GetLatestEnqueueIndex() (*uint64, error) {
+ enqueue, err := m.GetLatestEnqueue()
+ if err != nil {
+ return nil, err
+ }
+ if enqueue == nil {
+ return nil, errElementNotFound
+ }
+ return enqueue.GetMeta().QueueIndex, nil
+}
+
+func (m *mockClient) GetLatestTransactionBatchIndex() (*uint64, error) {
+ return nil, nil
+}
+
+func (m *mockClient) GetLatestTransactionIndex(backend Backend) (*uint64, error) {
+ tx, err := m.GetLatestTransaction(backend)
+ if err != nil {
+ return nil, err
+ }
+ return tx.GetMeta().Index, nil
+}
+
+func mockTx() *types.Transaction {
+ address := make([]byte, 20)
+ rand.Read(address)
+
+ target := common.BytesToAddress(address)
+ timestamp := uint64(0)
+
+ rand.Read(address)
+ l1TxOrigin := common.BytesToAddress(address)
+
+ gasLimit := uint64(0)
+ data := []byte{0x00, 0x00}
+ l1BlockNumber := big.NewInt(0)
+
+ tx := types.NewTransaction(0, target, big.NewInt(0), gasLimit, big.NewInt(0), data)
+ meta := types.NewTransactionMeta(
+ l1BlockNumber,
+ timestamp,
+ &l1TxOrigin,
+ types.QueueOriginSequencer,
+ nil,
+ nil,
+ nil,
+ )
+ tx.SetTransactionMeta(meta)
+ return tx
+}
+
+func setMockTxL1Timestamp(tx *types.Transaction, ts uint64) *types.Transaction {
+ meta := tx.GetMeta()
+ meta.L1Timestamp = ts
+ tx.SetTransactionMeta(meta)
+ return tx
+}
+
+func setMockTxIndex(tx *types.Transaction, index uint64) *types.Transaction {
+ meta := tx.GetMeta()
+ meta.Index = &index
+ tx.SetTransactionMeta(meta)
+ return tx
+}
+
+func setMockQueueIndex(tx *types.Transaction, index uint64) *types.Transaction {
+ meta := tx.GetMeta()
+ meta.QueueIndex = &index
+ tx.SetTransactionMeta(meta)
+ return tx
+}
+
+func newUint64(n uint64) *uint64 {
+ return &n
}
diff --git a/l2geth/rollup/types.go b/l2geth/rollup/types.go
index b3dbdbbce99f..571a3d902ece 100644
--- a/l2geth/rollup/types.go
+++ b/l2geth/rollup/types.go
@@ -2,11 +2,60 @@ package rollup
import (
"bytes"
+ "fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
)
+// OVMContext represents the blocknumber and timestamp
+// that exist during L2 execution
+type OVMContext struct {
+ blockNumber uint64
+ timestamp uint64
+}
+
+// Backend represents the type of transactions that are being synced.
+// The different types have different security models.
+type Backend uint
+
+// String implements the Stringer interface
+func (s Backend) String() string {
+ switch s {
+ case BackendL1:
+ return "l1"
+ case BackendL2:
+ return "l2"
+ default:
+ return ""
+ }
+}
+
+// NewBackend creates a Backend from a human readable string
+func NewBackend(typ string) (Backend, error) {
+ switch typ {
+ case "l1":
+ return BackendL1, nil
+ case "l2":
+ return BackendL2, nil
+ default:
+ return 0, fmt.Errorf("Unknown Backend: %s", typ)
+ }
+}
+
+const (
+ // BackendL1 Backend involves syncing transactions that have been batched to
+ // Layer One. Once the transactions have been batched to L1, they cannot be
+ // removed assuming that they are not reorganized out of the chain.
+ BackendL1 Backend = iota
+ // BackendL2 Backend involves syncing transactions from the sequencer,
+ // meaning that the transactions may have not been batched to Layer One yet.
+ // This gives higher latency access to the sequencer data but no guarantees
+ // around the transactions as they have not been submitted via a batch to
+ // L1.
+ BackendL2
+)
+
func isCtcTxEqual(a, b *types.Transaction) bool {
if a.To() == nil && b.To() != nil {
if !bytes.Equal(b.To().Bytes(), common.Address{}.Bytes()) {
diff --git a/l2geth/scripts/start.sh b/l2geth/scripts/start.sh
index e7d7fad14e86..a38f6771651d 100755
--- a/l2geth/scripts/start.sh
+++ b/l2geth/scripts/start.sh
@@ -4,14 +4,15 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
REPO=$DIR/..
IS_VERIFIER=
+ROLLUP_SYNC_SERVICE_ENABLE=true
DATADIR=$HOME/.ethereum
-TARGET_GAS_LIMIT=9000000
+TARGET_GAS_LIMIT=11000000
CHAIN_ID=10
-ETH1_CTC_DEPLOYMENT_HEIGHT=12207792
-ETH1_L1_GATEWAY_ADDRESS=0xF20C38fCdDF0C790319Fd7431d17ea0c2bC9959c
-ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS=0xD1EC7d40CCd01EB7A305b94cBa8AB6D17f6a9eFE
+ETH1_CTC_DEPLOYMENT_HEIGHT=12410807
+ETH1_L1_STANDARD_BRIDGE_ADDRESS=0xe681F80966a8b1fFadECf8068bD6F99034791c95
+ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS=0x902e5fF5A99C4eC1C21bbab089fdabE32EF0A5DF
ADDRESS_MANAGER_OWNER_ADDRESS=0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A
-ROLLUP_STATE_DUMP_PATH=https://storage.googleapis.com/optimism/mainnet/3.json
+ROLLUP_STATE_DUMP_PATH=https://storage.googleapis.com/optimism/mainnet/4.json
ROLLUP_CLIENT_HTTP=http://localhost:7878
ROLLUP_POLL_INTERVAL=15s
ROLLUP_TIMESTAMP_REFRESH=3m
@@ -19,6 +20,7 @@ CACHE=1024
RPC_PORT=8545
WS_PORT=8546
VERBOSITY=3
+ROLLUP_BACKEND=l1
USAGE="
Start the Sequencer or Verifier with most configuration pre-set.
@@ -31,6 +33,7 @@ CLI Arguments:
--eth1.chainid - eth1 chain id
--eth1.ctcdeploymentheight - eth1 ctc deploy height
--eth1.l1crossdomainmessengeraddress - eth1 l1 xdomain messenger address
+ --eth1.l1feewalletaddress - eth l1 fee wallet address
--rollup.statedumppath - http path to the initial state dump
--rollup.clienthttp - rollup client http
--rollup.pollinterval - polling interval for the rollup client
@@ -49,6 +52,10 @@ while (( "$#" )); do
IS_VERIFIER=true
shift 1
;;
+ --rollup.disablesyncservice)
+ ROLLUP_SYNC_SERVICE_ENABLE=
+ shift 1
+ ;;
--verbosity)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
VERBOSITY="$2"
@@ -103,27 +110,27 @@ while (( "$#" )); do
exit 1
fi
;;
- --eth1.l1gatewayaddress)
+ --eth1.l1crossdomainmessengeraddress)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
- ETH1_L1_GATEWAY_ADDRESS="$2"
+ ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS="$2"
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
- --eth1.l1crossdomainmessengeraddress)
+ --eth1.l1feewalletaddress)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
- ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS="$2"
+ ETH1_L1_FEE_WALLET_ADDRESS="$2"
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
- --eth1.l1ethgatewayaddress)
+ --eth1.l1standardbridgeaddress)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
- ETH1_L1_ETH_GATEWAY_ADDRESS="$2"
+ ETH1_L1_STANDARD_BRIDGE_ADDRESS="$2"
shift 2
else
echo "Error: Argument for $1 is missing" >&2
@@ -184,6 +191,15 @@ while (( "$#" )); do
exit 1
fi
;;
+ --rollup.backend)
+ if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
+ ROLLUP_BACKEND="$2"
+ shift 2
+ else
+ echo "Error: Argument for $1 is missing" >&2
+ exit 1
+ fi
+ ;;
--cache)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
CACHE="$2"
@@ -210,16 +226,20 @@ while (( "$#" )); do
done
cmd="$REPO/build/bin/geth"
-cmd="$cmd --eth1.syncservice"
+if [[ ! -z "$ROLLUP_SYNC_SERVICE_ENABLE" ]]; then
+ cmd="$cmd --eth1.syncservice"
+fi
cmd="$cmd --datadir $DATADIR"
cmd="$cmd --eth1.l1crossdomainmessengeraddress $ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS"
+cmd="$cmd --eth1.l1feewalletaddress $ETH1_L1_FEE_WALLET_ADDRESS"
cmd="$cmd --rollup.addressmanagerowneraddress $ADDRESS_MANAGER_OWNER_ADDRESS"
cmd="$cmd --rollup.statedumppath $ROLLUP_STATE_DUMP_PATH"
cmd="$cmd --eth1.ctcdeploymentheight $ETH1_CTC_DEPLOYMENT_HEIGHT"
-cmd="$cmd --eth1.l1ethgatewayaddress $ETH1_L1_GATEWAY_ADDRESS"
+cmd="$cmd --eth1.l1standardbridgeaddress $ETH1_L1_STANDARD_BRIDGE_ADDRESS"
cmd="$cmd --rollup.clienthttp $ROLLUP_CLIENT_HTTP"
cmd="$cmd --rollup.pollinterval $ROLLUP_POLL_INTERVAL"
cmd="$cmd --rollup.timestamprefresh $ROLLUP_TIMESTAMP_REFRESH"
+cmd="$cmd --rollup.backend $ROLLUP_BACKEND"
cmd="$cmd --cache $CACHE"
cmd="$cmd --rpc"
cmd="$cmd --dev"
diff --git a/l2geth/signer/core/types.go b/l2geth/signer/core/types.go
index 28ccea210c34..c9f2b2eb3128 100644
--- a/l2geth/signer/core/types.go
+++ b/l2geth/signer/core/types.go
@@ -78,10 +78,9 @@ type SendTxArgs struct {
Data *hexutil.Bytes `json:"data"`
Input *hexutil.Bytes `json:"input"`
- L1MessageSender *common.MixedcaseAddress `json:"l1MessageSender"`
- L1BlockNumber *big.Int `json:"l1BlockNumber"`
- SignatureHashType types.SignatureHashType `json:"signatureHashType"`
- QueueOrigin types.QueueOrigin `json:"queueOrigin"`
+ L1MessageSender *common.MixedcaseAddress `json:"l1MessageSender"`
+ L1BlockNumber *big.Int `json:"l1BlockNumber"`
+ QueueOrigin types.QueueOrigin `json:"queueOrigin"`
}
func (args SendTxArgs) String() string {
@@ -111,7 +110,7 @@ func (args *SendTxArgs) toTransaction() *types.Transaction {
}
tx := types.NewTransaction(uint64(args.Nonce), args.To.Address(), (*big.Int)(&args.Value), (uint64)(args.Gas), (*big.Int)(&args.GasPrice), input)
- txMeta := types.NewTransactionMeta(l1BlockNumber, 0, l1MessageSender, args.SignatureHashType, args.QueueOrigin, nil, nil, nil)
+ txMeta := types.NewTransactionMeta(l1BlockNumber, 0, l1MessageSender, args.QueueOrigin, nil, nil, nil)
tx.SetTransactionMeta(txMeta)
return tx
}
diff --git a/l2geth/tests/state_test_util.go b/l2geth/tests/state_test_util.go
index fd1e679ae44d..26e6607ef241 100644
--- a/l2geth/tests/state_test_util.go
+++ b/l2geth/tests/state_test_util.go
@@ -279,7 +279,7 @@ func (tx *stTransaction) toMessage(ps stPostState) (core.Message, error) {
return nil, fmt.Errorf("invalid tx data %q", dataHex)
}
- msg := types.NewMessage(from, to, tx.Nonce, value, gasLimit, tx.GasPrice, data, true, nil, nil, types.QueueOriginSequencer, 0)
+ msg := types.NewMessage(from, to, tx.Nonce, value, gasLimit, tx.GasPrice, data, true, nil, nil, types.QueueOriginSequencer)
return msg, nil
}
diff --git a/lerna.json b/lerna.json
index a2b007055136..10532dfb1a3a 100644
--- a/lerna.json
+++ b/lerna.json
@@ -2,7 +2,8 @@
"npmClient": "yarn",
"useWorkspaces": true,
"packages": [
- "packages/*"
+ "packages/*",
+ "packages/omgx/*"
],
"version": "independent"
}
diff --git a/omgx_documention/Community_Replica.md b/omgx_documention/Community_Replica.md
new file mode 100644
index 000000000000..71e449b11843
--- /dev/null
+++ b/omgx_documention/Community_Replica.md
@@ -0,0 +1,51 @@
+- [Community Replica Service](#community-replica-service)
+ * [Prerequisites](#prerequisites)
+ * [Start Replica service](#start-replica-service)
+ + [Configuration](#configuration)
+ + [Start the docker](#start-the-docker)
+ + [Common Errors](#common-errors)
+
+# Community Replica Service
+
+The `ops/docker-compose-replica-service.yml` docker-compose project runs a local replica of the OMGC Rinkeby l2geth. This service allows you run a local copy of the L2, which is useful for generating analyics for blockexplorers.
+
+## Prerequisites
+
+\- docker
+\- docker-compose
+
+## Start Replica service
+
+### Configuration
+
+Replace `INFURA_KEY` with your own key in [docker-compose-replica-service.yml](.ops/docker-compose-replica-service.yml). You can get a free Infura key from https://infura.io.
+
+### Start the docker
+
+Start the replica service via:
+
+```bash
+cd ops
+docker-compose -f docker-compose-replica-service.yml up
+```
+
+This will pull two images from docker hub:
+
+* [`data-tranport-layer`](https://hub.docker.com/layers/156092207/omgx/data-transport-layer/production-v1/images/sha256-07d4415aab46863b8c7996c1c40f6221f3ac3f697485ccc262a3a6f0478aa4fb?context=explore): service that indexes transaction data from the L1 chain and L2 chain
+
+* [`replica`](https://hub.docker.com/layers/157390249/omgx/replica/production-v1/images/sha256-fc85c0db75352a911f49ba44372e087e54bd7123963f83a11084939f75581b37?context=explore): L2 geth node running in sync mode
+
+### Common Errors
+
+If you get this:
+
+```bash
+(node:1) UnhandledPromiseRejectionWarning: Error: could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.1.0)
+```
+
+then you forgot to replace `INFURA_KEY` in this line: `DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: https://rinkeby.infura.io/v3/INFURA_KEY` with your Infura key. Your Infura key will be a string like `c655138ed943455123456789123456789c`, so the final line will look something like this:
+
+```bash
+DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: https://rinkeby.infura.io/v3/c655138ed943455123456789123456789c
+```
+
diff --git a/omgx_documention/Community_Verifier.md b/omgx_documention/Community_Verifier.md
new file mode 100644
index 000000000000..6c834d540205
--- /dev/null
+++ b/omgx_documention/Community_Verifier.md
@@ -0,0 +1,50 @@
+- [Community Verifier Service](#community-verifier-service)
+ * [Prerequisites](#prerequisites)
+ * [Start Verifier service](#start-verifier-service)
+ + [Configuration - Infura key](#configuration---infura-key)
+ + [Start the docker](#start-the-docker)
+ + [Common Errors](#common-errors)
+
+# Community Verifier Service
+
+The `ops/docker-compose-verifier-service.yml` docker-compose project runs a local Verifier of the OMGX Rinkeby l2geth. The verifier looks at transactions and computes state roots. These community-generated state roots can then be compared against the state roots submitted to the L2 by the unitary sequencer, as the starting point for detecting (and recovering from) sequencer fraud.
+
+## Prerequisites
+
+\- docker
+\- docker-compose
+
+## Start Verifier service
+
+### Configuration - Infura key
+
+Replace `INFURA_KEY` with your own key in [docker-compose-verifier-service.yml](.ops/docker-compose-verifier-service.yml). You can get a free Infura key from https://infura.io.
+
+### Start the docker
+
+Start the Verifier service via:
+
+```bash
+cd ops
+docker-compose -f docker-compose-verifier-service.yml up
+```
+
+This will pull two images from docker hub:
+
+* [`data-tranport-layer`](https://hub.docker.com/layers/156092207/omgx/data-transport-layer/production-v1/images/sha256-07d4415aab46863b8c7996c1c40f6221f3ac3f697485ccc262a3a6f0478aa4fb?context=explore): service that indexes transaction data from the L1 chain and L2 chain
+
+* [`replica`](https://hub.docker.com/layers/157390249/omgx/replica/production-v1/images/sha256-fc85c0db75352a911f49ba44372e087e54bd7123963f83a11084939f75581b37?context=explore): L2 geth node
+
+### Common Errors
+
+If you get this:
+
+```bash
+(node:1) UnhandledPromiseRejectionWarning: Error: could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.1.0)
+```
+
+then you forgot to replace `INFURA_KEY` in this line: `DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: https://rinkeby.infura.io/v3/INFURA_KEY` with your Infura key. Your Infura key will be a string like `c655138ed943455123456789123456789c`, so the final line will look something like this:
+
+```bash
+DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: https://rinkeby.infura.io/v3/c655138ed943455123456789123456789c
+```
\ No newline at end of file
diff --git a/omgx_documention/Developing_on_Windows.md b/omgx_documention/Developing_on_Windows.md
new file mode 100644
index 000000000000..f369552f665b
--- /dev/null
+++ b/omgx_documention/Developing_on_Windows.md
@@ -0,0 +1,52 @@
+# Developing for OMGX on Windows
+
+## Prequisites
+
+- User folder can't have a space
+ - A lot of the other programs we're using can't handle a space in paths.
+ So make sure there's no spaces for your users folder.
+- [Windows Terminal](#windows-terminal)
+- [Git](#git)
+- [Docker](#docker)
+- [NVM](#nvm)
+- [Yarn](#yarn)
+
+### Windows terminal
+
+Windows terminal is a great substitute for terminal on MacOS/Linux. First download windows terminal from [here](https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701#activetab=pivot:overviewtab).
+Now that you have it installed we're going to install [Ubuntu](https://ubuntu.com/tutorials/ubuntu-on-windows#1-overview). Ubuntu creates a WSL2 environment for us to develop and it's on bash! Follow all the instructions from the link it's pretty straightforward to follow this guide. Once you have Ubuntu we're going to do everything from there not from powershell or cmd because they don't have access to all the bash commands. Make sure for all the other steps that you're running Windows Terminal as an administator as it'll make everything a lot easier. To do that right click on the app and then run as administrator.
+
+### Git
+
+Git should already be installed on your Ubuntu server but in case it's not follow [this](https://www.digitalocean.com/community/tutorials/how-to-install-git-on-ubuntu-18-04-quickstart) guide to get it up and running.
+
+### Docker
+
+Install Docker from [here](https://docs.docker.com/docker-for-windows/install/). Follow through the instructions and restart your computer. If you run into this error:
+> `Hardware assisted virtualization and data execution protection must be enabled in the BIOS`
+
+You're going to want to restart your computer and hold down **esc, f1, f2, f3, f4, f8 or delete** depending on your chip. It should tell you waht to hold when you're restarting to enter your bios settings. Then you're going to want to enable virtualization from here. This setting may be hidden under advanced → CPA configuration and then virtualization. Save this and then Docker should be up and running!
+
+### NVM
+
+On your Ubuntu terminal **running as an admin** run the following command to instal cURL:
+> `sudo apt-get install curl`
+
+Then install nvm (node version manager):
+> `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash`
+
+To verify installation, enter: `command -v nvm`. This should return 'nvm', if you receive 'command not found' or no response at all, close your current terminal, reopen it, and try again.
+
+You can then use `nvm install [node-version]` to install whatever version of node you want. We recommend 14.17.3. Then use `nvm use [node-version]` to use that as your default. You can read more about NVM [here](https://github.com/nvm-sh/nvm). If you ran into any issues installing a lot of troubleshooting options can be found there as well.
+
+### Yarn
+
+Installing yarn is super easy with all the infrastructure we have use:
+
+>`npm install --global yarn`
+
+## All Done!
+
+You should have everything you need to follow the rest of the tutorial [here](https://github.com/omgnetwork/optimism/). Good luck and have fun developing on L2!
+
+
diff --git a/omgx_documention/Engineering_update_4.md b/omgx_documention/Engineering_update_4.md
new file mode 100644
index 000000000000..0fd6e84e227e
--- /dev/null
+++ b/omgx_documention/Engineering_update_4.md
@@ -0,0 +1,48 @@
+# DRAFT Engineering update #4
+
+- [Engineering update #4](#engineering-update--4)
+ * [1. Optimism Platform/Foundation](#1-optimism-platform-foundation)
+ * [2. Production / webscale](#2-production---webscale)
+ * [3. User experience / front end](#3-user-experience---front-end)
+ * [4. Security](#4-security)
+ * [5. Hybrid Compute](#5-hybrid-compute)
+ * [6. User and Developer Experience](#6-user-and-developer-experience)
+
+Thu June 24
+
+Greetings from your engineering team. We have been heads' down the last few weeks, to get many basic pieces for OMGX into place and stable. The most visible parts of this are an increasingly stable rinkeby testnet (https://rinkeby.omgx.network) and a working webwallet (aka gateway) with swap on/off and farming at https://webwallet.rinkeby.omgx.network.
+
+## 1. Optimism Platform/Foundation
+
+The Optimism team continues to move rapidly, whilst producing very high quality code and many new useful features and improvements, such as a simplified and more elegant approach to token bridges, as well as extensive infrastructure dedicated to making L2s financially viable, for example by providing accurate price data for the sequencer and to all users.
+
+## 2. Production / webscale
+
+* Under the hood, much effort has been devoted to web-scale production deployment of rollups - you can follow along here: https://github.com/omgnetwork/optimism/pull/46. The production rinkeby testnet currently runs on AWS EC2, which is stable but less scalable. A major next step will be to flip the switch, and transition to the AWS ECS Cloudformation system and all its associated CI/CD infrastructure and real time health monitoring. If response times start to degrade, e.g. when users are transferring funds across the chains, then we need to know about that within a few seconds, ideally.
+
+* On a more basic level, our major goal is to have a system that (1) gracefully responds to restart of one or more subservices, without getting confused, and (2) that can recover to last-known-good state automatically after unexpected failure of one of more subservices.
+
+## 3. User experience / front end
+
+* Although the webwallet works (https://webwallet.rinkeby.omgx.network), the user experience remains rudimentary. This is not just a challenge for us, but for all L2s and multichain situations. The key question is - how do we make using an L2 as easy and intuitive as possible? Two front-end engineers started last week, and are working with community members and UI designers to develop a good way to make L2s intuitive. The good news is that many people have more than one bank account (savings and checking, for example), so they are already used to the notion of using different accounts for different purposes. However, they are *not* used to having to reconfigure their banks's settings when they e.g. want to transfer funds from one account to another - this should just really happen with minimal user reconfiguration. You can follow along on the Pull Requests (https://github.com/omgnetwork/optimism/pulls); front-end focused work is growing quickly.
+
+* Closely related to the UI, is our solution for fast on/off, which consists of deploying liquidity pools across the chains - i.e. we represent moving funds to L2 as a swap, where a person swaps L1 ETH for L2 wETH, and where ETH and wETH never actually move across the chain boundaries. It's just like Uniswap, except that the two liquidity pools are not in one contract, but in two contracts, one on the L1 and the other one on the L2. This feature is live, and you can already earn Rinkeby ETH by staking, which provides liquidity for easy swap on/off: https://webwallet.rinkeby.omgx.network - click *Farm* on the top tab. Note that contract improvements are pending, and that the contracts have not yet been audited.
+
+* Blockexplorer. A blockexplorer is vital, and there is a simple one you can look at here: https://blockexplorer.rinkeby.omgx.network/?network=OmgX. However, we will soon transition to an industry-leading blockexplorer, so you have all the functions you expect and we do not have to maintain our own blockexplorer. Related to the blockexplorer is a feature everyone expects - reliable transaction history, so they can easily see their transactions and get reliable updates about their deposits and withdrawals.
+
+* Hardware wallet support. One of the gaping holes in the current webwallet/gateway is the complete lack of support for hardware wallets - our first step will be to add Ledger Nano support (https://github.com/omgnetwork/optimism/issues/117).
+
+## 4. Security
+
+* Verifiers
+* Automatic Fraud Proving and Recovery
+
+## 5. Hybrid Compute
+
+* Welcome 4 interns
+* Hello world example working - next step is to write example code for real-time updating stable-swap like system
+
+## 6. User and Developer Experience
+
+* Working examples
+* Updated documentation
\ No newline at end of file
diff --git a/omgx_documention/Quickstart.md b/omgx_documention/Quickstart.md
new file mode 100644
index 000000000000..4106dc775389
--- /dev/null
+++ b/omgx_documention/Quickstart.md
@@ -0,0 +1,69 @@
+# Overall Setup
+
+Clone the repository, open it, and install nodejs packages with `yarn`:
+
+```bash
+git clone git@github.com:omgnetwork/optimism.git
+cd optimism
+yarn clean
+yarn install
+yarn build
+```
+
+Build and run the entire stack:
+
+```bash
+$ cd ops
+$ BUILD=1 DAEMON=0 ./up_local.sh
+```
+
+Helpful commands:
+
+* _Running out of space on your Docker, or having other having hard to debug issues_? Try running `docker system prune -a --volumes` and then rebuild the images.
+* _To (re)build individual base services_: `docker-compose build -- l2geth`
+* _To (re)build individual OMGX services_: `docker-compose -f "docker-compose-omgx-services.yml" build -- omgx_message-relayer-fast` Note: First you will have to comment out various dependencies in `docker-compose-omgx-services.yml`.
+
+### Running unit tests
+
+To run unit tests for a specific package:
+
+```bash
+cd packages/package-to-test
+yarn test
+```
+
+### Running integration tests
+
+```bash
+cd integration-tests
+yarn build:integration
+yarn test:integration
+```
+
+## Front End Development
+
+Start a local L1/L2.
+
+```bash
+$ cd ops
+$ BUILD=1 DAEMON=0 ./up_local.sh
+```
+
+Typically, you will only have to build everything once, and after that, you can save time by setting `BUILD` to `2`. Then, open a second terminal window and navigate to `packages/omgx/wallet-frontend`, and run
+
+```bash
+$ yarn get_artifacts #this will get all the contract artifacts - note that this will only work correctly if you ran `yarn build` at the top level per instructions
+$ yarn build
+$ yarn start
+```
+
+and the frontend should start up in a local browser. You can also develop on the Rinkeby testnet - in that case, you do not need to run a local L1/L2. If you would like to do that, just change the `.env` settings:
+
+```bash
+# This is for working on the wallet, pointed at the OMGX Rinkeby testnet
+REACT_APP_INFURA_ID=
+REACT_APP_ETHERSCAN_API=
+REACT_APP_POLL_INTERVAL=20000
+SKIP_PREFLIGHT_CHECK=true
+REACT_APP_WALLET_VERSION=1.0.10
+```
diff --git a/omgx_documention/Readme.md b/omgx_documention/Readme.md
new file mode 100644
index 000000000000..687aac1398d9
--- /dev/null
+++ b/omgx_documention/Readme.md
@@ -0,0 +1,188 @@
+- [Starting a local basic Optimism L1/L2 with OMGX contracts and services](#starting-a-local-basic-optimism-l1-l2-with-omgx-contracts-and-services)
+ * [Starting a local basic Optimism L1/L2](#starting-a-local-basic-optimism-l1-l2)
+ + [Overall Setup](#overall-setup)
+ * [(Re)Building the entire system or parts of the base L1/L2](#-re-building-the-entire-system-or-parts-of-the-base-l1-l2)
+ * [(Re)Building the entire system or parts of the OMGX contracts and services](#-re-building-the-entire-system-or-parts-of-the-omgx-contracts-and-services)
+ - [Viewing docker container logs](#viewing-docker-container-logs)
+ + [Running unit tests](#running-unit-tests)
+ + [Running integration tests](#running-integration-tests)
+
+# Overall Setup
+
+Clone the repository, open it, and install nodejs packages with `yarn`:
+
+```bash
+git clone git@github.com:omgnetwork/optimism.git
+cd optimism
+yarn clean
+yarn install
+yarn build
+```
+With all this done we can move on to actually spinning up a local version of the Optimism L1/L2.
+
+**NOTE: You should recompile all packages whenever you move from one branch to another.**
+Use the below commands to recompile the packages.
+
+
+
+Note: _Running out of space on your Docker, or having other having hard to debug issues_? Try running `docker system prune -a --volumes` and then rebuild the images.
+
+## Starting a local basic Optimism L1/L2
+
+You can change the BUILD and DAEMON values to control if everything is rebuilt (`BUILD=1`, very slow), and if you want to see all the debug information (`DAEMON=0`)
+
+**Before running any Docker related commands make sure you have Docker up and running.**
+
+
+```bash
+cd ops
+export COMPOSE_DOCKER_CLI_BUILD=1 # these environment variables significantly speed up build time
+export DOCKER_BUILDKIT=1
+docker-compose build
+docker-compose up -V
+```
+
+If you run into issues errors when running `docker-compose build` restart Docker before trying anything else.
+
+The `-V` setting is critical, since otherwise your Docker images may have stale information in them from previous runs, which will confuse the `data-transport-layer`, among other things.
+
+## (Re)Building the entire system or parts of the base L1/L2
+
+If you want to run an Optimistic Ethereum node OR **if you want to run the integration tests**, you'll need to build the rest of the system.
+
+If you want to make a change to a container, you'll need to take it down and rebuild it.
+For example, if you make a change in l2geth:
+
+```bash
+cd ops
+docker-compose stop -- l2geth
+docker-compose build -- l2geth
+docker-compose start l2geth
+```
+
+For the typescript services, you'll need to rebuild the `builder` so that the compiled
+files are re-generated, and then your service, e.g. for the batch submitter
+
+```bash
+cd ops
+docker-compose stop -- batch_submitter
+docker-compose build -- builder batch_submitter
+docker-compose start batch_submitter
+```
+
+Source code changes can have an impact on more than one container.
+**If you're unsure about which containers to rebuild, just rebuild them all**:
+
+```bash
+cd ops
+docker-compose down
+docker-compose build
+docker-compose up
+```
+
+Finally, **if you're running into weird problems and nothing seems to be working**, run:
+
+```bash
+cd optimism
+yarn clean
+yarn build
+cd ops
+docker-compose down -v
+docker-compose build
+docker-compose up
+```
+
+## (Re)Building the entire system or parts of the OMGX contracts and services
+
+```bash
+cd ops
+export COMPOSE_DOCKER_CLI_BUILD=1 # these environment variables significantly speed up build time
+export DOCKER_BUILDKIT=1
+docker-compose build
+docker-compose -f docker-compose.yml -f docker-compose-omgx-services.yml up -V
+```
+
+To build individual OMGX services:
+
+```bash
+docker-compose -f "docker-compose-omgx-services.yml" build -- omgx_message-relayer-fast
+```
+
+**Note: First you will have to comment out various dependencies in the `docker-compose-omgx-services.yml`.**
+
+#### Viewing docker container logs
+
+By default, the `docker-compose up` command will show logs from all services, and that
+can be hard to filter through. In order to view the logs from a specific service, you can run:
+
+```bash
+docker-compose logs --follow
+```
+
+### Running unit tests
+
+Before running tests: **follow the above instructions to get everything built.** Run unit tests for all packages in parallel via:
+
+```bash
+yarn test
+```
+
+To run unit tests for a specific package:
+
+```bash
+cd packages/package-to-test
+yarn test
+```
+
+### Running integration tests
+
+Follow above instructions for building the whole stack. Build and run the integration tests:
+
+```bash
+cd integration-tests
+yarn build:integration
+yarn test:integration
+```
+
+## Front End Development
+
+Start a local L1/L2.
+
+You can change the BUILD and DAEMON values to control if everything is rebuilt (`BUILD=1`, very slow), and if you want to see all the debug information (`DAEMON=0`).
+
+```bash
+$ cd ops
+$ BUILD=1 DAEMON=0 ./up_local.sh
+```
+
+Typically, you will only have to build everything once, and after that, you can save time by setting `BUILD` to `2`. In that case, we'll use the docker images you built earlier.
+
+```bash
+$ cd ops
+$ BUILD=2 DAEMON=0 ./up_local.sh
+```
+
+Then, open a second terminal window and navigate to `packages/omgx/wallet-frontend`, and run
+
+```bash
+$ yarn get_artifacts #this will get all the contract artifacts - note that this will only work correctly if you ran `yarn build` at the top level per instructions
+$ yarn build
+$ yarn start
+```
+
+and the frontend should start up in a local browser. You can also develop on the Rinkeby testnet - in that case, you do not need to run a local L1/L2. If you would like to do that, just change the .env settings:
+
+```bash
+# This is for working on the wallet, pointed at the OMGX Rinkeby testnet
+REACT_APP_INFURA_ID=
+REACT_APP_ETHERSCAN_API=
+REACT_APP_POLL_INTERVAL=20000
+SKIP_PREFLIGHT_CHECK=true
+REACT_APP_WALLET_VERSION=1.0.10
+```
diff --git a/omgx_documention/Service_maintenance.md b/omgx_documention/Service_maintenance.md
new file mode 100644
index 000000000000..3669ab1d674c
--- /dev/null
+++ b/omgx_documention/Service_maintenance.md
@@ -0,0 +1,117 @@
+# Service maintenance
+
+## Docker containers
+
+We have six main containers and five secondary containers that provide the monitor and subgraph services.
+
+### Main containers
+
+* [omgx/deployer-rinkeby](https://hub.docker.com/layers/omgx/deployer-rinkeby/production-v1/images/sha256-8ca509eb7a830ee862318225a2d5558f868d139a745edaff448ec3ccb90965e8?context=repo)
+
+ It serves `addresses.json` and `state-dump.latest.json` files so that l2geth container and data-transport-layer can fetch the `ADDRESS_MANAGER_ADDRESS` and `ABI` of L1 pre-deployed contracts.
+
+ Normally, this container uses about **15MB** memory.
+
+* [omgx/l2geth](https://hub.docker.com/layers/156092279/omgx/l2geth/production-v1/images/sha256-d5f099b01629da9ca93af25705d326d90bb7d100695e0a66cc920871705ff890?context=repo)
+
+ The l2geth container takes around 500MB memory. For safety and maintenance reasons, we should allocate **1GB** of memory to this service.
+
+ > Note: We didn't see a large increase in memory usage of **l2geth** when we ran the performance test.
+
+* [omgx/data-transport-layer](https://hub.docker.com/layers/156092207/omgx/data-transport-layer/production-v1/images/sha256-07d4415aab46863b8c7996c1c40f6221f3ac3f697485ccc262a3a6f0478aa4fb?context=repo)
+
+ The data-transport-layer syncs L1 and provides the index service. It only uses about **50MB** of memory.
+
+* [omgx/batch-submitter](https://hub.docker.com/layers/156091606/omgx/batch-submitter/production-v1/images/sha256-b3e61c1350b94cca73853867e1267e6f0e197ffbf7661f76c5c373e85eb3e70f?context=repo)
+
+ The batch submitter submits TX and state root batches to CTC and SCC contracts. It takes about **100MB** of memory.
+
+* [omgx/message-relayer](https://hub.docker.com/layers/156091959/omgx/message-relayer/production-v1/images/sha256-52ae4dbe41895c331ee3dc05955ad8c50c1319f91aaf3b4747d3ded2305382b4?context=repo) and [omgx/message-relayer-fast](https://hub.docker.com/layers/156091184/omgx/message-relayer-fast/production-v1/images/sha256-4e973130ca9cd5704ae3ce83f8c01682851b73835753268203bba91df7213167?context=repo)
+
+ Both message relayers need at least **1GB** of memory. It will restart when they approach the memory usage around **3.5GB**. It's better to give them at least **4GB** memory, so they won't restart frequently.
+
+### Secondary containers
+
+Our main services won't be affected by these secondary services, so it's safe for them to reboot when they have any problems.
+
+* Graph-node, postgres, ipfs
+* omgx/monitoring
+* omgx/dummy-transaction
+
+## Port
+
+We open the following the ports:
+
+| **Port** | **Purpose** | **Routes** | URL | **Permission** |
+| :------: | :---------------------------------------: | :-------------------------------------------: | :----------------------------------------------------------: | :------------: |
+| 8545 | L2Geth | / | https://rinkeby.omgx.network | Public |
+| 8081 | Deployer | /addresses.json
/state-dumps.latest.json | https://rinkeby.omgx.network:8081 | Public |
+| 8000 | GraphQL HTTP server | /subgraphs/name/.../... | https://graph.rinkeby.omgx.network
https://graph.rinkeby.omgx.network:8000 | Public |
+| 8001 | GraphQL WS | /subgraphs/name/.../... | https://graph.rinkeby.omgx.network:8001 | Public |
+| 8020 | JSON-RPC
(for managing deployments) | / | https://graph.rinkeby.omgx.network:8020 | Private |
+| 8030 | Subgraph indexing status API | /graphql | https://graph.rinkeby.omgx.network:8030 | Public |
+| 8040 | Prometheus metrics | /metrics | https://graph.rinkeby.omgx.network:8040 | Public |
+
+## Memory usage and recommendation
+
+| Container | Minimum memory usage | Recommanded memory allocation |
+| :-----------------------: | :------------------: | :---------------------------: |
+| omgx/deployer-rinkeby | 15MB | 128MB |
+| omgx/l2geth | 500MB | **2GB** |
+| omgx/data-transport-layer | 100MB | 512MB |
+| omgx/batch-submitter | 1GB | **2GB** |
+| omgx/message-relayer | 1GB | **4GB** |
+| omgx/message-relayer-fast | 1GB | **4GB** |
+
+> NOTE:
+>
+> `omgx/l2geth`: it's the most important service, so we should give as much memory as we can.
+>
+> `omgx/message-relayer-fast` and `omgx/message-relayer` : both message relayers can stop due the OOM issue. Giving it **4GB** memory can reduce the number of times that it needs to restart.
+>
+> [**IMPORTANT**] When `omgx/message-relayer-fast` and `omgx/message-relayer` restart, they scans all L2 blocks and check if there is a cross domain message and if the message is relayed to L1. It takes about 5 mins to sync 4K L2 blocks.
+
+## Possible errors
+
+* [omgx/batch-submitter](https://hub.docker.com/layers/156091606/omgx/batch-submitter/production-v1/images/sha256-b3e61c1350b94cca73853867e1267e6f0e197ffbf7661f76c5c373e85eb3e70f?context=repo)
+
+ The queued data in the `CTC-queue` contract might not match to the data of the L1 block. We have noticed the following situations:
+
+ * `The timestamp of the queued element` >` timestamp of L1 block` and `block number of the queued element` === `block number of L1 block`.
+ * `The timestamp of the queued element` >` timestamp of L1 block` and `block number of the queued element` > `block number of L1 block`.
+
+ The second issue can be fixed by enabling the [AUTO_FIX_BATCH_OPTIONS_CONF](https://github.com/omgnetwork/optimism/blob/8fd511e608744f182f8a10e6fb5aa5d27f581860/packages/batch-submitter/src/exec/run-batch-submitter.ts#L241) to `fixMonotonicity`.
+
+ Please comment out [fixedBatch.push(ele)](https://github.com/omgnetwork/optimism/blob/8fd511e608744f182f8a10e6fb5aa5d27f581860/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts#L492) and enable [AUTO_FIX_BATCH_OPTIONS_CONF](https://github.com/omgnetwork/optimism/blob/8fd511e608744f182f8a10e6fb5aa5d27f581860/packages/batch-submitter/src/exec/run-batch-submitter.ts#L241) to `fixSkippedDeposits` for the first issue.
+
+ > NOTE:
+ >
+ > You don't have to stop the batch-submitter in EC2 or ECS to fix the issue. Please add `.env` file to `packages/batch-submitter` and fix it via running the batch-submitter locally:
+ >
+ > ```bash
+ > yarn build
+ > yarn start
+ > ```
+ >
+ > Once the local batch submitter pushes the correct queued elements to CTC, the production one will start to work.
+
+* [omgx/message-relayer-fast](https://hub.docker.com/layers/156091184/omgx/message-relayer-fast/production-v1/images/sha256-4e973130ca9cd5704ae3ce83f8c01682851b73835753268203bba91df7213167?context=repo)
+
+ It might has `MessageRelayerService._getStateBatchHeader` error when we ran the loading test. It can be fixed via restarting the service, but we don't know the root problem.
+
+* [omgx/l2geth](https://hub.docker.com/layers/156092279/omgx/l2geth/production-v1/images/sha256-d5f099b01629da9ca93af25705d326d90bb7d100695e0a66cc920871705ff890?context=repo) [**IMPORTANT!!**]
+
+ `omgx/l2geth` may have the incompatible genesis when we update the deployer.
+
+ ```
+ Fatal: Error starting protocol stack: database contains incompatible genesis
+ ```
+
+ We solve it by removing the old data. However, it's not a good way to solve it. It's related to #regensis topic.
+
+## Regenesis
+
+Two possible reasons that we need to do regenesis on L2geth.
+
+1. When l2geth starts, it will fully sync with old data. If we have thousands of L2 blocks, it takes a few hours to do so.
+2. When we deploy the new deployer contracts, probably we need to do regenesis.
diff --git a/omgx_examples/README.md b/omgx_examples/README.md
new file mode 100644
index 000000000000..96015a6101c2
--- /dev/null
+++ b/omgx_examples/README.md
@@ -0,0 +1,55 @@
+# OMGX Examples
+
+- [OMGX First Steps](#omgx-first-steps)
+ * [1. To spin up a local L1/L2 system](#1-to-spin-up-a-local-l1-l2-system)
+ * [2. Chose an example, compile it, deploy it, and test it](#2-chose-an-example--compile-it--deploy-it--and-test-it)
+
+## 1. To spin up a local L1/L2 system
+
+First, install needed modules:
+
+```bash
+$ cd optimism
+$ yarn clean
+$ yarn
+$ yarn build
+```
+
+Then, navigate to the `/ops` folder and start the system. Make sure you have the docker app running!
+
+```bash
+$ cd ops
+$ docker-compose down #only needed if you are currently running a local system
+$ docker-compose build
+$ docker-compose up -V
+```
+
+## 2. Chose an example, compile it, deploy it, and test it
+
+For example, if you would like to deploy a simple ERC20 token using hardhat, navigate to the `hardhat` folder and compile the contract:
+
+```bash
+$ cd /omgx_examples/hardhat
+$ yarn
+$ yarn compile #compile the examples for the local L1
+$ yarn compile:ovm #compile the examples for the local L2
+$ yarn compile:omgx #compile the examples for the OMGX Rinkeby L2
+```
+
+Now, see it all work. The `ovm` suffix denotes deploying and running contracts on the L2.
+
+```bash
+$ yarn test:integration #test the examples on the local L1
+$ yarn test:integration:ovm #test the examples on the local L2
+$ yarn test:integration:omgx #test the examples on the OMGX Rinkeby L2
+```
+
+To deploy the contracts to the various chains,
+
+```bash
+$ yarn deploy #test the examples on the local L1
+$ yarn deploy:ovm #test the examples on the local L2
+$ yarn deploy:omgx #test the examples on the OMGX Rinkeby L2
+```
+
+Note that not all commands are availible for all the different examples, and the commands will be slightly different fro `waffle` and so forth. See the `package.json` files for example-specific syntax, or the Readme.md in the examples.
\ No newline at end of file
diff --git a/omgx_examples/hardhat/LICENSE b/omgx_examples/hardhat/LICENSE
new file mode 100644
index 000000000000..6a7da5218bb2
--- /dev/null
+++ b/omgx_examples/hardhat/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright 2020-2021 Optimism
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/omgx_examples/hardhat/README.md b/omgx_examples/hardhat/README.md
new file mode 100644
index 000000000000..0c50482bc3e5
--- /dev/null
+++ b/omgx_examples/hardhat/README.md
@@ -0,0 +1,43 @@
+# OMGX ERC20 Example
+
+## 1. Compiling the contracts
+
+First, spin up a local system as usual (see the top-level `Readme.md`). Then, run:
+
+```bash
+$ yarn
+$ yarn compile #for your local L1
+$ yarn compile:ovm #for your local L2
+$ yarn compile:omgx #for OMGX Rinkeby
+```
+
+## 2. Testing
+
+```bash
+$ yarn test:integration:ovm #for your local L1/L2
+$ yarn test:integration:omgx #for OMGX Rinkeby
+```
+
+```bash
+% yarn test:integration:omgx
+yarn run v1.22.10
+$ hardhat test --network omgx_rinkeby
+
+
+ ERC20
+ ✓ should have a name (1395ms)
+ ✓ should have a total supply equal to the initial supply (1403ms)
+ ✓ should give the initial supply to the creator's address (1733ms)
+ transfer(...)
+ ✓ should revert when the sender does not have enough balance (1970ms)
+ ✓ should succeed when the sender has enough balance (5681ms)
+ transferFrom(...)
+ ✓ should revert when the sender does not have enough of an allowance (1974ms)
+ ✓ should succeed when the owner has enough balance and the sender has a large enough allowance (9559ms)
+
+
+ 7 passing (46s)
+
+✨ Done in 48.41s.
+
+```
\ No newline at end of file
diff --git a/omgx_examples/hardhat/contracts/ERC20.sol b/omgx_examples/hardhat/contracts/ERC20.sol
new file mode 100644
index 000000000000..26b36611f3fb
--- /dev/null
+++ b/omgx_examples/hardhat/contracts/ERC20.sol
@@ -0,0 +1,196 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.6.0 <0.8.0;
+
+/**
+ * @title ERC20
+ * @dev A super simple ERC20 implementation!
+ */
+contract ERC20 {
+
+ /**********
+ * Events *
+ **********/
+
+ event Transfer(
+ address indexed _from,
+ address indexed _to,
+ uint256 _value
+ );
+
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+
+
+ /*************
+ * Variables *
+ *************/
+
+ mapping (address => uint256) public balances;
+ mapping (address => mapping (address => uint256)) public allowances;
+
+ // Some optional extra goodies.
+ uint256 public totalSupply;
+ string public name;
+
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _initialSupply Initial maximum token supply.
+ * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).
+ */
+ constructor(
+ uint256 _initialSupply,
+ string memory _name
+ )
+ public
+ {
+ balances[msg.sender] = _initialSupply;
+ totalSupply = _initialSupply;
+ name = _name;
+ }
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Checks the balance of an address.
+ * @param _owner Address to check a balance for.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _owner
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_owner];
+ }
+
+ /**
+ * Transfers a balance from your account to someone else's account!
+ * @param _to Address to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transfer(
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[msg.sender] >= _amount,
+ "You don't have enough balance to make this transfer!"
+ );
+
+ balances[msg.sender] -= _amount;
+ balances[_to] += _amount;
+
+ emit Transfer(
+ msg.sender,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Transfers a balance from someone else's account to another account. You need an allowance
+ * from the sending account for this to work!
+ * @param _from Account to transfer a balance from.
+ * @param _to Account to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[_from] >= _amount,
+ "Can't transfer from the desired account because it doesn't have enough balance."
+ );
+
+ require(
+ allowances[_from][msg.sender] >= _amount,
+ "Can't transfer from the desired account because you don't have enough of an allowance."
+ );
+
+ balances[_to] += _amount;
+ balances[_from] -= _amount;
+
+ emit Transfer(
+ _from,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Approves an account to spend some amount from your account.
+ * @param _spender Account to approve a balance for.
+ * @param _amount Amount to allow the account to spend from your account.
+ * @return true if the allowance was successful.
+ */
+ function approve(
+ address _spender,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ allowances[msg.sender][_spender] = _amount;
+
+ emit Approval(
+ msg.sender,
+ _spender,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks how much a given account is allowed to spend from another given account.
+ * @param _owner Address of the account to check an allowance from.
+ * @param _spender Address of the account trying to spend from the owner.
+ * @return Allowance for the spender from the owner.
+ */
+ function allowance(
+ address _owner,
+ address _spender
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return allowances[_owner][_spender];
+ }
+}
diff --git a/omgx_examples/hardhat/deploy/ERC20.deploy.js b/omgx_examples/hardhat/deploy/ERC20.deploy.js
new file mode 100644
index 000000000000..0f6423637f17
--- /dev/null
+++ b/omgx_examples/hardhat/deploy/ERC20.deploy.js
@@ -0,0 +1,18 @@
+// Just a standard hardhat-deploy deployment definition file!
+const func = async (hre) => {
+ const { deployments, getNamedAccounts } = hre
+ const { deploy } = deployments
+ const { deployer } = await getNamedAccounts()
+
+ const initialSupply = 1000000
+ const name = 'My Optimistic Token'
+
+ await deploy('ERC20', {
+ from: deployer,
+ args: [initialSupply, name],
+ log: true
+ })
+}
+
+func.tags = ['ERC20']
+module.exports = func
diff --git a/omgx_examples/hardhat/deployments/omgx_rinkeby/.chainId b/omgx_examples/hardhat/deployments/omgx_rinkeby/.chainId
new file mode 100644
index 000000000000..368f89ceef17
--- /dev/null
+++ b/omgx_examples/hardhat/deployments/omgx_rinkeby/.chainId
@@ -0,0 +1 @@
+28
\ No newline at end of file
diff --git a/omgx_examples/hardhat/deployments/omgx_rinkeby/ERC20.json b/omgx_examples/hardhat/deployments/omgx_rinkeby/ERC20.json
new file mode 100644
index 000000000000..60c0f7183d4a
--- /dev/null
+++ b/omgx_examples/hardhat/deployments/omgx_rinkeby/ERC20.json
@@ -0,0 +1,446 @@
+{
+ "address": "0x851356ae760d987E095750cCeb3bC6014560891C",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "_initialSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "transactionHash": "0x45ed27ee1b1120b96211231f988a9139a1f85391821c181f3b68b1c9820e3535",
+ "receipt": {
+ "to": null,
+ "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "contractAddress": "0x851356ae760d987E095750cCeb3bC6014560891C",
+ "transactionIndex": 0,
+ "gasUsed": "1902025",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000040000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000008000000000000000010000000000000000000000400000000000000000000000100008000000000000000000000000010000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "blockHash": "0x8132f0661fccfdce371a9137765cecae91f63b1e52c38a94d29c80431a7ec212",
+ "transactionHash": "0x45ed27ee1b1120b96211231f988a9139a1f85391821c181f3b68b1c9820e3535",
+ "logs": [
+ {
+ "transactionIndex": 0,
+ "blockNumber": 547,
+ "transactionHash": "0x45ed27ee1b1120b96211231f988a9139a1f85391821c181f3b68b1c9820e3535",
+ "address": "0x4200000000000000000000000000000000000006",
+ "topics": [
+ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
+ "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "0x0000000000000000000000004200000000000000000000000000000000000005"
+ ],
+ "data": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logIndex": 0,
+ "blockHash": "0x8132f0661fccfdce371a9137765cecae91f63b1e52c38a94d29c80431a7ec212"
+ }
+ ],
+ "blockNumber": 547,
+ "cumulativeGasUsed": "1902025",
+ "status": 1,
+ "byzantium": true
+ },
+ "args": [
+ 1000000,
+ "My Optimistic Token"
+ ],
+ "solcInputHash": "a4e2764a77fec30ccb674d800c46e436",
+ "metadata": "{\"compiler\":{\"version\":\"0.7.6+ovm+commit.aff196a1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_initialSupply\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A super simple ERC20 implementation!\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"Address of the account to check an allowance from.\",\"_spender\":\"Address of the account trying to spend from the owner.\"},\"returns\":{\"_0\":\"Allowance for the spender from the owner.\"}},\"approve(address,uint256)\":{\"params\":{\"_amount\":\"Amount to allow the account to spend from your account.\",\"_spender\":\"Account to approve a balance for.\"},\"returns\":{\"_0\":\"true if the allowance was successful.\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"Address to check a balance for.\"},\"returns\":{\"_0\":\"Balance of the address.\"}},\"constructor\":{\"params\":{\"_initialSupply\":\"Initial maximum token supply.\",\"_name\":\"A name for our ERC20 (technically optional, but it's fun ok jeez).\"}},\"transfer(address,uint256)\":{\"params\":{\"_amount\":\"Amount to transfer to the other account.\",\"_to\":\"Address to transfer a balance to.\"},\"returns\":{\"_0\":\"true if the transfer was successful.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_amount\":\"Amount to transfer to the other account.\",\"_from\":\"Account to transfer a balance from.\",\"_to\":\"Account to transfer a balance to.\"},\"returns\":{\"_0\":\"true if the transfer was successful.\"}}},\"title\":\"ERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Checks how much a given account is allowed to spend from another given account.\"},\"approve(address,uint256)\":{\"notice\":\"Approves an account to spend some amount from your account.\"},\"balanceOf(address)\":{\"notice\":\"Checks the balance of an address.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers a balance from your account to someone else's account!\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers a balance from someone else's account to another account. You need an allowance from the sending account for this to work!\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC20\\n * @dev A super simple ERC20 implementation!\\n */\\ncontract ERC20 {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event Transfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _value\\n );\\n\\n event Approval(\\n address indexed _owner,\\n address indexed _spender,\\n uint256 _value\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (address => uint256) public balances;\\n mapping (address => mapping (address => uint256)) public allowances;\\n\\n // Some optional extra goodies.\\n uint256 public totalSupply;\\n string public name;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _initialSupply Initial maximum token supply.\\n * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).\\n */\\n constructor(\\n uint256 _initialSupply,\\n string memory _name\\n )\\n public\\n {\\n balances[msg.sender] = _initialSupply;\\n totalSupply = _initialSupply;\\n name = _name;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks the balance of an address.\\n * @param _owner Address to check a balance for.\\n * @return Balance of the address.\\n */\\n function balanceOf(\\n address _owner\\n )\\n external\\n view\\n returns (\\n uint256\\n )\\n {\\n return balances[_owner];\\n }\\n\\n /**\\n * Transfers a balance from your account to someone else's account!\\n * @param _to Address to transfer a balance to.\\n * @param _amount Amount to transfer to the other account.\\n * @return true if the transfer was successful.\\n */\\n function transfer(\\n address _to,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n require(\\n balances[msg.sender] >= _amount,\\n \\\"You don't have enough balance to make this transfer!\\\"\\n );\\n\\n balances[msg.sender] -= _amount;\\n balances[_to] += _amount;\\n\\n emit Transfer(\\n msg.sender,\\n _to,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Transfers a balance from someone else's account to another account. You need an allowance\\n * from the sending account for this to work!\\n * @param _from Account to transfer a balance from.\\n * @param _to Account to transfer a balance to.\\n * @param _amount Amount to transfer to the other account.\\n * @return true if the transfer was successful.\\n */\\n function transferFrom(\\n address _from,\\n address _to,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n require(\\n balances[_from] >= _amount,\\n \\\"Can't transfer from the desired account because it doesn't have enough balance.\\\"\\n );\\n\\n require(\\n allowances[_from][msg.sender] >= _amount,\\n \\\"Can't transfer from the desired account because you don't have enough of an allowance.\\\"\\n );\\n\\n balances[_to] += _amount;\\n balances[_from] -= _amount;\\n\\n emit Transfer(\\n _from,\\n _to,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Approves an account to spend some amount from your account.\\n * @param _spender Account to approve a balance for.\\n * @param _amount Amount to allow the account to spend from your account.\\n * @return true if the allowance was successful.\\n */\\n function approve(\\n address _spender,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n allowances[msg.sender][_spender] = _amount;\\n\\n emit Approval(\\n msg.sender,\\n _spender,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Checks how much a given account is allowed to spend from another given account.\\n * @param _owner Address of the account to check an allowance from.\\n * @param _spender Address of the account trying to spend from the owner.\\n * @return Allowance for the spender from the owner.\\n */\\n function allowance(\\n address _owner,\\n address _spender\\n )\\n external\\n view\\n returns (\\n uint256\\n )\\n {\\n return allowances[_owner][_spender];\\n }\\n}\\n\",\"keccak256\":\"0x5c76dbdcd208a53d57d8f7afa0061e54cd83157cf7d0e57be8ed914d0018283c\",\"license\":\"MIT\"}},\"version\":1}",
+ "bytecode": "0x60806040523480156200001c5760008062000019620001c4565b50505b50604051620012e8380380620012e8833981810160405260408110156200004d576000806200004a620001c4565b50505b810190808051906020019092919080516040519392919084640100000000821115620000835760008062000080620001c4565b50505b83820191506020820185811115620000a557600080620000a2620001c4565b50505b8251866001820283011164010000000082111715620000ce57600080620000cb620001c4565b50505b8083526020830192505050908051906020019080838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905090810190601f168015620001325780820380516001836020036101000a031916815260200191505b50604052505050816000805a6200014862000234565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906200018e62000293565b5050508160028190620001a062000293565b5050508060039080519060200190620001bb929190620002fa565b50505062000455565b632a2a7adb598160e01b8152600481016020815285602082015260005b8681101562000201578086015181604084010152602081019050620001e1565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156200028e5760008183015260208101905062000272565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015620002f557600081830152602081019050620002d9565b505050565b828062000306620003c6565b600181600116156101000203166002900490600052602060002090601f01602090048101928262000346576000856200033e62000293565b5050620003b3565b82601f106200036c57805160ff191683800117856200036462000293565b5050620003b3565b828001600101856200037d62000293565b50508215620003b3579182015b82811115620003b257825182620003a062000293565b5050916020019190600101906200038a565b5b509050620003c291906200042b565b5090565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b604081101562000426576000818301526020810190506200040a565b505050565b5b8082111562000451576000816000906200044562000293565b5050506001016200042c565b5090565b610e8380620004656000396000f3fe608060405234801561001957600080610016610c16565b50505b506004361061009c5760003560e01c806327e235e31161006f57806327e235e31461024557806355b6ed5c146102a657806370a0823114610327578063a9059cbb14610388578063dd62ed3e146103f55761009c565b806306fdde03146100aa578063095ea7b31461012d57806318160ddd1461019a57806323b872dd146101b8575b6000806100a7610c16565b50505b6100b2610476565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f25780820151818401526020810190506100d7565b50505050905090810190601f16801561011f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101826004803603604081101561014c57600080610149610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610530565b60405180821515815260200191505060405180910390f35b6101a261063b565b6040518082815260200191505060405180910390f35b61022d600480360360608110156101d7576000806101d4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610648565b60405180821515815260200191505060405180910390f35b6102906004803603602081101561026457600080610261610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610906565b6040518082815260200191505060405180910390f35b610311600480360360408110156102c5576000806102c2610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610925565b6040518082815260200191505060405180910390f35b6103726004803603602081101561034657600080610343610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610951565b6040518082815260200191505060405180910390f35b6103dd600480360360408110156103a7576000806103a4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b60405180821515815260200191505060405180910390f35b6104606004803603604081101561041457600080610411610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b6040518082815260200191505060405180910390f35b600380610481610c84565b600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182806104bc610c84565b600181600116156101000203166002900480156105285780601f106104f65761010080836104e8610c84565b040283529160200191610528565b820191906000526020600020905b8161050d610c84565b8152906001019060200180831161050457829003601f168201915b505050505081565b600081600160005a610540610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906105c1610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a6105e4610ce7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6002610645610c84565b81565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610691610c84565b10156106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180610e00604f9139606001915050604051809103906106ee610c16565b50505b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a61073c610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061077e610c84565b10156107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526056815260200180610daa60569139606001915050604051809103906107db610c16565b50505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610829610c84565b019250508190610837610d44565b505050816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610885610c84565b039250508190610893610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000602052806000526040600020600091509050610922610c84565b81565b60016020528160005260406000206020528060005260406000206000915091505061094e610c84565b81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610999610c84565b9050919050565b6000816000805a6109af610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206109f1610c84565b1015610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180610e4f6034913960400191505060405180910390610a4e610c16565b50505b816000805a610a5e610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610aa4610c84565b039250508190610ab2610d44565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610b00610c84565b019250508190610b0e610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610b31610ce7565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c0e610c84565b905092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c51578086015181604084010152602081019050610c33565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610ce257600081830152602081019050610cc8565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610d3f57600081830152602081019050610d25565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015610da457600081830152602081019050610d8a565b50505056fe43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520796f7520646f6e2774206861766520656e6f756768206f6620616e20616c6c6f77616e63652e43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520697420646f65736e2774206861766520656e6f7567682062616c616e63652e596f7520646f6e2774206861766520656e6f7567682062616c616e636520746f206d616b652074686973207472616e7366657221",
+ "deployedBytecode": "0x608060405234801561001957600080610016610c16565b50505b506004361061009c5760003560e01c806327e235e31161006f57806327e235e31461024557806355b6ed5c146102a657806370a0823114610327578063a9059cbb14610388578063dd62ed3e146103f55761009c565b806306fdde03146100aa578063095ea7b31461012d57806318160ddd1461019a57806323b872dd146101b8575b6000806100a7610c16565b50505b6100b2610476565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f25780820151818401526020810190506100d7565b50505050905090810190601f16801561011f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101826004803603604081101561014c57600080610149610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610530565b60405180821515815260200191505060405180910390f35b6101a261063b565b6040518082815260200191505060405180910390f35b61022d600480360360608110156101d7576000806101d4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610648565b60405180821515815260200191505060405180910390f35b6102906004803603602081101561026457600080610261610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610906565b6040518082815260200191505060405180910390f35b610311600480360360408110156102c5576000806102c2610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610925565b6040518082815260200191505060405180910390f35b6103726004803603602081101561034657600080610343610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610951565b6040518082815260200191505060405180910390f35b6103dd600480360360408110156103a7576000806103a4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b60405180821515815260200191505060405180910390f35b6104606004803603604081101561041457600080610411610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b6040518082815260200191505060405180910390f35b600380610481610c84565b600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182806104bc610c84565b600181600116156101000203166002900480156105285780601f106104f65761010080836104e8610c84565b040283529160200191610528565b820191906000526020600020905b8161050d610c84565b8152906001019060200180831161050457829003601f168201915b505050505081565b600081600160005a610540610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906105c1610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a6105e4610ce7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6002610645610c84565b81565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610691610c84565b10156106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180610e00604f9139606001915050604051809103906106ee610c16565b50505b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a61073c610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061077e610c84565b10156107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526056815260200180610daa60569139606001915050604051809103906107db610c16565b50505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610829610c84565b019250508190610837610d44565b505050816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610885610c84565b039250508190610893610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000602052806000526040600020600091509050610922610c84565b81565b60016020528160005260406000206020528060005260406000206000915091505061094e610c84565b81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610999610c84565b9050919050565b6000816000805a6109af610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206109f1610c84565b1015610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180610e4f6034913960400191505060405180910390610a4e610c16565b50505b816000805a610a5e610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610aa4610c84565b039250508190610ab2610d44565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610b00610c84565b019250508190610b0e610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610b31610ce7565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c0e610c84565b905092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c51578086015181604084010152602081019050610c33565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610ce257600081830152602081019050610cc8565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610d3f57600081830152602081019050610d25565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015610da457600081830152602081019050610d8a565b50505056fe43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520796f7520646f6e2774206861766520656e6f756768206f6620616e20616c6c6f77616e63652e43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520697420646f65736e2774206861766520656e6f7567682062616c616e63652e596f7520646f6e2774206861766520656e6f7567682062616c616e636520746f206d616b652074686973207472616e7366657221",
+ "devdoc": {
+ "details": "A super simple ERC20 implementation!",
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "Address of the account to check an allowance from.",
+ "_spender": "Address of the account trying to spend from the owner."
+ },
+ "returns": {
+ "_0": "Allowance for the spender from the owner."
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_amount": "Amount to allow the account to spend from your account.",
+ "_spender": "Account to approve a balance for."
+ },
+ "returns": {
+ "_0": "true if the allowance was successful."
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "Address to check a balance for."
+ },
+ "returns": {
+ "_0": "Balance of the address."
+ }
+ },
+ "constructor": {
+ "params": {
+ "_initialSupply": "Initial maximum token supply.",
+ "_name": "A name for our ERC20 (technically optional, but it's fun ok jeez)."
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_amount": "Amount to transfer to the other account.",
+ "_to": "Address to transfer a balance to."
+ },
+ "returns": {
+ "_0": "true if the transfer was successful."
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_amount": "Amount to transfer to the other account.",
+ "_from": "Account to transfer a balance from.",
+ "_to": "Account to transfer a balance to."
+ },
+ "returns": {
+ "_0": "true if the transfer was successful."
+ }
+ }
+ },
+ "title": "ERC20",
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "allowance(address,address)": {
+ "notice": "Checks how much a given account is allowed to spend from another given account."
+ },
+ "approve(address,uint256)": {
+ "notice": "Approves an account to spend some amount from your account."
+ },
+ "balanceOf(address)": {
+ "notice": "Checks the balance of an address."
+ },
+ "transfer(address,uint256)": {
+ "notice": "Transfers a balance from your account to someone else's account!"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "Transfers a balance from someone else's account to another account. You need an allowance from the sending account for this to work!"
+ }
+ },
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [
+ {
+ "astId": 22,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "balances",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_address,t_uint256)"
+ },
+ {
+ "astId": 28,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "allowances",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
+ },
+ {
+ "astId": 30,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "totalSupply",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_uint256"
+ },
+ {
+ "astId": 32,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "name",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_string_storage"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "encoding": "inplace",
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32",
+ "value": "t_mapping(t_address,t_uint256)"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32",
+ "value": "t_uint256"
+ },
+ "t_string_storage": {
+ "encoding": "bytes",
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "encoding": "inplace",
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/hardhat/deployments/omgx_rinkeby/solcInputs/a4e2764a77fec30ccb674d800c46e436.json b/omgx_examples/hardhat/deployments/omgx_rinkeby/solcInputs/a4e2764a77fec30ccb674d800c46e436.json
new file mode 100644
index 000000000000..9172859cb7af
--- /dev/null
+++ b/omgx_examples/hardhat/deployments/omgx_rinkeby/solcInputs/a4e2764a77fec30ccb674d800c46e436.json
@@ -0,0 +1,35 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "contracts/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.6.0 <0.8.0;\n\n/**\n * @title ERC20\n * @dev A super simple ERC20 implementation!\n */\ncontract ERC20 {\n\n /**********\n * Events *\n **********/\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (address => uint256) public balances;\n mapping (address => mapping (address => uint256)) public allowances;\n\n // Some optional extra goodies.\n uint256 public totalSupply;\n string public name;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _initialSupply Initial maximum token supply.\n * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).\n */\n constructor(\n uint256 _initialSupply,\n string memory _name\n )\n public\n {\n balances[msg.sender] = _initialSupply;\n totalSupply = _initialSupply;\n name = _name;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks the balance of an address.\n * @param _owner Address to check a balance for.\n * @return Balance of the address.\n */\n function balanceOf(\n address _owner\n )\n external\n view\n returns (\n uint256\n )\n {\n return balances[_owner];\n }\n\n /**\n * Transfers a balance from your account to someone else's account!\n * @param _to Address to transfer a balance to.\n * @param _amount Amount to transfer to the other account.\n * @return true if the transfer was successful.\n */\n function transfer(\n address _to,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n require(\n balances[msg.sender] >= _amount,\n \"You don't have enough balance to make this transfer!\"\n );\n\n balances[msg.sender] -= _amount;\n balances[_to] += _amount;\n\n emit Transfer(\n msg.sender,\n _to,\n _amount\n );\n\n return true;\n }\n\n /**\n * Transfers a balance from someone else's account to another account. You need an allowance\n * from the sending account for this to work!\n * @param _from Account to transfer a balance from.\n * @param _to Account to transfer a balance to.\n * @param _amount Amount to transfer to the other account.\n * @return true if the transfer was successful.\n */\n function transferFrom(\n address _from,\n address _to,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n require(\n balances[_from] >= _amount,\n \"Can't transfer from the desired account because it doesn't have enough balance.\"\n );\n\n require(\n allowances[_from][msg.sender] >= _amount,\n \"Can't transfer from the desired account because you don't have enough of an allowance.\"\n );\n\n balances[_to] += _amount;\n balances[_from] -= _amount;\n\n emit Transfer(\n _from,\n _to,\n _amount\n );\n\n return true;\n }\n\n /**\n * Approves an account to spend some amount from your account.\n * @param _spender Account to approve a balance for.\n * @param _amount Amount to allow the account to spend from your account.\n * @return true if the allowance was successful.\n */\n function approve(\n address _spender,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n allowances[msg.sender][_spender] = _amount;\n\n emit Approval(\n msg.sender,\n _spender,\n _amount\n );\n\n return true;\n }\n\n /**\n * Checks how much a given account is allowed to spend from another given account.\n * @param _owner Address of the account to check an allowance from.\n * @param _spender Address of the account trying to spend from the owner.\n * @return Allowance for the spender from the owner.\n */\n function allowance(\n address _owner,\n address _spender\n )\n external\n view\n returns (\n uint256\n )\n {\n return allowances[_owner][_spender];\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": false,
+ "runs": 200
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata",
+ "devdoc",
+ "userdoc",
+ "storageLayout",
+ "evm.gasEstimates"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ },
+ "metadata": {
+ "useLiteralContent": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/hardhat/deployments/optimism/.chainId b/omgx_examples/hardhat/deployments/optimism/.chainId
new file mode 100644
index 000000000000..368f89ceef17
--- /dev/null
+++ b/omgx_examples/hardhat/deployments/optimism/.chainId
@@ -0,0 +1 @@
+28
\ No newline at end of file
diff --git a/omgx_examples/hardhat/deployments/optimism/ERC20.json b/omgx_examples/hardhat/deployments/optimism/ERC20.json
new file mode 100644
index 000000000000..b25eca3ea6ab
--- /dev/null
+++ b/omgx_examples/hardhat/deployments/optimism/ERC20.json
@@ -0,0 +1,446 @@
+{
+ "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "_initialSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "transactionHash": "0xb917a5c7aacdbbdb7654da400682b2e6eacfe6002b5d9f7cd3561408009d4eb0",
+ "receipt": {
+ "to": null,
+ "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "contractAddress": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318",
+ "transactionIndex": 0,
+ "gasUsed": "2280838",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000040000000000000000000000000000000000100000000100000000000000000000000000000000000000000000000000000008000000000000000000000000000000400000000000000000000000000000000100000000000000000000000000000010000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000000000000000002000000000000000000000000000000000000008000000000000000000000000000000000000000000000000",
+ "blockHash": "0x8adb7bfc8a68b0b54b6bb1e9b77f6173c858bd76f7ad06c251ddde2a91618794",
+ "transactionHash": "0xb917a5c7aacdbbdb7654da400682b2e6eacfe6002b5d9f7cd3561408009d4eb0",
+ "logs": [
+ {
+ "transactionIndex": 0,
+ "blockNumber": 31,
+ "transactionHash": "0xb917a5c7aacdbbdb7654da400682b2e6eacfe6002b5d9f7cd3561408009d4eb0",
+ "address": "0x4200000000000000000000000000000000000006",
+ "topics": [
+ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
+ "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "0x0000000000000000000000004200000000000000000000000000000000000011"
+ ],
+ "data": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "logIndex": 0,
+ "blockHash": "0x8adb7bfc8a68b0b54b6bb1e9b77f6173c858bd76f7ad06c251ddde2a91618794"
+ }
+ ],
+ "blockNumber": 31,
+ "cumulativeGasUsed": "2280838",
+ "status": 1,
+ "byzantium": true
+ },
+ "args": [
+ 1000000,
+ "My Optimistic Token"
+ ],
+ "solcInputHash": "a4e2764a77fec30ccb674d800c46e436",
+ "metadata": "{\"compiler\":{\"version\":\"0.7.6+ovm+commit.aff196a1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_initialSupply\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A super simple ERC20 implementation!\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"Address of the account to check an allowance from.\",\"_spender\":\"Address of the account trying to spend from the owner.\"},\"returns\":{\"_0\":\"Allowance for the spender from the owner.\"}},\"approve(address,uint256)\":{\"params\":{\"_amount\":\"Amount to allow the account to spend from your account.\",\"_spender\":\"Account to approve a balance for.\"},\"returns\":{\"_0\":\"true if the allowance was successful.\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"Address to check a balance for.\"},\"returns\":{\"_0\":\"Balance of the address.\"}},\"constructor\":{\"params\":{\"_initialSupply\":\"Initial maximum token supply.\",\"_name\":\"A name for our ERC20 (technically optional, but it's fun ok jeez).\"}},\"transfer(address,uint256)\":{\"params\":{\"_amount\":\"Amount to transfer to the other account.\",\"_to\":\"Address to transfer a balance to.\"},\"returns\":{\"_0\":\"true if the transfer was successful.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_amount\":\"Amount to transfer to the other account.\",\"_from\":\"Account to transfer a balance from.\",\"_to\":\"Account to transfer a balance to.\"},\"returns\":{\"_0\":\"true if the transfer was successful.\"}}},\"title\":\"ERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Checks how much a given account is allowed to spend from another given account.\"},\"approve(address,uint256)\":{\"notice\":\"Approves an account to spend some amount from your account.\"},\"balanceOf(address)\":{\"notice\":\"Checks the balance of an address.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers a balance from your account to someone else's account!\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers a balance from someone else's account to another account. You need an allowance from the sending account for this to work!\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC20\\n * @dev A super simple ERC20 implementation!\\n */\\ncontract ERC20 {\\n\\n /**********\\n * Events *\\n **********/\\n\\n event Transfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _value\\n );\\n\\n event Approval(\\n address indexed _owner,\\n address indexed _spender,\\n uint256 _value\\n );\\n\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping (address => uint256) public balances;\\n mapping (address => mapping (address => uint256)) public allowances;\\n\\n // Some optional extra goodies.\\n uint256 public totalSupply;\\n string public name;\\n\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _initialSupply Initial maximum token supply.\\n * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).\\n */\\n constructor(\\n uint256 _initialSupply,\\n string memory _name\\n )\\n public\\n {\\n balances[msg.sender] = _initialSupply;\\n totalSupply = _initialSupply;\\n name = _name;\\n }\\n\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Checks the balance of an address.\\n * @param _owner Address to check a balance for.\\n * @return Balance of the address.\\n */\\n function balanceOf(\\n address _owner\\n )\\n external\\n view\\n returns (\\n uint256\\n )\\n {\\n return balances[_owner];\\n }\\n\\n /**\\n * Transfers a balance from your account to someone else's account!\\n * @param _to Address to transfer a balance to.\\n * @param _amount Amount to transfer to the other account.\\n * @return true if the transfer was successful.\\n */\\n function transfer(\\n address _to,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n require(\\n balances[msg.sender] >= _amount,\\n \\\"You don't have enough balance to make this transfer!\\\"\\n );\\n\\n balances[msg.sender] -= _amount;\\n balances[_to] += _amount;\\n\\n emit Transfer(\\n msg.sender,\\n _to,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Transfers a balance from someone else's account to another account. You need an allowance\\n * from the sending account for this to work!\\n * @param _from Account to transfer a balance from.\\n * @param _to Account to transfer a balance to.\\n * @param _amount Amount to transfer to the other account.\\n * @return true if the transfer was successful.\\n */\\n function transferFrom(\\n address _from,\\n address _to,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n require(\\n balances[_from] >= _amount,\\n \\\"Can't transfer from the desired account because it doesn't have enough balance.\\\"\\n );\\n\\n require(\\n allowances[_from][msg.sender] >= _amount,\\n \\\"Can't transfer from the desired account because you don't have enough of an allowance.\\\"\\n );\\n\\n balances[_to] += _amount;\\n balances[_from] -= _amount;\\n\\n emit Transfer(\\n _from,\\n _to,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Approves an account to spend some amount from your account.\\n * @param _spender Account to approve a balance for.\\n * @param _amount Amount to allow the account to spend from your account.\\n * @return true if the allowance was successful.\\n */\\n function approve(\\n address _spender,\\n uint256 _amount\\n )\\n external\\n returns (\\n bool\\n )\\n {\\n allowances[msg.sender][_spender] = _amount;\\n\\n emit Approval(\\n msg.sender,\\n _spender,\\n _amount\\n );\\n\\n return true;\\n }\\n\\n /**\\n * Checks how much a given account is allowed to spend from another given account.\\n * @param _owner Address of the account to check an allowance from.\\n * @param _spender Address of the account trying to spend from the owner.\\n * @return Allowance for the spender from the owner.\\n */\\n function allowance(\\n address _owner,\\n address _spender\\n )\\n external\\n view\\n returns (\\n uint256\\n )\\n {\\n return allowances[_owner][_spender];\\n }\\n}\\n\",\"keccak256\":\"0x5c76dbdcd208a53d57d8f7afa0061e54cd83157cf7d0e57be8ed914d0018283c\",\"license\":\"MIT\"}},\"version\":1}",
+ "bytecode": "0x60806040523480156200001c5760008062000019620001c4565b50505b50604051620012e8380380620012e8833981810160405260408110156200004d576000806200004a620001c4565b50505b810190808051906020019092919080516040519392919084640100000000821115620000835760008062000080620001c4565b50505b83820191506020820185811115620000a557600080620000a2620001c4565b50505b8251866001820283011164010000000082111715620000ce57600080620000cb620001c4565b50505b8083526020830192505050908051906020019080838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905090810190601f168015620001325780820380516001836020036101000a031916815260200191505b50604052505050816000805a6200014862000234565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906200018e62000293565b5050508160028190620001a062000293565b5050508060039080519060200190620001bb929190620002fa565b50505062000455565b632a2a7adb598160e01b8152600481016020815285602082015260005b8681101562000201578086015181604084010152602081019050620001e1565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156200028e5760008183015260208101905062000272565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015620002f557600081830152602081019050620002d9565b505050565b828062000306620003c6565b600181600116156101000203166002900490600052602060002090601f01602090048101928262000346576000856200033e62000293565b5050620003b3565b82601f106200036c57805160ff191683800117856200036462000293565b5050620003b3565b828001600101856200037d62000293565b50508215620003b3579182015b82811115620003b257825182620003a062000293565b5050916020019190600101906200038a565b5b509050620003c291906200042b565b5090565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b604081101562000426576000818301526020810190506200040a565b505050565b5b8082111562000451576000816000906200044562000293565b5050506001016200042c565b5090565b610e8380620004656000396000f3fe608060405234801561001957600080610016610c16565b50505b506004361061009c5760003560e01c806327e235e31161006f57806327e235e31461024557806355b6ed5c146102a657806370a0823114610327578063a9059cbb14610388578063dd62ed3e146103f55761009c565b806306fdde03146100aa578063095ea7b31461012d57806318160ddd1461019a57806323b872dd146101b8575b6000806100a7610c16565b50505b6100b2610476565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f25780820151818401526020810190506100d7565b50505050905090810190601f16801561011f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101826004803603604081101561014c57600080610149610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610530565b60405180821515815260200191505060405180910390f35b6101a261063b565b6040518082815260200191505060405180910390f35b61022d600480360360608110156101d7576000806101d4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610648565b60405180821515815260200191505060405180910390f35b6102906004803603602081101561026457600080610261610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610906565b6040518082815260200191505060405180910390f35b610311600480360360408110156102c5576000806102c2610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610925565b6040518082815260200191505060405180910390f35b6103726004803603602081101561034657600080610343610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610951565b6040518082815260200191505060405180910390f35b6103dd600480360360408110156103a7576000806103a4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b60405180821515815260200191505060405180910390f35b6104606004803603604081101561041457600080610411610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b6040518082815260200191505060405180910390f35b600380610481610c84565b600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182806104bc610c84565b600181600116156101000203166002900480156105285780601f106104f65761010080836104e8610c84565b040283529160200191610528565b820191906000526020600020905b8161050d610c84565b8152906001019060200180831161050457829003601f168201915b505050505081565b600081600160005a610540610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906105c1610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a6105e4610ce7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6002610645610c84565b81565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610691610c84565b10156106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180610e00604f9139606001915050604051809103906106ee610c16565b50505b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a61073c610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061077e610c84565b10156107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526056815260200180610daa60569139606001915050604051809103906107db610c16565b50505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610829610c84565b019250508190610837610d44565b505050816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610885610c84565b039250508190610893610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000602052806000526040600020600091509050610922610c84565b81565b60016020528160005260406000206020528060005260406000206000915091505061094e610c84565b81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610999610c84565b9050919050565b6000816000805a6109af610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206109f1610c84565b1015610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180610e4f6034913960400191505060405180910390610a4e610c16565b50505b816000805a610a5e610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610aa4610c84565b039250508190610ab2610d44565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610b00610c84565b019250508190610b0e610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610b31610ce7565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c0e610c84565b905092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c51578086015181604084010152602081019050610c33565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610ce257600081830152602081019050610cc8565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610d3f57600081830152602081019050610d25565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015610da457600081830152602081019050610d8a565b50505056fe43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520796f7520646f6e2774206861766520656e6f756768206f6620616e20616c6c6f77616e63652e43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520697420646f65736e2774206861766520656e6f7567682062616c616e63652e596f7520646f6e2774206861766520656e6f7567682062616c616e636520746f206d616b652074686973207472616e7366657221",
+ "deployedBytecode": "0x608060405234801561001957600080610016610c16565b50505b506004361061009c5760003560e01c806327e235e31161006f57806327e235e31461024557806355b6ed5c146102a657806370a0823114610327578063a9059cbb14610388578063dd62ed3e146103f55761009c565b806306fdde03146100aa578063095ea7b31461012d57806318160ddd1461019a57806323b872dd146101b8575b6000806100a7610c16565b50505b6100b2610476565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f25780820151818401526020810190506100d7565b50505050905090810190601f16801561011f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101826004803603604081101561014c57600080610149610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610530565b60405180821515815260200191505060405180910390f35b6101a261063b565b6040518082815260200191505060405180910390f35b61022d600480360360608110156101d7576000806101d4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610648565b60405180821515815260200191505060405180910390f35b6102906004803603602081101561026457600080610261610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610906565b6040518082815260200191505060405180910390f35b610311600480360360408110156102c5576000806102c2610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610925565b6040518082815260200191505060405180910390f35b6103726004803603602081101561034657600080610343610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610951565b6040518082815260200191505060405180910390f35b6103dd600480360360408110156103a7576000806103a4610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b60405180821515815260200191505060405180910390f35b6104606004803603604081101561041457600080610411610c16565b50505b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b6040518082815260200191505060405180910390f35b600380610481610c84565b600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182806104bc610c84565b600181600116156101000203166002900480156105285780601f106104f65761010080836104e8610c84565b040283529160200191610528565b820191906000526020600020905b8161050d610c84565b8152906001019060200180831161050457829003601f168201915b505050505081565b600081600160005a610540610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081906105c1610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a6105e4610ce7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6002610645610c84565b81565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610691610c84565b10156106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180610e00604f9139606001915050604051809103906106ee610c16565b50505b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005a61073c610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061077e610c84565b10156107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526056815260200180610daa60569139606001915050604051809103906107db610c16565b50505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610829610c84565b019250508190610837610d44565b505050816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610885610c84565b039250508190610893610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000602052806000526040600020600091509050610922610c84565b81565b60016020528160005260406000206020528060005260406000206000915091505061094e610c84565b81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610999610c84565b9050919050565b6000816000805a6109af610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206109f1610c84565b1015610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180610e4f6034913960400191505060405180910390610a4e610c16565b50505b816000805a610a5e610ce7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610aa4610c84565b039250508190610ab2610d44565b505050816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282610b00610c84565b019250508190610b0e610d44565b5050508273ffffffffffffffffffffffffffffffffffffffff165a610b31610ce7565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610c0e610c84565b905092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015610c51578086015181604084010152602081019050610c33565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610ce257600081830152602081019050610cc8565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610d3f57600081830152602081019050610d25565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60005b6040811015610da457600081830152602081019050610d8a565b50505056fe43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520796f7520646f6e2774206861766520656e6f756768206f6620616e20616c6c6f77616e63652e43616e2774207472616e736665722066726f6d207468652064657369726564206163636f756e74206265636175736520697420646f65736e2774206861766520656e6f7567682062616c616e63652e596f7520646f6e2774206861766520656e6f7567682062616c616e636520746f206d616b652074686973207472616e7366657221",
+ "devdoc": {
+ "details": "A super simple ERC20 implementation!",
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "Address of the account to check an allowance from.",
+ "_spender": "Address of the account trying to spend from the owner."
+ },
+ "returns": {
+ "_0": "Allowance for the spender from the owner."
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_amount": "Amount to allow the account to spend from your account.",
+ "_spender": "Account to approve a balance for."
+ },
+ "returns": {
+ "_0": "true if the allowance was successful."
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "Address to check a balance for."
+ },
+ "returns": {
+ "_0": "Balance of the address."
+ }
+ },
+ "constructor": {
+ "params": {
+ "_initialSupply": "Initial maximum token supply.",
+ "_name": "A name for our ERC20 (technically optional, but it's fun ok jeez)."
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_amount": "Amount to transfer to the other account.",
+ "_to": "Address to transfer a balance to."
+ },
+ "returns": {
+ "_0": "true if the transfer was successful."
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_amount": "Amount to transfer to the other account.",
+ "_from": "Account to transfer a balance from.",
+ "_to": "Account to transfer a balance to."
+ },
+ "returns": {
+ "_0": "true if the transfer was successful."
+ }
+ }
+ },
+ "title": "ERC20",
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "allowance(address,address)": {
+ "notice": "Checks how much a given account is allowed to spend from another given account."
+ },
+ "approve(address,uint256)": {
+ "notice": "Approves an account to spend some amount from your account."
+ },
+ "balanceOf(address)": {
+ "notice": "Checks the balance of an address."
+ },
+ "transfer(address,uint256)": {
+ "notice": "Transfers a balance from your account to someone else's account!"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "Transfers a balance from someone else's account to another account. You need an allowance from the sending account for this to work!"
+ }
+ },
+ "version": 1
+ },
+ "storageLayout": {
+ "storage": [
+ {
+ "astId": 22,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "balances",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_address,t_uint256)"
+ },
+ {
+ "astId": 28,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "allowances",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
+ },
+ {
+ "astId": 30,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "totalSupply",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_uint256"
+ },
+ {
+ "astId": 32,
+ "contract": "contracts/ERC20.sol:ERC20",
+ "label": "name",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_string_storage"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "encoding": "inplace",
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32",
+ "value": "t_mapping(t_address,t_uint256)"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "encoding": "mapping",
+ "key": "t_address",
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32",
+ "value": "t_uint256"
+ },
+ "t_string_storage": {
+ "encoding": "bytes",
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "encoding": "inplace",
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/hardhat/deployments/optimism/solcInputs/a4e2764a77fec30ccb674d800c46e436.json b/omgx_examples/hardhat/deployments/optimism/solcInputs/a4e2764a77fec30ccb674d800c46e436.json
new file mode 100644
index 000000000000..9172859cb7af
--- /dev/null
+++ b/omgx_examples/hardhat/deployments/optimism/solcInputs/a4e2764a77fec30ccb674d800c46e436.json
@@ -0,0 +1,35 @@
+{
+ "language": "Solidity",
+ "sources": {
+ "contracts/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\npragma solidity >0.6.0 <0.8.0;\n\n/**\n * @title ERC20\n * @dev A super simple ERC20 implementation!\n */\ncontract ERC20 {\n\n /**********\n * Events *\n **********/\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n\n /*************\n * Variables *\n *************/\n\n mapping (address => uint256) public balances;\n mapping (address => mapping (address => uint256)) public allowances;\n\n // Some optional extra goodies.\n uint256 public totalSupply;\n string public name;\n\n\n /***************\n * Constructor *\n ***************/\n\n /**\n * @param _initialSupply Initial maximum token supply.\n * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).\n */\n constructor(\n uint256 _initialSupply,\n string memory _name\n )\n public\n {\n balances[msg.sender] = _initialSupply;\n totalSupply = _initialSupply;\n name = _name;\n }\n\n\n /********************\n * Public Functions *\n ********************/\n\n /**\n * Checks the balance of an address.\n * @param _owner Address to check a balance for.\n * @return Balance of the address.\n */\n function balanceOf(\n address _owner\n )\n external\n view\n returns (\n uint256\n )\n {\n return balances[_owner];\n }\n\n /**\n * Transfers a balance from your account to someone else's account!\n * @param _to Address to transfer a balance to.\n * @param _amount Amount to transfer to the other account.\n * @return true if the transfer was successful.\n */\n function transfer(\n address _to,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n require(\n balances[msg.sender] >= _amount,\n \"You don't have enough balance to make this transfer!\"\n );\n\n balances[msg.sender] -= _amount;\n balances[_to] += _amount;\n\n emit Transfer(\n msg.sender,\n _to,\n _amount\n );\n\n return true;\n }\n\n /**\n * Transfers a balance from someone else's account to another account. You need an allowance\n * from the sending account for this to work!\n * @param _from Account to transfer a balance from.\n * @param _to Account to transfer a balance to.\n * @param _amount Amount to transfer to the other account.\n * @return true if the transfer was successful.\n */\n function transferFrom(\n address _from,\n address _to,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n require(\n balances[_from] >= _amount,\n \"Can't transfer from the desired account because it doesn't have enough balance.\"\n );\n\n require(\n allowances[_from][msg.sender] >= _amount,\n \"Can't transfer from the desired account because you don't have enough of an allowance.\"\n );\n\n balances[_to] += _amount;\n balances[_from] -= _amount;\n\n emit Transfer(\n _from,\n _to,\n _amount\n );\n\n return true;\n }\n\n /**\n * Approves an account to spend some amount from your account.\n * @param _spender Account to approve a balance for.\n * @param _amount Amount to allow the account to spend from your account.\n * @return true if the allowance was successful.\n */\n function approve(\n address _spender,\n uint256 _amount\n )\n external\n returns (\n bool\n )\n {\n allowances[msg.sender][_spender] = _amount;\n\n emit Approval(\n msg.sender,\n _spender,\n _amount\n );\n\n return true;\n }\n\n /**\n * Checks how much a given account is allowed to spend from another given account.\n * @param _owner Address of the account to check an allowance from.\n * @param _spender Address of the account trying to spend from the owner.\n * @return Allowance for the spender from the owner.\n */\n function allowance(\n address _owner,\n address _spender\n )\n external\n view\n returns (\n uint256\n )\n {\n return allowances[_owner][_spender];\n }\n}\n"
+ }
+ },
+ "settings": {
+ "optimizer": {
+ "enabled": false,
+ "runs": 200
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata",
+ "devdoc",
+ "userdoc",
+ "storageLayout",
+ "evm.gasEstimates"
+ ],
+ "": [
+ "ast"
+ ]
+ }
+ },
+ "metadata": {
+ "useLiteralContent": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/hardhat/hardhat.config.js b/omgx_examples/hardhat/hardhat.config.js
new file mode 100644
index 000000000000..c20a94bbab28
--- /dev/null
+++ b/omgx_examples/hardhat/hardhat.config.js
@@ -0,0 +1,42 @@
+require('@nomiclabs/hardhat-ethers')
+require('@nomiclabs/hardhat-waffle')
+require('hardhat-deploy')
+require('@eth-optimism/hardhat-ovm')
+
+module.exports = {
+ networks: {
+ // Add this network to your config!
+ optimism: {
+ url: 'http://127.0.0.1:8545',
+ // instantiate with a mnemonic so that you have >1 accounts available
+ accounts: {
+ mnemonic: 'test test test test test test test test test test test junk'
+ },
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance (yet, sorry!).
+ gasPrice: 0,
+ ovm: true // This sets the network as using the ovm and ensure contract will be compiled against that.
+ },
+ // Add this network to your config!
+ omgx_rinkeby: {
+ url: 'https://rinkeby.omgx.network',
+ // instantiate with a mnemonic so that you have >1 accounts available
+ accounts: {
+ mnemonic: 'test test test test test test test test test test test junk'
+ },
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance (yet, sorry!).
+ gasPrice: 0,
+ ovm: true // This sets the network as using the ovm and ensure contract will be compiled against that.
+ },
+ },
+ solidity: '0.7.6',
+ ovm: {
+ solcVersion: '0.7.6'
+ },
+ namedAccounts: {
+ deployer: 0
+ },
+}
diff --git a/omgx_examples/hardhat/package.json b/omgx_examples/hardhat/package.json
new file mode 100644
index 000000000000..5a1e7824dd3e
--- /dev/null
+++ b/omgx_examples/hardhat/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@omgx/hardhat-example",
+ "private": true,
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "Optimism PBC",
+ "license": "MIT",
+ "scripts": {
+ "clean": "rimraf ./cache-ovm ./cache ./artifacts-ovm ./artifacts ./deployments",
+ "compile": "hardhat compile",
+ "compile:ovm": "hardhat compile --network optimism",
+ "compile:omgx": "hardhat compile --network omgx_rinkeby",
+ "test:integration": "hardhat test",
+ "test:integration:ovm": "hardhat test --network optimism",
+ "test:integration:omgx": "hardhat test --network omgx_rinkeby",
+ "deploy": "hardhat deploy",
+ "deploy:ovm": "hardhat deploy --network optimism",
+ "deploy:omgx": "hardhat deploy --network omgx_rinkeby"
+ },
+ "devDependencies": {
+ "@nomiclabs/hardhat-ethers": "^2.0.1",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "@types/chai": "4.2.17",
+ "@types/mocha": "^8.2.2",
+ "chai": "4.3.4",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.1.4",
+ "hardhat": "^2.2.0",
+ "hardhat-deploy": "^0.7.5",
+ "mocha": "^8.2.1"
+ },
+ "dependencies": {
+ "@eth-optimism/hardhat-ovm": "^0.2.0"
+ }
+}
diff --git a/omgx_examples/hardhat/test/erc20.test.js b/omgx_examples/hardhat/test/erc20.test.js
new file mode 100644
index 000000000000..974e80fb7410
--- /dev/null
+++ b/omgx_examples/hardhat/test/erc20.test.js
@@ -0,0 +1,110 @@
+/* External Imports */
+const { ethers, network } = require('hardhat')
+const chai = require('chai')
+const { solidity } = require('ethereum-waffle')
+const { expect } = chai
+
+chai.use(solidity)
+
+describe(`ERC20`, () => {
+ const INITIAL_SUPPLY = 1000000
+ const TOKEN_NAME = 'An Optimistic ERC20'
+
+ let account1
+ let account2
+ before(`load accounts`, async () => {
+ ;[ account1, account2 ] = await ethers.getSigners()
+ })
+
+ let ERC20
+ beforeEach(`deploy ERC20 contract`, async () => {
+ const Factory__ERC20 = await ethers.getContractFactory('ERC20')
+ ERC20 = await Factory__ERC20.connect(account1).deploy(
+ INITIAL_SUPPLY,
+ TOKEN_NAME
+ )
+
+ await ERC20.deployTransaction.wait()
+ })
+
+ it(`should have a name`, async () => {
+ const tokenName = await ERC20.name()
+ expect(tokenName).to.equal(TOKEN_NAME)
+ })
+
+ it(`should have a total supply equal to the initial supply`, async () => {
+ const tokenSupply = await ERC20.totalSupply()
+ expect(tokenSupply).to.equal(INITIAL_SUPPLY)
+ })
+
+ it(`should give the initial supply to the creator's address`, async () => {
+ const balance = await ERC20.balanceOf(await account1.getAddress())
+ expect(balance).to.equal(INITIAL_SUPPLY)
+ })
+
+ describe(`transfer(...)`, () => {
+ it(`should revert when the sender does not have enough balance`, async () => {
+ const tx = ERC20.connect(account1).transfer(
+ await account2.getAddress(),
+ INITIAL_SUPPLY + 1
+ )
+ await expect(tx).to.be.revertedWith("You don't have enough balance to make this transfer!")
+ })
+
+ it(`should succeed when the sender has enough balance`, async () => {
+ const tx = await ERC20.connect(account1).transfer(
+ await account2.getAddress(),
+ INITIAL_SUPPLY
+ )
+ await tx.wait()
+
+ expect(
+ (await ERC20.balanceOf(
+ await account1.getAddress()
+ )).toNumber()
+ ).to.equal(0)
+ expect(
+ (await ERC20.balanceOf(
+ await account2.getAddress()
+ )).toNumber()
+ ).to.equal(INITIAL_SUPPLY)
+ })
+ })
+
+ describe(`transferFrom(...)`, () => {
+ it(`should revert when the sender does not have enough of an allowance`, async () => {
+ const tx = ERC20.connect(account2).transferFrom(
+ await account1.getAddress(),
+ await account2.getAddress(),
+ INITIAL_SUPPLY
+ )
+ await expect(tx).to.be.revertedWith("Can't transfer from the desired account because you don't have enough of an allowance.")
+ })
+
+ it(`should succeed when the owner has enough balance and the sender has a large enough allowance`, async () => {
+ const tx1 = await ERC20.connect(account1).approve(
+ await account2.getAddress(),
+ INITIAL_SUPPLY
+ )
+ await tx1.wait()
+
+ const tx2 = await ERC20.connect(account2).transferFrom(
+ await account1.getAddress(),
+ await account2.getAddress(),
+ INITIAL_SUPPLY
+ )
+ await tx2.wait()
+
+ expect(
+ (await ERC20.balanceOf(
+ await account1.getAddress()
+ )).toNumber()
+ ).to.equal(0)
+ expect(
+ (await ERC20.balanceOf(
+ await account2.getAddress()
+ )).toNumber()
+ ).to.equal(INITIAL_SUPPLY)
+ })
+ })
+})
diff --git a/omgx_examples/hardhat/yarn.lock b/omgx_examples/hardhat/yarn.lock
new file mode 100644
index 000000000000..ddb257af4093
--- /dev/null
+++ b/omgx_examples/hardhat/yarn.lock
@@ -0,0 +1,8064 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ensdomains/ens@^0.4.4":
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc"
+ integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==
+ dependencies:
+ bluebird "^3.5.2"
+ eth-ens-namehash "^2.0.8"
+ solc "^0.4.20"
+ testrpc "0.0.1"
+ web3-utils "^1.0.0-beta.31"
+
+"@ensdomains/resolver@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
+ integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
+
+"@eth-optimism/hardhat-ovm@^0.2.0":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.2.2.tgz#55fafaa6b8277447abaf132602c1c6d14a2a18a2"
+ integrity sha512-QLzqawYCzC/m6K/Oaj/tCZQlu6kZTgnleg1cJad8kVYA5E+JWZQ6ZJrcStoJoJrco9RIroPUjAFEhFM8YiCc7Q==
+ dependencies:
+ node-fetch "^2.6.1"
+
+"@ethereum-waffle/chai@^3.3.0":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.3.1.tgz#3f20b810d0fa516f19af93c50c3be1091333fa8e"
+ integrity sha512-+vepCjttfOzCSnmiVEmd1bR8ctA2wYVrtWa8bDLhnTpj91BIIHotNDTwpeq7fyjrOCIBTN3Ai8ACfjNoatc4OA==
+ dependencies:
+ "@ethereum-waffle/provider" "^3.3.1"
+ ethers "^5.0.0"
+
+"@ethereum-waffle/compiler@^3.3.0":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.3.1.tgz#946128fd565aa4347075fd716dbd0f3f38189280"
+ integrity sha512-X/TeQugt94AQwXEdCjIQxcXYGawNulVBYEBE7nloj4wE/RBxNolXwjoVNjcS4kuiMMbKkdO0JkL5sn6ixx8bDg==
+ dependencies:
+ "@resolver-engine/imports" "^0.3.3"
+ "@resolver-engine/imports-fs" "^0.3.3"
+ "@typechain/ethers-v5" "^2.0.0"
+ "@types/mkdirp" "^0.5.2"
+ "@types/node-fetch" "^2.5.5"
+ ethers "^5.0.1"
+ mkdirp "^0.5.1"
+ node-fetch "^2.6.0"
+ solc "^0.6.3"
+ ts-generator "^0.1.1"
+ typechain "^3.0.0"
+
+"@ethereum-waffle/ens@^3.2.4":
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.4.tgz#c486be4879ea7107e1ff01b24851a5e44f5946ce"
+ integrity sha512-lkRVPCEkk7KOwH9MqFMB+gL0X8cZNsm+MnKpP9CNbAyhFos2sCDGcY8t6BA12KBK6pdMuuRXPxYL9WfPl9bqSQ==
+ dependencies:
+ "@ensdomains/ens" "^0.4.4"
+ "@ensdomains/resolver" "^0.2.4"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/mock-contract@^3.2.2":
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.2.2.tgz#5749b03cbb4850150f81cf66151c4523eb7436f0"
+ integrity sha512-H60Cc5C7sYNU4LuPMSKDh8YIaN9/fkwEjznY78CEbOosO+lMlFYdA+5VZjeDGDuYKfsBqsocQdkj1CRyoi1KNw==
+ dependencies:
+ "@ethersproject/abi" "^5.0.1"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/provider@^3.3.0", "@ethereum-waffle/provider@^3.3.1":
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.3.2.tgz#33677baf6af5cbb087c3072d84f38c152968ebb1"
+ integrity sha512-ilz6cXK0ylSKCmZktTMpY4gjo0CN6rb86JfN7+RZYk6tKtZA6sXoOe95skWEQkGf1fZk7G817fTzLb0CmFDp1g==
+ dependencies:
+ "@ethereum-waffle/ens" "^3.2.4"
+ ethers "^5.0.1"
+ ganache-core "^2.13.2"
+ patch-package "^6.2.2"
+ postinstall-postinstall "^2.1.0"
+
+"@ethereumjs/block@^3.2.1", "@ethereumjs/block@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.3.0.tgz#a1b3baec831c71c0d9e7f6145f25e919cff4939c"
+ integrity sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA==
+ dependencies:
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/tx" "^3.2.0"
+ ethereumjs-util "^7.0.10"
+ merkle-patricia-tree "^4.2.0"
+
+"@ethereumjs/blockchain@^5.2.1", "@ethereumjs/blockchain@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.3.0.tgz#206936e30a4320d87a26e58d157eadef21ef6ff1"
+ integrity sha512-B0Y5QDZcRDQISPilv3m8nzk97QmC98DnSE9WxzGpCxfef22Mw7xhwGipci5Iy0dVC2Np2Cr5d3F6bHAR7+yVmQ==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/ethash" "^1.0.0"
+ debug "^2.2.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+"@ethereumjs/common@^2.2.0", "@ethereumjs/common@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.3.0.tgz#b1174fab8653565b4835a455d972dc2e89411896"
+ integrity sha512-Fmi15MdVptsC85n6NcUXIFiiXCXWEfZNgPWP+OGAQOC6ZtdzoNawtxH/cYpIgEgSuIzfOeX3VKQP/qVI1wISHg==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.0.10"
+
+"@ethereumjs/ethash@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
+ integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.7"
+ miller-rabin "^4.0.0"
+
+"@ethereumjs/tx@^3.1.3", "@ethereumjs/tx@^3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.2.0.tgz#2a816d5db67eb36059c8dc13f022f64e9b8d7ab9"
+ integrity sha512-D3X/XtZ3ldUg34hr99Jvj7NxW3NxVKdUKrwQnEWlAp4CmCQpvYoyn7NF4lk34rHEt7ScS+Agu01pcDHoOcd19A==
+ dependencies:
+ "@ethereumjs/common" "^2.3.0"
+ ethereumjs-util "^7.0.10"
+
+"@ethereumjs/vm@^5.3.2":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.4.0.tgz#092d530388e855310406160f144d6f492800c0ea"
+ integrity sha512-0Mv51inp5S/mh+fKP0H90byT/5DdFirChUFUMhEjDlIBnHK55o/liKZ+0iNSLm6ZxX8iPs7urp11/UCoxPJfLA==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/blockchain" "^5.3.0"
+ "@ethereumjs/common" "^2.3.0"
+ "@ethereumjs/tx" "^3.2.0"
+ async-eventemitter "^0.2.4"
+ core-js-pure "^3.0.1"
+ debug "^2.2.0"
+ ethereumjs-util "^7.0.10"
+ functional-red-black-tree "^1.0.1"
+ mcl-wasm "^0.7.1"
+ merkle-patricia-tree "^4.2.0"
+ rustbn.js "~0.2.0"
+ util.promisify "^1.0.1"
+
+"@ethersproject/abi@5.0.0-beta.153":
+ version "5.0.0-beta.153"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
+ integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==
+ dependencies:
+ "@ethersproject/address" ">=5.0.0-beta.128"
+ "@ethersproject/bignumber" ">=5.0.0-beta.130"
+ "@ethersproject/bytes" ">=5.0.0-beta.129"
+ "@ethersproject/constants" ">=5.0.0-beta.128"
+ "@ethersproject/hash" ">=5.0.0-beta.128"
+ "@ethersproject/keccak256" ">=5.0.0-beta.127"
+ "@ethersproject/logger" ">=5.0.0-beta.129"
+ "@ethersproject/properties" ">=5.0.0-beta.131"
+ "@ethersproject/strings" ">=5.0.0-beta.130"
+
+"@ethersproject/abi@5.3.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.0.tgz#00f0647d906edcd32c50b16ab9c98f83e208dcf1"
+ integrity sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz#f4c0ae4a4cef9f204d7781de805fd44b72756c81"
+ integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+
+"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz#05172b653e15b535ed5854ef5f6a72f4b441052d"
+ integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/address@5.3.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.3.0.tgz#e53b69eacebf332e8175de814c5e6507d6932518"
+ integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+
+"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.3.0.tgz#b831fb35418b42ad24d943c557259062b8640824"
+ integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+
+"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.3.0.tgz#02dea3ab8559ae625c6d548bc11773432255c916"
+ integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db"
+ integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9"
+ integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/constants@5.3.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77"
+ integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+
+"@ethersproject/contracts@5.3.0", "@ethersproject/contracts@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.3.0.tgz#ad699a3abaae30bfb6422cf31813a663b2d4099c"
+ integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==
+ dependencies:
+ "@ethersproject/abi" "^5.3.0"
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+
+"@ethersproject/hash@5.3.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.3.0.tgz#f65e3bf3db3282df4da676db6cfa049535dd3643"
+ integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.3.0.tgz#26fed65ffd5c25463fddff13f5fb4e5617553c94"
+ integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz#7b1a5ff500c12aa8597ae82c8939837b0449376e"
+ integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be"
+ integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@5.3.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0"
+ integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==
+
+"@ethersproject/networks@5.3.0", "@ethersproject/networks@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.0.tgz#d8ad06eb107c69fb8651f4c81ddd0e88944fdfea"
+ integrity sha512-XGbD9MMgqrR7SYz8o6xVgdG+25v7YT5vQG8ZdlcLj2I7elOBM7VNeQrnxfSN7rWQNcqu2z80OM29gGbQz+4Low==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz#8adbb41489c3c9f319cc44bc7d3e6095fd468dc8"
+ integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+
+"@ethersproject/properties@5.3.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.3.0.tgz#feef4c4babeb7c10a6b3449575016f4ad2c092b2"
+ integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/providers@5.3.0", "@ethersproject/providers@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.3.0.tgz#bccb49f1073a7d56e24f49abb14bb281c9b08636"
+ integrity sha512-HtL+DEbzPcRyfrkrMay7Rk/4he+NbUpzI/wHXP4Cqtra82nQOnqqCgTQc4HbdDrl75WVxG/JRMFhyneIPIMZaA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.3.0", "@ethersproject/random@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.3.0.tgz#7c46bf36e50cb0d0550bc8c666af8e1d4496dc1a"
+ integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.3.0.tgz#7cb93a7b5dfa69163894153c9d4b0d936f333188"
+ integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366"
+ integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.3.0.tgz#a96c88f8173e1abedfa35de32d3e5db7c48e5259"
+ integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.3.0", "@ethersproject/solidity@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93"
+ integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/strings@5.3.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0"
+ integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.3.0.tgz#49b86f2bafa4d0bdf8e596578fc795ee47c50458"
+ integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+
+"@ethersproject/units@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.3.0.tgz#c4d1493532ad3d4ddf6e2bc4f8c94a2db933a8f5"
+ integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/wallet@5.3.0", "@ethersproject/wallet@^5.0.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.3.0.tgz#91946b470bd279e39ade58866f21f92749d062af"
+ integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/json-wallets" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/web@5.3.0", "@ethersproject/web@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.3.0.tgz#7959c403f6476c61515008d8f92da51c553a8ee1"
+ integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==
+ dependencies:
+ "@ethersproject/base64" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.3.0.tgz#45a0205f5178c1de33d316cb2ab7ed5eac3c06c5"
+ integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@nomiclabs/hardhat-ethers@^2.0.1":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
+ integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
+
+"@nomiclabs/hardhat-waffle@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2"
+ integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==
+ dependencies:
+ "@types/sinon-chai" "^3.2.3"
+ "@types/web3" "1.0.19"
+
+"@resolver-engine/core@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967"
+ integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==
+ dependencies:
+ debug "^3.1.0"
+ is-url "^1.2.4"
+ request "^2.85.0"
+
+"@resolver-engine/fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973"
+ integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports-fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b"
+ integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==
+ dependencies:
+ "@resolver-engine/fs" "^0.3.3"
+ "@resolver-engine/imports" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc"
+ integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+ hosted-git-info "^2.6.0"
+ path-browserify "^1.0.0"
+ url "^0.11.0"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/hub" "5.30.0"
+ "@sentry/tracing" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^7.1.0":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@solidity-parser/parser@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add"
+ integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@typechain/ethers-v5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810"
+ integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==
+ dependencies:
+ ethers "^5.0.2"
+
+"@types/abstract-leveldown@*":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e"
+ integrity sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ==
+
+"@types/bn.js@*", "@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai@*":
+ version "4.2.18"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4"
+ integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ==
+
+"@types/chai@4.2.17":
+ version "4.2.17"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.17.tgz#85f9f0610f514b22a94125d441f73eef65bde5cc"
+ integrity sha512-LaiwWNnYuL8xJlQcE91QB2JoswWZckq9A4b+nMPq8dt8AP96727Nb3X4e74u+E3tm4NLTILNI9MYFsyVc30wSA==
+
+"@types/levelup@^4.3.0":
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.1.tgz#7a53b9fd510716e11b2065332790fdf5f9b950b9"
+ integrity sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A==
+ dependencies:
+ "@types/abstract-leveldown" "*"
+ "@types/node" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03"
+ integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==
+
+"@types/mkdirp@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+ integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/mocha@^8.2.2":
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
+ integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
+
+"@types/node-fetch@^2.5.5":
+ version "2.5.10"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132"
+ integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08"
+ integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==
+
+"@types/node@^12.12.6":
+ version "12.20.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364"
+ integrity sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0"
+ integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==
+
+"@types/qs@^6.9.4":
+ version "6.9.6"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
+ integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
+
+"@types/resolve@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d"
+ integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==
+ dependencies:
+ "@types/node" "*"
+
+"@types/sinon-chai@^3.2.3":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48"
+ integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*":
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.1.tgz#97ccb0482b750f5140ffdc661240ebbbe6e28d75"
+ integrity sha512-tZulsvuJwif5ddTBtscflI7gJcd+RpENcNZ7QCp0jKEl0bZY3Pu6PbJs4GR3SfQkGgsUa+FrlKsKQ0XyGNvDuA==
+ dependencies:
+ "@sinonjs/fake-timers" "^7.1.0"
+
+"@types/underscore@*":
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.2.tgz#9441e0f6402bbcb72dbee771582fa57c5a1dedd3"
+ integrity sha512-Ls2ylbo7++ITrWk2Yc3G/jijwSq5V3GT0tlgVXEl2kKYXY3ImrtmTCoE2uyTWFRI5owMBriloZFWbE1SXOsE7w==
+
+"@types/web3@1.0.19":
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924"
+ integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==
+ dependencies:
+ "@types/bn.js" "*"
+ "@types/underscore" "*"
+
+"@ungap/promise-all-settled@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
+ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
+
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
+ integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
+ integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
+ integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
+ansi-colors@4.1.1, ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
+ integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
+ dependencies:
+ typical "^2.6.0"
+
+array-back@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022"
+ integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
+ dependencies:
+ typical "^2.6.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-eventemitter@^0.2.2, async-eventemitter@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
+ integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+ dependencies:
+ lodash "^4.17.11"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+axios@^0.21.1:
+ version "0.21.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
+ integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
+ dependencies:
+ follow-redirects "^1.10.0"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.14, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ 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"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
+ dependencies:
+ 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@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+ integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+ integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+ integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
+ dependencies:
+ 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@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
+ dependencies:
+ 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@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
+ dependencies:
+ 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@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ 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@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ 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@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babelify@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+ integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ 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"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bip39@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
+ integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
+ dependencies:
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ unorm "^1.3.3"
+
+blakejs@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5"
+ integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U=
+
+bluebird@^3.5.0, bluebird@^3.5.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer-xor@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289"
+ integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+bytewise-core@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
+ integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+ dependencies:
+ typewise-core "^1.2"
+
+bytewise@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e"
+ integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
+ dependencies:
+ bytewise-core "^1.2.2"
+ typewise "^1.0.3"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ 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"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+cachedown@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15"
+ integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+ dependencies:
+ abstract-leveldown "^2.4.1"
+ lru-cache "^3.2.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30001232"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001232.tgz#2ebc8b6a77656fd772ab44a82a332a26a17e9527"
+ integrity sha512-e4Gyp7P8vqC2qV2iHA+cJNf/yqUKOShXQOJHQt81OHxlIZl/j/j3soEA0adAQi8CPUQgvOdDENyQ5kd6a6mNSg==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chai@4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
+ integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.1"
+ type-detect "^4.0.5"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
+chokidar@3.5.1, chokidar@^3.4.0:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@2.1.2, clone@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46"
+ integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
+ dependencies:
+ array-back "^2.0.0"
+ find-replace "^1.0.3"
+ typical "^2.6.1"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-pure@^3.0.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.1.tgz#5d139d346780f015f67225f45ee2362a6bed6ba1"
+ integrity sha512-wVlh0IAi2t1iOEh16y4u1TRk6ubd4KvLE8dlMi+3QUI6SfKphQUh7tAwihGGSQ8affxEXpVIPpOdf9kjR4v4Pw==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+crc-32@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+ integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
+ dependencies:
+ exit-on-epipe "~1.0.1"
+ printj "~1.1.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@4, debug@4.3.1, debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
+ integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ inherits "^2.0.3"
+
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotignore@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
+ integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
+ dependencies:
+ minimatch "^3.0.4"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.47:
+ version "1.3.743"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.743.tgz#fcec24d6d647cb84fd796b42caa1b4039a180894"
+ integrity sha512-K2wXfo9iZQzNJNx67+Pld0DRF+9bYinj62gXCdgPhcu1vidwVuLPHQPPFnCdO55njWigXXpfBiT90jGUPbw8Zg==
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encode-utf8@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+ integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@5.0.4, encoding-down@~5.0.0:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614"
+ integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
+ dependencies:
+ abstract-leveldown "^5.0.0"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+ xtend "^4.0.1"
+
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
+encoding@^0.1.11:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enquirer@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
+ integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
+ dependencies:
+ 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-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f"
+ integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==
+ dependencies:
+ cross-fetch "^2.1.1"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
+ integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==
+ dependencies:
+ 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"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-sig-util@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e"
+ integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==
+ dependencies:
+ 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-sig-util@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
+ integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
+ dependencies:
+ ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
+ ethereumjs-util "^5.1.1"
+
+eth-sig-util@^2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5"
+ integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==
+ dependencies:
+ ethereumjs-abi "0.6.8"
+ ethereumjs-util "^5.1.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.0"
+
+eth-tx-summary@^3.1.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
+ integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
+ dependencies:
+ 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"
+
+ethashjs@~0.0.7:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9"
+ integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==
+ dependencies:
+ async "^2.1.2"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.2"
+ miller-rabin "^4.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz#4a59dead803af0c9e33834170bd7695df67061ec"
+ integrity sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-waffle@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.3.0.tgz#166a0cc1d3b2925f117b20ef0951b3fe72e38e79"
+ integrity sha512-4xm3RWAPCu5LlaVxYEg0tG3L7g5ovBw1GY/UebrzZ+OTx22vcPjI+bvelFlGBpkdnO5yOIFXjH2eK59tNAe9IA==
+ dependencies:
+ "@ethereum-waffle/chai" "^3.3.0"
+ "@ethereum-waffle/compiler" "^3.3.0"
+ "@ethereum-waffle/mock-contract" "^3.2.2"
+ "@ethereum-waffle/provider" "^3.3.0"
+ ethers "^5.0.1"
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.8"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9"
+ integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
+ dependencies:
+ ethereumjs-util "^6.0.0"
+ rlp "^2.2.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-blockchain@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f"
+ integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==
+ dependencies:
+ async "^2.6.1"
+ ethashjs "~0.0.7"
+ ethereumjs-block "~2.2.2"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.1.0"
+ flow-stoplight "^1.0.0"
+ level-mem "^3.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.2"
+ semaphore "^1.1.0"
+
+ethereumjs-common@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd"
+ integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==
+
+ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
+ integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
+
+ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0"
+ integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7:
+ version "7.0.10"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
+ integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab"
+ integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.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"
+ util.promisify "^1.0.0"
+
+ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
+ integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474"
+ integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^6.0.0"
+ randombytes "^2.0.6"
+ safe-buffer "^5.1.2"
+ scryptsy "^1.2.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.4:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.0.tgz#1ec14d09c461e8f2554b00cd080e94a3094e7e9d"
+ integrity sha512-myN+338S4sFQZvQ9trii7xit8Hu/LnUtjA0ROFOHpUreQc3fgLZEMNVqF3vM1u2D78DIIeG1TbuozVCVlXQWvQ==
+ dependencies:
+ "@ethersproject/abi" "5.3.0"
+ "@ethersproject/abstract-provider" "5.3.0"
+ "@ethersproject/abstract-signer" "5.3.0"
+ "@ethersproject/address" "5.3.0"
+ "@ethersproject/base64" "5.3.0"
+ "@ethersproject/basex" "5.3.0"
+ "@ethersproject/bignumber" "5.3.0"
+ "@ethersproject/bytes" "5.3.0"
+ "@ethersproject/constants" "5.3.0"
+ "@ethersproject/contracts" "5.3.0"
+ "@ethersproject/hash" "5.3.0"
+ "@ethersproject/hdnode" "5.3.0"
+ "@ethersproject/json-wallets" "5.3.0"
+ "@ethersproject/keccak256" "5.3.0"
+ "@ethersproject/logger" "5.3.0"
+ "@ethersproject/networks" "5.3.0"
+ "@ethersproject/pbkdf2" "5.3.0"
+ "@ethersproject/properties" "5.3.0"
+ "@ethersproject/providers" "5.3.0"
+ "@ethersproject/random" "5.3.0"
+ "@ethersproject/rlp" "5.3.0"
+ "@ethersproject/sha2" "5.3.0"
+ "@ethersproject/signing-key" "5.3.0"
+ "@ethersproject/solidity" "5.3.0"
+ "@ethersproject/strings" "5.3.0"
+ "@ethersproject/transactions" "5.3.0"
+ "@ethersproject/units" "5.3.0"
+ "@ethersproject/wallet" "5.3.0"
+ "@ethersproject/web" "5.3.0"
+ "@ethersproject/wordlists" "5.3.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exit-on-epipe@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+ integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ 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"
+
+express@^4.14.0:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ 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"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-replace@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
+ integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+flow-stoplight@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
+ integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+
+fmix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c"
+ integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=
+ dependencies:
+ imul "^1.0.0"
+
+follow-redirects@^1.10.0, follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3, for-each@~0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2, fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fsevents@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1, function-bind@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+ganache-core@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3"
+ integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==
+ dependencies:
+ abstract-leveldown "3.0.0"
+ async "2.6.2"
+ bip39 "2.5.0"
+ cachedown "1.0.0"
+ clone "2.1.2"
+ debug "3.2.6"
+ encoding-down "5.0.4"
+ eth-sig-util "3.0.0"
+ ethereumjs-abi "0.6.8"
+ ethereumjs-account "3.0.0"
+ ethereumjs-block "2.2.2"
+ ethereumjs-common "1.5.0"
+ ethereumjs-tx "2.1.2"
+ ethereumjs-util "6.2.1"
+ ethereumjs-vm "4.2.0"
+ heap "0.2.6"
+ keccak "3.0.1"
+ level-sublevel "6.6.4"
+ levelup "3.1.1"
+ lodash "4.17.20"
+ lru-cache "5.1.1"
+ merkle-patricia-tree "3.0.0"
+ patch-package "6.2.2"
+ seedrandom "3.0.1"
+ source-map-support "0.5.12"
+ tmp "0.1.0"
+ web3-provider-engine "14.2.1"
+ websocket "1.0.32"
+ optionalDependencies:
+ ethereumjs-wallet "0.6.5"
+ web3 "1.2.11"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ 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@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ 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@^7.1.2, glob@^7.1.3, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hardhat-deploy@^0.7.5:
+ version "0.7.10"
+ resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.10.tgz#2bc94bf36db5f39aa488c6c6569f07d5ca4b410a"
+ integrity sha512-+0oiEWy/FgKOEzRNhSWPqSjofVCwtkK3E5x916kbZ5SgFGOjWTFCrWbWUYjzc2GyZgNXuSuRn8mBowHSLF4sVg==
+ dependencies:
+ "@ethersproject/abi" "^5.0.0"
+ "@ethersproject/abstract-signer" "^5.0.0"
+ "@ethersproject/address" "^5.0.0"
+ "@ethersproject/bignumber" "^5.0.0"
+ "@ethersproject/bytes" "^5.0.0"
+ "@ethersproject/contracts" "^5.0.0"
+ "@ethersproject/providers" "^5.0.0"
+ "@ethersproject/solidity" "^5.0.0"
+ "@ethersproject/transactions" "^5.0.0"
+ "@ethersproject/wallet" "^5.0.0"
+ "@types/qs" "^6.9.4"
+ axios "^0.21.1"
+ chalk "^4.1.0"
+ chokidar "^3.4.0"
+ debug "^4.1.1"
+ form-data "^3.0.0"
+ fs-extra "^9.0.0"
+ match-all "^1.2.6"
+ murmur-128 "^0.2.1"
+ qs "^6.9.4"
+
+hardhat@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.3.0.tgz#5c29f8b4d08155c3dc8c908af9713fd5079522d5"
+ integrity sha512-nc4ro2bM4wPaA6/0Y22o5F5QrifQk2KCyPUUKLPUeFFZoGNGYB8vmeW/k9gV9DdMukdWTzfYlKc2Jn4bfb6tDQ==
+ dependencies:
+ "@ethereumjs/block" "^3.2.1"
+ "@ethereumjs/blockchain" "^5.2.1"
+ "@ethereumjs/common" "^2.2.0"
+ "@ethereumjs/tx" "^3.1.3"
+ "@ethereumjs/vm" "^5.3.2"
+ "@sentry/node" "^5.18.1"
+ "@solidity-parser/parser" "^0.11.0"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ abort-controller "^3.0.0"
+ adm-zip "^0.4.16"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ eth-sig-util "^2.5.2"
+ ethereum-cryptography "^0.1.2"
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^7.0.10"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "^7.1.3"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ lodash "^4.17.11"
+ merkle-patricia-tree "^4.1.0"
+ mnemonist "^0.38.0"
+ mocha "^7.1.2"
+ node-fetch "^2.6.0"
+ qs "^6.7.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ slash "^3.0.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ "true-case-path" "^2.2.1"
+ tsort "0.0.1"
+ uuid "^3.3.2"
+ ws "^7.2.1"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3, has@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+immutable@^4.0.0-rc.12:
+ version "4.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
+ integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
+
+imul@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9"
+ integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-regex@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+ integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+ dependencies:
+ has "^1.0.3"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
+ integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
+ dependencies:
+ argparse "^2.0.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9"
+ integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
+ dependencies:
+ 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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
+ integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
+ dependencies:
+ inherits "^2.0.1"
+
+json-rpc-random-id@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+ integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@3.0.1, keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
+ integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
+ integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4"
+ integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.5"
+ xtend "^4.0.0"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
+ integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ xtend "^4.0.0"
+
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
+level-mem@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
+ integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
+ dependencies:
+ level-packager "~4.0.0"
+ memdown "~3.0.0"
+
+level-mem@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d"
+ integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==
+ dependencies:
+ level-packager "^5.0.3"
+ memdown "^5.0.0"
+
+level-packager@^5.0.3:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
+level-packager@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
+ integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
+ dependencies:
+ encoding-down "~5.0.0"
+ levelup "^3.0.0"
+
+level-post@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0"
+ integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
+ dependencies:
+ ltgt "^2.1.2"
+
+level-sublevel@6.6.4:
+ version "6.6.4"
+ resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba"
+ integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==
+ dependencies:
+ 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"
+
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level-ws@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b"
+ integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.8"
+ xtend "^4.0.1"
+
+level-ws@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339"
+ integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^3.1.0"
+ xtend "^4.0.1"
+
+levelup@3.1.1, levelup@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
+ integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
+ dependencies:
+ deferred-leveldown "~4.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~3.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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"
+
+levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash@4.17.20:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+log-symbols@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+looper@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
+ integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
+
+looper@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749"
+ integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@5.1.1, lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+ integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
+ dependencies:
+ pseudomap "^1.0.1"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
+ltgt@^2.1.2, ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+ltgt@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
+ integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+match-all@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d"
+ integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==
+
+mcl-wasm@^0.7.1:
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.7.tgz#fd463dd1641a37f9f55b6ca8e5a38e95be2bc58f"
+ integrity sha512-jDGiCQA++5hX37gdH6RDZ3ZsA0raet7xyY/R5itj5cbcdf4Gvw+YyxWX/ZZ0Z2UPxJiw1ktRsCJZzpnqlQILdw==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memdown@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb"
+ integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.2.0"
+
+memdown@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
+ integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.1.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merkle-patricia-tree@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8"
+ integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==
+ dependencies:
+ async "^2.6.1"
+ ethereumjs-util "^5.2.0"
+ level-mem "^3.0.1"
+ level-ws "^1.0.0"
+ readable-stream "^3.0.6"
+ rlp "^2.0.0"
+ semaphore ">=1.0.1"
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
+ integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
+ dependencies:
+ 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"
+
+merkle-patricia-tree@^4.1.0, merkle-patricia-tree@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1"
+ integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ level-ws "^2.0.0"
+ readable-stream "^3.6.0"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mnemonist@^0.38.0:
+ version "0.38.3"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d"
+ integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==
+ dependencies:
+ obliterator "^1.6.1"
+
+mocha@^7.1.2:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+ dependencies:
+ ansi-colors "3.2.3"
+ browser-stdout "1.3.1"
+ chokidar "3.3.0"
+ debug "3.2.6"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ find-up "3.0.0"
+ glob "7.1.3"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ mkdirp "0.5.5"
+ ms "2.1.1"
+ node-environment-flags "1.0.6"
+ object.assign "4.1.0"
+ strip-json-comments "2.0.1"
+ supports-color "6.0.0"
+ which "1.3.1"
+ wide-align "1.1.3"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
+mocha@^8.2.1:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
+ integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+ dependencies:
+ "@ungap/promise-all-settled" "1.1.2"
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.5.1"
+ debug "4.3.1"
+ diff "5.0.0"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "4.0.0"
+ log-symbols "4.0.0"
+ minimatch "3.0.4"
+ ms "2.1.3"
+ nanoid "3.1.20"
+ serialize-javascript "5.0.1"
+ strip-json-comments "3.1.1"
+ supports-color "8.1.1"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.1.0"
+ yargs "16.2.0"
+ yargs-parser "20.2.4"
+ yargs-unparser "2.0.0"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+murmur-128@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d"
+ integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==
+ dependencies:
+ encode-utf8 "^1.0.2"
+ fmix "^0.1.0"
+ imul "^1.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanoid@3.1.20:
+ version "3.1.20"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
+ integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ 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"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
+ dependencies:
+ object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-inspect@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+obliterator@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3"
+ integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==
+
+oboe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
+ integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+patch-package@6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+patch-package@^6.2.2:
+ version "6.4.7"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
+ integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+path-browserify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.1.2:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18"
+ integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==
+
+printj@~1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+ integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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@^1.1.9:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b"
+ integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
+
+pull-defer@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113"
+ integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
+
+pull-level@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac"
+ integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==
+ dependencies:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5"
+ integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
+ dependencies:
+ pull-cat "^1.1.9"
+ pull-stream "^3.4.0"
+
+pull-pushable@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
+ integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
+
+pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
+ version "3.6.14"
+ resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee"
+ integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
+
+pull-window@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0"
+ integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
+ dependencies:
+ looper "^2.0.0"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.7.0, qs@^6.9.4:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerate@^1.2.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+ integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
+
+require-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@1.17.0, resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.10.0, resolve@^1.8.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+resumer@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+ integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
+ dependencies:
+ through "~2.3.4"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.2.8, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+scryptsy@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
+ integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
+ dependencies:
+ pbkdf2 "^3.0.3"
+
+secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
+ integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+
+semaphore-async-await@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa"
+ integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=
+
+semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+serialize-javascript@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ 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"
+
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@^0.4.20:
+ version "0.4.26"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5"
+ integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
+
+solc@^0.6.3:
+ version "0.6.12"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e"
+ integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.12:
+ version "0.5.12"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
+ integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.13:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-to-pull-stream@^1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece"
+ integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
+ dependencies:
+ looper "^3.0.0"
+ pull-stream "^3.2.3"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trim@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
+ integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+strip-json-comments@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
+ integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tape@^4.6.3:
+ version "4.13.3"
+ resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278"
+ integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==
+ dependencies:
+ deep-equal "~1.1.1"
+ defined "~1.0.0"
+ dotignore "~0.1.2"
+ for-each "~0.3.3"
+ function-bind "~1.1.1"
+ glob "~7.1.6"
+ has "~1.0.3"
+ inherits "~2.0.4"
+ is-regex "~1.0.5"
+ minimist "~1.2.5"
+ object-inspect "~1.7.0"
+ resolve "~1.17.0"
+ resumer "~0.0.0"
+ string.prototype.trim "~1.2.1"
+ through "~2.3.8"
+
+tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
+ integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+testrpc@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed"
+ integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==
+
+through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@~2.3.4, through@~2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+"true-case-path@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf"
+ integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==
+
+ts-essentials@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
+ integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
+
+ts-essentials@^6.0.3:
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6"
+ integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
+
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
+ dependencies:
+ "@types/mkdirp" "^0.5.2"
+ "@types/prettier" "^2.1.1"
+ "@types/resolve" "^0.0.8"
+ chalk "^2.4.1"
+ glob "^7.1.2"
+ mkdirp "^0.5.1"
+ prettier "^2.1.2"
+ resolve "^1.8.1"
+ ts-essentials "^1.0.0"
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.0:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+tweetnacl@^1.0.0, tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typechain@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e"
+ integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==
+ dependencies:
+ command-line-args "^4.0.7"
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ ts-essentials "^6.0.3"
+ ts-generator "^0.1.1"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typewise-core@^1.2, typewise-core@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
+ integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+
+typewise@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651"
+ integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+ dependencies:
+ typewise-core "^1.2.0"
+
+typewiselite@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e"
+ integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+
+typical@^2.6.0, typical@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
+ integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+underscore@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unorm@^1.3.3:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0, util.promisify@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f"
+ integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.9.1"
+
+web3-core-helpers@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99"
+ integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==
+ dependencies:
+ underscore "1.9.1"
+ web3-eth-iban "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-method@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6"
+ integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-promievent@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf"
+ integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a"
+ integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==
+ dependencies:
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-providers-http "1.2.11"
+ web3-providers-ipc "1.2.11"
+ web3-providers-ws "1.2.11"
+
+web3-core-subscriptions@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd"
+ integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-core@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7"
+ integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-requestmanager "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-abi@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0"
+ integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==
+ dependencies:
+ "@ethersproject/abi" "5.0.0-beta.153"
+ underscore "1.9.1"
+ web3-utils "1.2.11"
+
+web3-eth-accounts@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520"
+ integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.9.1"
+ uuid "3.3.2"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-contract@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90"
+ integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-ens@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532"
+ integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-iban@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef"
+ integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.2.11"
+
+web3-eth-personal@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70"
+ integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793"
+ integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==
+ dependencies:
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-accounts "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-eth-ens "1.2.11"
+ web3-eth-iban "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-net@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b"
+ integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-provider-engine@14.2.1:
+ version "14.2.1"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95"
+ integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==
+ dependencies:
+ 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"
+
+web3-providers-http@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6"
+ integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==
+ dependencies:
+ web3-core-helpers "1.2.11"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21"
+ integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==
+ dependencies:
+ oboe "2.1.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-providers-ws@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb"
+ integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ websocket "^1.0.31"
+
+web3-shh@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f"
+ integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-net "1.2.11"
+
+web3-utils@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82"
+ integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@^1.0.0-beta.31:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10"
+ integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975"
+ integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==
+ dependencies:
+ web3-bzz "1.2.11"
+ web3-core "1.2.11"
+ web3-eth "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-shh "1.2.11"
+ web3-utils "1.2.11"
+
+websocket@1.0.32:
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+websocket@^1.0.31:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1.3.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+workerpool@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
+ integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@7.4.6, ws@^7.2.1:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
+ integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@20.2.4:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-parser@^20.2.2:
+ version "20.2.7"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+ integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
+
+yargs-unparser@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yargs@^4.7.1:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+ integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA=
+ dependencies:
+ 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"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/.gitignore b/omgx_examples/l1-l2-deposit-withdrawal/.gitignore
new file mode 100644
index 000000000000..861cdb7d8c3f
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/.gitignore
@@ -0,0 +1,11 @@
+# Packages
+node_modules/
+
+# Hardhat build outputs
+artifacts/
+artifacts-ovm/
+cache/
+cache-ovm/
+optimism
+
+.env
\ No newline at end of file
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/README.md b/omgx_examples/l1-l2-deposit-withdrawal/README.md
new file mode 100644
index 000000000000..d89808b2e8a8
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/README.md
@@ -0,0 +1,42 @@
+# OMGX L1-L2 Deposit/Withdrawal
+
+## 1. Compiling the contracts
+
+First, spin up a local system as usual (see the top-level `Readme.md`). Then, run:
+
+```bash
+$ yarn
+$ yarn compile #for your local L1
+$ yarn compile:ovm #for your local L2
+$ yarn compile:omgx #for OMGX Rinkeby
+```
+
+## 2. Testing
+
+```bash
+$ yarn test:integration:ovm #for your local L1/L2
+$ yarn test:integration:omgx #for OMGX Rinkeby
+```
+
+```bash
+% yarn test:integration:omgx
+
+L1 <> L2 Deposit and Withdrawal
+ Initialization and initial balances
+ ✓ should have initial L1 balance of 1234 and initial L2 balance of 0 (40ms)
+ L1 to L2 deposit
+ ✓ should approve 1234 tokens for ERC20 bridge (107ms)
+ ✓ should deposit 1234 tokens into L2 ERC20 (4270ms)
+ ✓ should relay deposit message to L2 (4085ms)
+ ✓ should have changed L1 balance to 0 and L2 balance to 1234
+ L2 to L1 withdrawal
+ ✓ should approve 1234 tokens for ERC20 bridge (98ms)
+ ✓ should withdraw tokens back to L1 ERC20 and relay the message (179ms)
+ ✓ should relay withdrawal message to L1 (4094ms)
+ ✓ should have changed L1 balance back to 1234 and L2 balance back to 0
+
+
+ 9 passing (13s)
+
+✨ Done in 14.33s.
+```
\ No newline at end of file
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/ERC20.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/ERC20.sol
new file mode 100644
index 000000000000..bfb223340c0b
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/ERC20.sol
@@ -0,0 +1,241 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.6.0 <0.8.0;
+
+/**
+ * @title ERC20
+ * @dev A super simple ERC20 implementation! Also *very* insecure. Do not use in prod.
+ */
+contract ERC20 {
+
+ /**********
+ * Events *
+ **********/
+
+ event Transfer(
+ address indexed _from,
+ address indexed _to,
+ uint256 _value
+ );
+
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+
+
+ /*************
+ * Variables *
+ *************/
+
+ mapping (address => uint256) public balances;
+ mapping (address => mapping (address => uint256)) public allowances;
+
+ // Some optional extra goodies.
+ uint256 public totalSupply;
+ string public name;
+ string public symbol;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _initialSupply Initial maximum token supply.
+ * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).
+ * @param _symbol A symbol for our ERC20
+ */
+ constructor(
+ uint256 _initialSupply,
+ string memory _name,
+ string memory _symbol
+ )
+ public
+ {
+ balances[msg.sender] = _initialSupply;
+ totalSupply = _initialSupply;
+ name = _name;
+ symbol = _symbol;
+ }
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Checks the balance of an address.
+ * @param _owner Address to check a balance for.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _owner
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_owner];
+ }
+
+ /**
+ * Transfers a balance from your account to someone else's account!
+ * @param _to Address to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transfer(
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[msg.sender] >= _amount,
+ "You don't have enough balance to make this transfer!"
+ );
+
+ balances[msg.sender] -= _amount;
+ balances[_to] += _amount;
+
+ emit Transfer(
+ msg.sender,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Transfers a balance from someone else's account to another account. You need an allowance
+ * from the sending account for this to work!
+ * @param _from Account to transfer a balance from.
+ * @param _to Account to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[_from] >= _amount,
+ "Can't transfer from the desired account because it doesn't have enough balance."
+ );
+
+ require(
+ allowances[_from][msg.sender] >= _amount,
+ "Can't transfer from the desired account because you don't have enough of an allowance."
+ );
+
+ balances[_to] += _amount;
+ balances[_from] -= _amount;
+
+ emit Transfer(
+ _from,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Approves an account to spend some amount from your account.
+ * @param _spender Account to approve a balance for.
+ * @param _amount Amount to allow the account to spend from your account.
+ * @return true if the allowance was successful.
+ */
+ function approve(
+ address _spender,
+ uint256 _amount
+ )
+ external
+ returns (
+ bool
+ )
+ {
+ allowances[msg.sender][_spender] = _amount;
+
+ emit Approval(
+ msg.sender,
+ _spender,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks how much a given account is allowed to spend from another given account.
+ * @param _owner Address of the account to check an allowance from.
+ * @param _spender Address of the account trying to spend from the owner.
+ * @return Allowance for the spender from the owner.
+ */
+ function allowance(
+ address _owner,
+ address _spender
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return allowances[_owner][_spender];
+ }
+
+ /**
+ * Internal minting function.
+ * @param _who Address to mint tokens for.
+ * @param _amount Number of tokens to mint.
+ */
+ function _mint(
+ address _who,
+ uint256 _amount
+ )
+ internal
+ {
+ totalSupply += _amount;
+ balances[_who] += _amount;
+ emit Transfer(address(0), _who, _amount);
+ }
+
+ /**
+ * Internal burning function.
+ * @param _who Address to burn tokens from.
+ * @param _amount Number of tokens to burn.
+ */
+ function _burn(
+ address _who,
+ uint256 _amount
+ )
+ internal
+ {
+ require(
+ totalSupply >= _amount,
+ "Can't burn more than total supply."
+ );
+
+ require(
+ balances[_who] >= _amount,
+ "Account does not have enough to burn."
+ );
+
+ totalSupply -= _amount;
+ balances[_who] -= _amount;
+ emit Transfer(_who, address(0), _amount);
+ }
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/L2StandardERC20.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/L2StandardERC20.sol
new file mode 100644
index 000000000000..76be60f50ca7
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/L2StandardERC20.sol
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.16 <0.8.0;
+
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+import './interfaces/IL2StandardERC20.sol';
+
+contract L2StandardERC20 is IL2StandardERC20, ERC20 {
+ address public override l1Token;
+ address public l2Bridge;
+
+ /**
+ * @param _l1Token Address of the corresponding L1 token.
+ * @param _name ERC20 name.
+ * @param _symbol ERC20 symbol.
+ */
+ constructor(
+ address _l2Bridge,
+ address _l1Token,
+ string memory _name,
+ string memory _symbol
+ )
+ ERC20(_name, _symbol) {
+ l1Token = _l1Token;
+ l2Bridge = _l2Bridge;
+ }
+
+ modifier onlyL2Bridge {
+ require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn");
+ _;
+ }
+
+ function supportsInterface(bytes4 _interfaceId) public override pure returns (bool) {
+ bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)")); // ERC165
+ bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector
+ ^ IL2StandardERC20.mint.selector
+ ^ IL2StandardERC20.burn.selector;
+ return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface;
+ }
+
+ function mint(address _to, uint256 _amount) public override onlyL2Bridge {
+ _mint(_to, _amount);
+
+ emit Mint(_to, _amount);
+ }
+
+ function burn(address _from, uint256 _amount) public override onlyL2Bridge {
+ _burn(_from, _amount);
+
+ emit Burn(_from, _amount);
+ }
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_CrossDomainEnabled.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_CrossDomainEnabled.sol
new file mode 100644
index 000000000000..4297c3649cdc
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_CrossDomainEnabled.sol
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/* Interface Imports */
+import { iOVM_CrossDomainMessenger } from "./interfaces/iOVM_CrossDomainMessenger.sol";
+
+/**
+ * @title OVM_CrossDomainEnabled
+ * @dev Helper contract for contracts performing cross-domain communications
+ *
+ * Compiler used: defined by inheriting contract
+ * Runtime target: defined by inheriting contract
+ */
+contract OVM_CrossDomainEnabled {
+
+ /*************
+ * Variables *
+ *************/
+
+ // Messenger contract used to send and recieve messages from the other domain.
+ address public messenger;
+
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _messenger Address of the CrossDomainMessenger on the current layer.
+ */
+ constructor(
+ address _messenger
+ ) {
+ messenger = _messenger;
+ }
+
+
+ /**********************
+ * Function Modifiers *
+ **********************/
+
+ /**
+ * Enforces that the modified function is only callable by a specific cross-domain account.
+ * @param _sourceDomainAccount The only account on the originating domain which is
+ * authenticated to call this function.
+ */
+ modifier onlyFromCrossDomainAccount(
+ address _sourceDomainAccount
+ ) {
+ require(
+ msg.sender == address(getCrossDomainMessenger()),
+ "OVM_XCHAIN: messenger contract unauthenticated"
+ );
+
+ require(
+ getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,
+ "OVM_XCHAIN: wrong sender of cross-domain message"
+ );
+
+ _;
+ }
+
+
+ /**********************
+ * Internal Functions *
+ **********************/
+
+ /**
+ * Gets the messenger, usually from storage. This function is exposed in case a child contract
+ * needs to override.
+ * @return The address of the cross-domain messenger contract which should be used.
+ */
+ function getCrossDomainMessenger()
+ internal
+ virtual
+ returns (
+ iOVM_CrossDomainMessenger
+ )
+ {
+ return iOVM_CrossDomainMessenger(messenger);
+ }
+
+ /**
+ * Sends a message to an account on another domain
+ * @param _crossDomainTarget The intended recipient on the destination domain
+ * @param _message The data to send to the target (usually calldata to a function with
+ * `onlyFromCrossDomainAccount()`)
+ * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
+ */
+ function sendCrossDomainMessage(
+ address _crossDomainTarget,
+ uint32 _gasLimit,
+ bytes memory _message
+ )
+ internal
+ {
+ getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
+ }
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_L1StandardBridge.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_L1StandardBridge.sol
new file mode 100644
index 000000000000..9773a32de4a1
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_L1StandardBridge.sol
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: MIT
+// @unsupported: ovm
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { iOVM_L1StandardBridge } from "./interfaces/iOVM_L1StandardBridge.sol";
+import { iOVM_L1ERC20Bridge } from "./interfaces/iOVM_L1ERC20Bridge.sol";
+import { iOVM_L2ERC20Bridge } from "./interfaces/iOVM_L2ERC20Bridge.sol";
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+/* Library Imports */
+import { OVM_CrossDomainEnabled } from "./OVM_CrossDomainEnabled.sol";
+import { Lib_PredeployAddresses } from "./libraries/Lib_PredeployAddresses.sol";
+import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
+import { Address } from "@openzeppelin/contracts/utils/Address.sol";
+import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+
+/**
+ * @title OVM_L1StandardBridge
+ * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard tokens that are in use on L2.
+ * It synchronizes a corresponding L2 Bridge, informing it of deposits, and listening to it for newly finalized withdrawals.
+ *
+ * Compiler used: solc
+ * Runtime target: EVM
+ */
+contract OVM_L1StandardBridge is iOVM_L1StandardBridge, OVM_CrossDomainEnabled {
+ using SafeMath for uint;
+ using SafeERC20 for IERC20;
+
+ /********************************
+ * External Contract References *
+ ********************************/
+
+ address public l2TokenBridge;
+
+ // Maps L1 token to L2 token to balance of the L1 token deposited
+ mapping(address => mapping (address => uint256)) public deposits;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ // This contract lives behind a proxy, so the constructor parameters will go unused.
+ constructor()
+ OVM_CrossDomainEnabled(address(0))
+ {}
+
+ /******************
+ * Initialization *
+ ******************/
+
+ /**
+ * @param _l1messenger L1 Messenger address being used for cross-chain communications.
+ * @param _l2TokenBridge L2 standard bridge address.
+ */
+ function initialize(
+ address _l1messenger,
+ address _l2TokenBridge
+ )
+ public
+ {
+ require(messenger == address(0), "Contract has already been initialized.");
+ messenger = _l1messenger;
+ l2TokenBridge = _l2TokenBridge;
+ }
+
+ /**************
+ * Depositing *
+ **************/
+
+ /// @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious contract via initcode, but it takes care of the user error we want to avoid.
+ modifier onlyEOA() {
+ // Used to stop deposits from contracts (avoid accidentally lost tokens)
+ require(!Address.isContract(msg.sender), "Account not EOA");
+ _;
+ }
+
+ /**
+ * @dev This function can be called with no data
+ * to deposit an amount of ETH to the caller's balance on L2.
+ * Since the receive function doesn't take data, a conservative
+ * default amount is forwarded to L2.
+ */
+ receive()
+ external
+ payable
+ onlyEOA()
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ msg.sender,
+ 1_300_000,
+ bytes("")
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function depositETH(
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ payable
+ onlyEOA()
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ msg.sender,
+ _l2Gas,
+ _data
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function depositETHTo(
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ payable
+ {
+ _initiateETHDeposit(
+ msg.sender,
+ _to,
+ _l2Gas,
+ _data
+ );
+ }
+
+ /**
+ * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of the deposit.
+ * @param _from Account to pull the deposit from on L1.
+ * @param _to Account to give the deposit to on L2.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateETHDeposit(
+ address _from,
+ address _to,
+ uint32 _l2Gas,
+ bytes memory _data
+ )
+ internal
+ {
+ // Construct calldata for finalizeDeposit call
+ bytes memory message =
+ abi.encodeWithSelector(
+ iOVM_L2ERC20Bridge.finalizeDeposit.selector,
+ address(0),
+ Lib_PredeployAddresses.OVM_ETH,
+ _from,
+ _to,
+ msg.value,
+ _data
+ );
+
+ // Send calldata into L2
+ sendCrossDomainMessage(
+ l2TokenBridge,
+ _l2Gas,
+ message
+ );
+
+ emit ETHDepositInitiated(_from, _to, msg.value, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function depositERC20(
+ address _l1Token,
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ onlyEOA()
+ {
+ _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function depositERC20To(
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);
+ }
+
+ /**
+ * @dev Performs the logic for deposits by informing the L2 Deposited Token
+ * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom)
+ *
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _from Account to pull the deposit from on L1
+ * @param _to Account to give the deposit to on L2
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateERC20Deposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ internal
+ {
+ // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future withdrawals.
+ // safeTransferFrom also checks if the contract has code, so this will fail if _from is an EOA or address(0).
+ IERC20(_l1Token).safeTransferFrom(
+ _from,
+ address(this),
+ _amount
+ );
+
+ // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)
+ bytes memory message = abi.encodeWithSelector(
+ iOVM_L2ERC20Bridge.finalizeDeposit.selector,
+ _l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+
+ // Send calldata into L2
+ sendCrossDomainMessage(
+ l2TokenBridge,
+ _l2Gas,
+ message
+ );
+
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].add(_amount);
+
+ emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @inheritdoc iOVM_L1StandardBridge
+ */
+ function finalizeETHWithdrawal(
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ onlyFromCrossDomainAccount(l2TokenBridge)
+ {
+ (bool success, ) = _to.call{value: _amount}(new bytes(0));
+ require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
+
+ emit ETHWithdrawalFinalized(_from, _to, _amount, _data);
+ }
+
+ /**
+ * @inheritdoc iOVM_L1ERC20Bridge
+ */
+ function finalizeERC20Withdrawal(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ onlyFromCrossDomainAccount(l2TokenBridge)
+ {
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token].sub(_amount);
+
+ // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer.
+ IERC20(_l1Token).safeTransfer(_to, _amount);
+
+ emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*****************************
+ * Temporary - Migrating ETH *
+ *****************************/
+
+ /**
+ * @dev Adds ETH balance to the account. This is meant to allow for ETH
+ * to be migrated from an old gateway to a new gateway.
+ * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the old contract
+ */
+ function donateETH() external payable {}
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_L2StandardBridge.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_L2StandardBridge.sol
new file mode 100644
index 000000000000..26ff6b294035
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/OVM_L2StandardBridge.sol
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { iOVM_L1StandardBridge } from "./interfaces/iOVM_L1StandardBridge.sol";
+import { iOVM_L1ERC20Bridge } from "./interfaces/iOVM_L1ERC20Bridge.sol";
+import { iOVM_L2ERC20Bridge } from "./interfaces/iOVM_L2ERC20Bridge.sol";
+
+/* Library Imports */
+import { ERC165Checker } from "@openzeppelin/contracts/introspection/ERC165Checker.sol";
+import { OVM_CrossDomainEnabled } from "./OVM_CrossDomainEnabled.sol";
+import { Lib_PredeployAddresses } from "./libraries/Lib_PredeployAddresses.sol";
+
+/* Contract Imports */
+import { IL2StandardERC20 } from "./interfaces/IL2StandardERC20.sol";
+
+/**
+ * @title OVM_L2StandardBridge
+ * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to enable
+ * ETH and ERC20 transitions between L1 and L2.
+ * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard bridge.
+ * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 bridge to release L1 funds.
+ *
+ * Compiler used: optimistic-solc
+ * Runtime target: OVM
+ */
+contract OVM_L2StandardBridge is iOVM_L2ERC20Bridge, OVM_CrossDomainEnabled {
+
+ /********************************
+ * External Contract References *
+ ********************************/
+
+ address public l1TokenBridge;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.
+ * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.
+ */
+ constructor(
+ address _l2CrossDomainMessenger,
+ address _l1TokenBridge
+ )
+ OVM_CrossDomainEnabled(_l2CrossDomainMessenger)
+ {
+ l1TokenBridge = _l1TokenBridge;
+ }
+
+ /***************
+ * Withdrawing *
+ ***************/
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function withdraw(
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateWithdrawal(
+ _l2Token,
+ msg.sender,
+ msg.sender,
+ _amount,
+ _l1Gas,
+ _data
+ );
+ }
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function withdrawTo(
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ {
+ _initiateWithdrawal(
+ _l2Token,
+ msg.sender,
+ _to,
+ _amount,
+ _l1Gas,
+ _data
+ );
+ }
+
+ /**
+ * @dev Performs the logic for deposits by storing the token and informing the L2 token Gateway of the deposit.
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _from Account to pull the deposit from on L2.
+ * @param _to Account to give the withdrawal to on L1.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function _initiateWithdrawal(
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ internal
+ {
+ // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 usage
+ IL2StandardERC20(_l2Token).burn(msg.sender, _amount);
+
+ // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)
+ address l1Token = IL2StandardERC20(_l2Token).l1Token();
+ bytes memory message;
+
+ if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {
+ message = abi.encodeWithSelector(
+ iOVM_L1StandardBridge.finalizeETHWithdrawal.selector,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+ } else {
+ message = abi.encodeWithSelector(
+ iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+ }
+
+ // Send message up to L1 bridge
+ sendCrossDomainMessage(
+ l1TokenBridge,
+ _l1Gas,
+ message
+ );
+
+ emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data);
+ }
+
+ /************************************
+ * Cross-chain Function: Depositing *
+ ************************************/
+
+ /**
+ * @inheritdoc iOVM_L2ERC20Bridge
+ */
+ function finalizeDeposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ )
+ external
+ override
+ virtual
+ onlyFromCrossDomainAccount(l1TokenBridge)
+ {
+ // Check the target token is compliant and
+ // verify the deposited token on L1 matches the L2 deposited token representation here
+ if (
+ ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&
+ _l1Token == IL2StandardERC20(_l2Token).l1Token()
+ ) {
+ // When a deposit is finalized, we credit the account on L2 with the same amount of tokens.
+ IL2StandardERC20(_l2Token).mint(_to, _amount);
+ emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
+ } else {
+ // Either the L2 token which is being deposited-into disagrees about the correct address
+ // of its L1 token, or does not support the correct interface.
+ // This should only happen if there is a malicious L2 token, or if a user somehow
+ // specified the wrong L2 token address to deposit into.
+ // In either case, we stop the process here and construct a withdrawal
+ // message so that users can get their funds out in some cases.
+ // There is no way to prevent malicious token contracts altogether, but this does limit
+ // user error and mitigate some forms of malicious contract behavior.
+ bytes memory message = abi.encodeWithSelector(
+ iOVM_L1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ _l1Token,
+ _l2Token,
+ _to, // switched the _to and _from here to bounce back the deposit to the sender
+ _from,
+ _amount,
+ _data
+ );
+
+ // Send message up to L1 bridge
+ sendCrossDomainMessage(
+ l1TokenBridge,
+ 0,
+ message
+ );
+ emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+ }
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/IL2StandardERC20.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/IL2StandardERC20.sol
new file mode 100644
index 000000000000..34f7c2375155
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/IL2StandardERC20.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.16 <0.8.0;
+
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import { IERC165 } from "@openzeppelin/contracts/introspection/IERC165.sol";
+
+interface IL2StandardERC20 is IERC20, IERC165 {
+ function l1Token() external returns (address);
+
+ function mint(address _to, uint256 _amount) external;
+
+ function burn(address _from, uint256 _amount) external;
+
+ event Mint(address indexed _account, uint256 _amount);
+ event Burn(address indexed _account, uint256 _amount);
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_CrossDomainMessenger.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_CrossDomainMessenger.sol
new file mode 100644
index 000000000000..457d9d34f9d0
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_CrossDomainMessenger.sol
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_CrossDomainMessenger
+ */
+interface iOVM_CrossDomainMessenger {
+
+ /**********
+ * Events *
+ **********/
+
+ event SentMessage(bytes message);
+ event RelayedMessage(bytes32 msgHash);
+ event FailedRelayedMessage(bytes32 msgHash);
+
+
+ /*************
+ * Variables *
+ *************/
+
+ function xDomainMessageSender() external view returns (address);
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Sends a cross domain message to the target messenger.
+ * @param _target Target contract address.
+ * @param _message Message to send to the target.
+ * @param _gasLimit Gas limit for the provided message.
+ */
+ function sendMessage(
+ address _target,
+ bytes calldata _message,
+ uint32 _gasLimit
+ ) external;
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1ERC20Bridge.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1ERC20Bridge.sol
new file mode 100644
index 000000000000..636ddb61ce76
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1ERC20Bridge.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_L1ERC20Bridge
+ */
+interface iOVM_L1ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+
+ event ERC20DepositInitiated (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event ERC20WithdrawalFinalized (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev deposit an amount of the ERC20 to the caller's balance on L2.
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _amount Amount of the ERC20 to deposit
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositERC20 (
+ address _l1Token,
+ address _l2Token,
+ uint _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /**
+ * @dev deposit an amount of ERC20 to a recipient's balance on L2.
+ * @param _l1Token Address of the L1 ERC20 we are depositing
+ * @param _l2Token Address of the L1 respective L2 ERC20
+ * @param _to L2 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositERC20To (
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external;
+
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
+ * L1 ERC20 token.
+ * This call will fail if the initialized withdrawal from L2 has not been finalized.
+ *
+ * @param _l1Token Address of L1 token to finalizeWithdrawal for.
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _from L2 address initiating the transfer.
+ * @param _to L1 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _data Data provided by the sender on L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeERC20Withdrawal (
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1StandardBridge.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1StandardBridge.sol
new file mode 100644
index 000000000000..fe63dd8e88fc
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L1StandardBridge.sol
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+import './iOVM_L1ERC20Bridge.sol';
+
+/**
+ * @title iOVM_L1StandardBridge
+ */
+interface iOVM_L1StandardBridge is iOVM_L1ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+ event ETHDepositInitiated (
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event ETHWithdrawalFinalized (
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev Deposit an amount of the ETH to the caller's balance on L2.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositETH (
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ payable;
+
+ /**
+ * @dev Deposit an amount of ETH to a recipient's balance on L2.
+ * @param _to L2 address to credit the withdrawal to.
+ * @param _l2Gas Gas limit required to complete the deposit on L2.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function depositETHTo (
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ )
+ external
+ payable;
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
+ * L1 ETH token.
+ * Since only the xDomainMessenger can call this function, it will never be called before the withdrawal is finalized.
+ * @param _from L2 address initiating the transfer.
+ * @param _to L1 address to credit the withdrawal to.
+ * @param _amount Amount of the ERC20 to deposit.
+ * @param _data Optional data to forward to L2. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeETHWithdrawal (
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L2ERC20Bridge.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L2ERC20Bridge.sol
new file mode 100644
index 000000000000..75ea2f7c139e
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/interfaces/iOVM_L2ERC20Bridge.sol
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_L2ERC20Bridge
+ */
+interface iOVM_L2ERC20Bridge {
+
+ /**********
+ * Events *
+ **********/
+
+ event WithdrawalInitiated (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event DepositFinalized (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+ event DepositFailed (
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * @dev initiate a withdraw of some tokens to the caller's account on L1
+ * @param _l2Token Address of L2 token where withdrawal was initiated.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function withdraw (
+ address _l2Token,
+ uint _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /**
+ * @dev initiate a withdraw of some token to a recipient's account on L1.
+ * @param _l2Token Address of L2 token where withdrawal is initiated.
+ * @param _to L1 adress to credit the withdrawal to.
+ * @param _amount Amount of the token to withdraw.
+ * param _l1Gas Unused, but included for potential forward compatibility considerations.
+ * @param _data Optional data to forward to L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function withdrawTo (
+ address _l2Token,
+ address _to,
+ uint _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ )
+ external;
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * @dev Complete a deposit from L1 to L2, and credits funds to the recipient's balance of this
+ * L2 token.
+ * This call will fail if it did not originate from a corresponding deposit in OVM_l1TokenGateway.
+ * @param _l1Token Address for the l1 token this is called with
+ * @param _l2Token Address for the l2 token this is called with
+ * @param _from Account to pull the deposit from on L2.
+ * @param _to Address to receive the withdrawal at
+ * @param _amount Amount of the token to withdraw
+ * @param _data Data provider by the sender on L1. This data is provided
+ * solely as a convenience for external contracts. Aside from enforcing a maximum
+ * length, these contracts provide no guarantees about its content.
+ */
+ function finalizeDeposit (
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint _amount,
+ bytes calldata _data
+ )
+ external;
+
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/contracts/libraries/Lib_PredeployAddresses.sol b/omgx_examples/l1-l2-deposit-withdrawal/contracts/libraries/Lib_PredeployAddresses.sol
new file mode 100644
index 000000000000..b597e00ec0da
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/contracts/libraries/Lib_PredeployAddresses.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/**
+ * @title Lib_PredeployAddresses
+ */
+library Lib_PredeployAddresses {
+ address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;
+ address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;
+ address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;
+ address internal constant ECDSA_CONTRACT_ACCOUNT = 0x4200000000000000000000000000000000000003;
+ address internal constant SEQUENCER_ENTRYPOINT = 0x4200000000000000000000000000000000000005;
+ address payable internal constant OVM_ETH = 0x4200000000000000000000000000000000000006;
+ address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;
+ address internal constant LIB_ADDRESS_MANAGER = 0x4200000000000000000000000000000000000008;
+ address internal constant PROXY_EOA = 0x4200000000000000000000000000000000000009;
+ address internal constant EXECUTION_MANAGER_WRAPPER = 0x420000000000000000000000000000000000000B;
+ address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;
+ address internal constant ERC1820_REGISTRY = 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24;
+ address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/hardhat.config.js b/omgx_examples/l1-l2-deposit-withdrawal/hardhat.config.js
new file mode 100644
index 000000000000..d6b90a8bd03d
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/hardhat.config.js
@@ -0,0 +1,37 @@
+// Plugins
+require('@nomiclabs/hardhat-ethers')
+require('@nomiclabs/hardhat-waffle')
+require('@eth-optimism/hardhat-ovm')
+
+module.exports = {
+ networks: {
+ // Add this network to your config!
+ optimism: {
+ url: 'http://127.0.0.1:8545',
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true // This sets the network as using the ovm and ensure contract will be compiled against that.
+ },
+ omgx_rinkeby: {
+ url: 'https://rinkeby.omgx.network',
+ // instantiate with a mnemonic so that you have >1 accounts available
+ accounts: {
+ mnemonic: 'test test test test test test test test test test test junk'
+ },
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance (yet, sorry!).
+ gasPrice: 0,
+ ovm: true // This sets the network as using the ovm and ensure contract will be compiled against that.
+ },
+ },
+ solidity: '0.7.6',
+ ovm: {
+ solcVersion: '0.7.6'
+ },
+ mocha: {
+ timeout: 300000
+ }
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/package.json b/omgx_examples/l1-l2-deposit-withdrawal/package.json
new file mode 100644
index 000000000000..62df4711652e
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "l1-l2-deposit-withdrawal",
+ "version": "1.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "scripts": {
+ "clean": "rimraf ./cache ./artifacts ./cache-ovm ./artifacts-ovm",
+ "compile": "hardhat compile",
+ "compile:ovm": "hardhat compile --network optimism",
+ "compile:omgx": "hardhat compile --network omgx_rinkeby",
+ "test:integration:ovm": "yarn hardhat test --network optimism",
+ "test:integration:omgx": "hardhat test --network omgx_rinkeby"
+ },
+ "devDependencies": {
+ "@eth-optimism/contracts": "^0.3.0",
+ "@eth-optimism/core-utils": "^0.4.2",
+ "@eth-optimism/hardhat-ovm": "^0.2.0",
+ "@eth-optimism/watcher": "^0.0.1-alpha.9",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "chai": "^4.3.4",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.1.4",
+ "hardhat": "^2.2.1",
+ "mocha": "^8.4.0",
+ "rimraf": "^3.0.2"
+ }
+}
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/test/example.test.js b/omgx_examples/l1-l2-deposit-withdrawal/test/example.test.js
new file mode 100644
index 000000000000..80928f250e5e
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/test/example.test.js
@@ -0,0 +1,173 @@
+/* External Imports */
+const { ethers } = require('hardhat')
+const { expect } = require('chai')
+const { Watcher } = require('@eth-optimism/watcher')
+
+/* Internal Imports */
+const factory = (name, ovm = false) => {
+ const artifact = require(`../artifacts${ovm ? '-ovm' : ''}/contracts/${name}.sol/${name}.json`)
+ return new ethers.ContractFactory(artifact.abi, artifact.bytecode)
+}
+const factory__L1_ERC20 = factory('ERC20')
+const factory__L2_ERC20 = factory('L2StandardERC20', true)
+const factory__L1StandardBridge = factory('OVM_L1StandardBridge')
+const factory__L2StandardBridge = factory('OVM_L2StandardBridge', true)
+
+describe(`L1 <> L2 Deposit and Withdrawal`, () => {
+ // Set up our RPC provider connections.
+ const l1RpcProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9545')
+ const l2RpcProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545')
+
+ // Constructor arguments for `ERC20.sol`
+ const INITIAL_SUPPLY = 1234
+ const L1_ERC20_NAME = 'L1 ERC20'
+ const L1_ERC20_SYMBOL = 'L1 ERC20'
+
+ // L1 standard bridge address depends on the deployment, this is default for our local deployment.
+ const L1StandardBridgeAddress = '0x851356ae760d987E095750cCeb3bC6014560891C'
+ // L2 standard bridge address is always the same.
+ const L2StandardBridgeAddress = '0x4200000000000000000000000000000000000010'
+ // L1 messenger address depends on the deployment, this is default for our local deployment.
+ const l1MessengerAddress = '0x59b670e9fA9D0A427751Af201D676719a970857b'
+ // L2 messenger address is always the same.
+ const l2MessengerAddress = '0x4200000000000000000000000000000000000007'
+
+ const L2_ERC20_NAME = 'L2 ERC20'
+ const L2_ERC20_SYMBOL = 'L2 ERC20'
+
+ // Set up our wallets (using a default private key with 10k ETH allocated to it).
+ // Need two wallets objects, one for interacting with L1 and one for interacting with L2.
+ // Both will use the same private key.
+ const key = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+ const l1Wallet = new ethers.Wallet(key, l1RpcProvider)
+ const l2Wallet = new ethers.Wallet(key, l2RpcProvider)
+
+ // Tool that helps watches and waits for messages to be relayed between L1 and L2.
+ const watcher = new Watcher({
+ l1: {
+ provider: l1RpcProvider,
+ messengerAddress: l1MessengerAddress
+ },
+ l2: {
+ provider: l2RpcProvider,
+ messengerAddress: l2MessengerAddress
+ }
+ })
+
+ const L1StandardBridge = factory__L1StandardBridge.connect(l1Wallet).attach(L1StandardBridgeAddress)
+ const L2StandardBridge = factory__L2StandardBridge.connect(l2Wallet).attach(L2StandardBridgeAddress)
+ let L1_ERC20, L2_ERC20, L1GasLimit = 9999999, L2GasLimit = 9999999;
+
+ before(`deploy contracts`, async () => {
+ // Deploy an ERC20 token on L1.
+ L1_ERC20 = await factory__L1_ERC20.connect(l1Wallet).deploy(
+ INITIAL_SUPPLY,
+ L1_ERC20_NAME,
+ L1_ERC20_SYMBOL,
+ {
+ gasPrice: 0
+ }
+ )
+
+ await L1_ERC20.deployTransaction.wait()
+
+ // Deploy the paired ERC20 token to L2.
+ L2_ERC20 = await factory__L2_ERC20.connect(l2Wallet).deploy(
+ L2StandardBridgeAddress,
+ L1_ERC20.address,
+ L2_ERC20_NAME,
+ L2_ERC20_SYMBOL,
+ {
+ gasPrice: 0
+ }
+ )
+
+ await L2_ERC20.deployTransaction.wait()
+ })
+
+ describe('Initialization and initial balances', async () => {
+ it(`should have initial L1 balance of 1234 and initial L2 balance of 0`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(1234)
+ expect(l2Balance).to.eq(0)
+ })
+ })
+
+ describe('L1 to L2 deposit', async () => {
+ let l1Tx1
+
+ it(`should approve 1234 tokens for ERC20 bridge`, async () => {
+ const tx = await L1_ERC20.approve(L1StandardBridge.address, 1234)
+ await tx.wait()
+ const txHashPrefix = tx.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should deposit 1234 tokens into L2 ERC20`, async () => {
+ l1Tx1 = await L1StandardBridge.depositERC20(
+ L1_ERC20.address,
+ L2_ERC20.address,
+ 1234,
+ L2GasLimit,
+ ethers.utils.formatBytes32String('0'),
+ { gasPrice: 0 }
+ )
+ await l1Tx1.wait()
+ const txHashPrefix = l1Tx1.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should relay deposit message to L2`, async () => {
+ // Wait for the message to be relayed to L2.
+ const [ msgHash1 ] = await watcher.getMessageHashesFromL1Tx(l1Tx1.hash)
+ const l2TxReceipt = await watcher.getL2TransactionReceipt(msgHash1)
+ expect(l2TxReceipt.to).to.eq(l2MessengerAddress)
+ })
+
+ it(`should have changed L1 balance to 0 and L2 balance to 1234`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(0)
+ expect(l2Balance).to.eq(1234)
+ })
+ })
+
+ describe('L2 to L1 withdrawal', async () => {
+ let l2Tx1
+
+ it(`should approve 1234 tokens for ERC20 bridge`, async () => {
+ const tx = await L2_ERC20.approve(L2StandardBridge.address, 1234)
+ await tx.wait()
+ const txHashPrefix = tx.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should withdraw tokens back to L1 ERC20 and relay the message`, async () => {
+ // Burn the tokens on L2 and ask the L1 contract to unlock on our behalf.
+ l2Tx1 = await L2StandardBridge.withdraw(
+ L2_ERC20.address,
+ 1234,
+ L1GasLimit,
+ ethers.utils.formatBytes32String('0'),
+ { gasPrice: 0 }
+ )
+ await l2Tx1.wait()
+ const txHashPrefix = l2Tx1.hash.slice(0, 2)
+ expect(txHashPrefix).to.eq('0x')
+ })
+
+ it(`should relay withdrawal message to L1`, async () => {
+ const [ msgHash2 ] = await watcher.getMessageHashesFromL2Tx(l2Tx1.hash)
+ const l1TxReceipt = await watcher.getL1TransactionReceipt(msgHash2)
+ expect(l1TxReceipt.to).to.eq(l1MessengerAddress)
+ })
+
+ it(`should have changed L1 balance back to 1234 and L2 balance back to 0`, async () => {
+ const l1Balance = await L1_ERC20.balanceOf(l1Wallet.address)
+ const l2Balance = await L2_ERC20.balanceOf(l1Wallet.address)
+ expect(l1Balance).to.eq(1234)
+ expect(l2Balance).to.eq(0)
+ })
+ })
+})
diff --git a/omgx_examples/l1-l2-deposit-withdrawal/yarn.lock b/omgx_examples/l1-l2-deposit-withdrawal/yarn.lock
new file mode 100644
index 000000000000..7a9ede9a2125
--- /dev/null
+++ b/omgx_examples/l1-l2-deposit-withdrawal/yarn.lock
@@ -0,0 +1,8074 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ensdomains/ens@^0.4.4":
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc"
+ integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==
+ dependencies:
+ bluebird "^3.5.2"
+ eth-ens-namehash "^2.0.8"
+ solc "^0.4.20"
+ testrpc "0.0.1"
+ web3-utils "^1.0.0-beta.31"
+
+"@ensdomains/resolver@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
+ integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
+
+"@eth-optimism/contracts@^0.3.0":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.3.5.tgz#f63ff93bffde7310a5b990aea599dbb8395d2c0e"
+ integrity sha512-tjRadNBjbB/5uj5Boidl0d8f3k6pB+N7jP0JH6LQOk59aAGL4oY1F4Tetr0Igz+r7PZMjulen5rSP1UbCHPbNw==
+ dependencies:
+ "@eth-optimism/core-utils" "^0.4.5"
+ "@ethersproject/abstract-provider" "^5.0.8"
+ "@ethersproject/abstract-signer" "^5.1.0"
+ "@ethersproject/contracts" "^5.0.5"
+ glob "^7.1.6"
+
+"@eth-optimism/core-utils@^0.4.2", "@eth-optimism/core-utils@^0.4.5":
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.4.7.tgz#3eeec47222ccfad1d8f3d9539a368c9283b2df1e"
+ integrity sha512-H+NdGAyx6w4Wmjy3PaTF7xnBEeKh8BZK1jfU6yy52sd2E0oH7ABd0H5FtRY2SLPTH8AZ8gAgOhrTNoqE0Mlktw==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.0.9"
+ ethers "^5.0.31"
+ lodash "^4.17.21"
+
+"@eth-optimism/hardhat-ovm@^0.2.0":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.2.2.tgz#55fafaa6b8277447abaf132602c1c6d14a2a18a2"
+ integrity sha512-QLzqawYCzC/m6K/Oaj/tCZQlu6kZTgnleg1cJad8kVYA5E+JWZQ6ZJrcStoJoJrco9RIroPUjAFEhFM8YiCc7Q==
+ dependencies:
+ node-fetch "^2.6.1"
+
+"@eth-optimism/watcher@^0.0.1-alpha.9":
+ version "0.0.1-alpha.9"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/watcher/-/watcher-0.0.1-alpha.9.tgz#3a68eb9292acd28cdd589b8275eed3308356b028"
+ integrity sha512-FSMinaayA/nTQzSPv21tOUqok8gMfEB1UcIdLJkImt9NUzT4QjhGbrsPH6Q2hBlQkAApgTECMShUYZVMpZ7oOw==
+ dependencies:
+ ethers "5.0.0"
+
+"@ethereum-waffle/chai@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.0.tgz#2477877410a96bf370edd64df905b04fb9aba9d5"
+ integrity sha512-GVaFKuFbFUclMkhHtQTDnWBnBQMJc/pAbfbFj/nnIK237WPLsO3KDDslA7m+MNEyTAOFrcc0CyfruAGGXAQw3g==
+ dependencies:
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.0"
+
+"@ethereum-waffle/compiler@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz#68917321212563544913de33e408327745cb1284"
+ integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw==
+ dependencies:
+ "@resolver-engine/imports" "^0.3.3"
+ "@resolver-engine/imports-fs" "^0.3.3"
+ "@typechain/ethers-v5" "^2.0.0"
+ "@types/mkdirp" "^0.5.2"
+ "@types/node-fetch" "^2.5.5"
+ ethers "^5.0.1"
+ mkdirp "^0.5.1"
+ node-fetch "^2.6.1"
+ solc "^0.6.3"
+ ts-generator "^0.1.1"
+ typechain "^3.0.0"
+
+"@ethereum-waffle/ens@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.3.0.tgz#d54f4c8e6b7bcafdc13ab294433f45416b2b2791"
+ integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw==
+ dependencies:
+ "@ensdomains/ens" "^0.4.4"
+ "@ensdomains/resolver" "^0.2.4"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/mock-contract@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz#7b331f1c95c5d46ee9478f7a6be2869f707d307a"
+ integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw==
+ dependencies:
+ "@ethersproject/abi" "^5.0.1"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/provider@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.0.tgz#a36a0890d4fbc230e807870c8d3b683594efef00"
+ integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ==
+ dependencies:
+ "@ethereum-waffle/ens" "^3.3.0"
+ ethers "^5.0.1"
+ ganache-core "^2.13.2"
+ patch-package "^6.2.2"
+ postinstall-postinstall "^2.1.0"
+
+"@ethereumjs/block@^3.3.0", "@ethereumjs/block@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.4.0.tgz#4747b0c06220ee10cbdfe1cbde8cbb0677b1b074"
+ integrity sha512-umKAoTX32yXzErpIksPHodFc/5y8bmZMnOl6hWy5Vd8xId4+HKFUOyEiN16Y97zMwFRysRpcrR6wBejfqc6Bmg==
+ dependencies:
+ "@ethereumjs/common" "^2.4.0"
+ "@ethereumjs/tx" "^3.3.0"
+ ethereumjs-util "^7.1.0"
+ merkle-patricia-tree "^4.2.0"
+
+"@ethereumjs/blockchain@^5.3.0", "@ethereumjs/blockchain@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.0.tgz#28d712627d3442b2bb1f50dd5acba7cde1021993"
+ integrity sha512-wAuKLaew6PL52kH8YPXO7PbjjKV12jivRSyHQehkESw4slSLLfYA6Jv7n5YxyT2ajD7KNMPVh7oyF/MU6HcOvg==
+ dependencies:
+ "@ethereumjs/block" "^3.4.0"
+ "@ethereumjs/common" "^2.4.0"
+ "@ethereumjs/ethash" "^1.0.0"
+ debug "^2.2.0"
+ ethereumjs-util "^7.1.0"
+ level-mem "^5.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+"@ethereumjs/common@^2.3.1", "@ethereumjs/common@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.4.0.tgz#2d67f6e6ba22246c5c89104e6b9a119fb3039766"
+ integrity sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.0"
+
+"@ethereumjs/ethash@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
+ integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.7"
+ miller-rabin "^4.0.0"
+
+"@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378"
+ integrity sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==
+ dependencies:
+ "@ethereumjs/common" "^2.4.0"
+ ethereumjs-util "^7.1.0"
+
+"@ethereumjs/vm@^5.3.2":
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.0.tgz#d389c5792320ef28c51366a643b8ab9d64e10a31"
+ integrity sha512-h6Kr6WqKUP8nVuEzCWPWEPrC63v7HFwt3gRuK7CJiyg9S0iWSBKUA/YVD4YgaSVACuxUfWaOBbwV5uGVupm5PQ==
+ dependencies:
+ "@ethereumjs/block" "^3.4.0"
+ "@ethereumjs/blockchain" "^5.4.0"
+ "@ethereumjs/common" "^2.4.0"
+ "@ethereumjs/tx" "^3.3.0"
+ async-eventemitter "^0.2.4"
+ core-js-pure "^3.0.1"
+ debug "^2.2.0"
+ ethereumjs-util "^7.1.0"
+ functional-red-black-tree "^1.0.1"
+ mcl-wasm "^0.7.1"
+ merkle-patricia-tree "^4.2.0"
+ rustbn.js "~0.2.0"
+ util.promisify "^1.0.1"
+
+"@ethersproject/abi@5.0.0-beta.153":
+ version "5.0.0-beta.153"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
+ integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==
+ dependencies:
+ "@ethersproject/address" ">=5.0.0-beta.128"
+ "@ethersproject/bignumber" ">=5.0.0-beta.130"
+ "@ethersproject/bytes" ">=5.0.0-beta.129"
+ "@ethersproject/constants" ">=5.0.0-beta.128"
+ "@ethersproject/hash" ">=5.0.0-beta.128"
+ "@ethersproject/keccak256" ">=5.0.0-beta.127"
+ "@ethersproject/logger" ">=5.0.0-beta.129"
+ "@ethersproject/properties" ">=5.0.0-beta.131"
+ "@ethersproject/strings" ">=5.0.0-beta.130"
+
+"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242"
+ integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/abstract-provider@5.4.0", "@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.0.8", "@ethersproject/abstract-provider@^5.0.9", "@ethersproject/abstract-provider@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d"
+ integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+
+"@ethersproject/abstract-signer@5.4.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.1.0", "@ethersproject/abstract-signer@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65"
+ integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/address@5.4.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
+ integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+
+"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
+ integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+
+"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6"
+ integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/bignumber@5.4.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9"
+ integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
+ integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/constants@5.4.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
+ integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+
+"@ethersproject/contracts@5.4.0", "@ethersproject/contracts@^5.0.0", "@ethersproject/contracts@^5.0.5":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.0.tgz#e05fe6bd33acc98741e27d553889ec5920078abb"
+ integrity sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw==
+ dependencies:
+ "@ethersproject/abi" "^5.4.0"
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+
+"@ethersproject/hash@5.4.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
+ integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac"
+ integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/basex" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/pbkdf2" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.0.0", "@ethersproject/json-wallets@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95"
+ integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hdnode" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/pbkdf2" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
+ integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@5.4.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
+ integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
+
+"@ethersproject/networks@5.4.1", "@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.4.0":
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.1.tgz#2ce83b8e42aa85216e5d277a7952d97b6ce8d852"
+ integrity sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c"
+ integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+
+"@ethersproject/properties@5.4.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
+ integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/providers@5.4.1", "@ethersproject/providers@^5.0.0":
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.1.tgz#654267b563b833046b9c9647647cfc8267cb93b4"
+ integrity sha512-p06eiFKz8nu/5Ju0kIX024gzEQIgE5pvvGrBCngpyVjpuLtUIWT3097Agw4mTn9/dEA0FMcfByzFqacBMSgCVg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/basex" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.4.0", "@ethersproject/random@^5.0.0", "@ethersproject/random@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16"
+ integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.0.0", "@ethersproject/rlp@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
+ integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371"
+ integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.0.0", "@ethersproject/signing-key@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
+ integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.4.0", "@ethersproject/solidity@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec"
+ integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/strings@5.4.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
+ integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
+ integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+
+"@ethersproject/units@5.4.0", "@ethersproject/units@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe"
+ integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/wallet@5.4.0", "@ethersproject/wallet@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353"
+ integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/hdnode" "^5.4.0"
+ "@ethersproject/json-wallets" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/web@5.4.0", "@ethersproject/web@^5.0.0", "@ethersproject/web@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
+ integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==
+ dependencies:
+ "@ethersproject/base64" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7"
+ integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@nomiclabs/hardhat-ethers@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
+ integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
+
+"@nomiclabs/hardhat-waffle@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2"
+ integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==
+ dependencies:
+ "@types/sinon-chai" "^3.2.3"
+ "@types/web3" "1.0.19"
+
+"@resolver-engine/core@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967"
+ integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==
+ dependencies:
+ debug "^3.1.0"
+ is-url "^1.2.4"
+ request "^2.85.0"
+
+"@resolver-engine/fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973"
+ integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports-fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b"
+ integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==
+ dependencies:
+ "@resolver-engine/fs" "^0.3.3"
+ "@resolver-engine/imports" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc"
+ integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+ hosted-git-info "^2.6.0"
+ path-browserify "^1.0.0"
+ url "^0.11.0"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/hub" "5.30.0"
+ "@sentry/tracing" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^7.1.0":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@solidity-parser/parser@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add"
+ integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@typechain/ethers-v5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810"
+ integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==
+ dependencies:
+ ethers "^5.0.2"
+
+"@types/abstract-leveldown@*":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f"
+ integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ==
+
+"@types/bn.js@*", "@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai@*":
+ version "4.2.21"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650"
+ integrity sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg==
+
+"@types/level-errors@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8"
+ integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==
+
+"@types/levelup@^4.3.0":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4"
+ integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==
+ dependencies:
+ "@types/abstract-leveldown" "*"
+ "@types/level-errors" "*"
+ "@types/node" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef"
+ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==
+
+"@types/mkdirp@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+ integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node-fetch@^2.5.5":
+ version "2.5.11"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.11.tgz#ce22a2e65fc8999f4dbdb7ddbbcf187d755169e4"
+ integrity sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "16.0.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8"
+ integrity sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==
+
+"@types/node@^12.12.6":
+ version "12.20.16"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.16.tgz#1acf34f6456208f495dac0434dd540488d17f991"
+ integrity sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3"
+ integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==
+
+"@types/resolve@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c"
+ integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/sinon-chai@^3.2.3":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48"
+ integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*":
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4"
+ integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==
+ dependencies:
+ "@sinonjs/fake-timers" "^7.1.0"
+
+"@types/underscore@*":
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.3.tgz#d6734f3741ce41b2630018c6b61c6745f6188c07"
+ integrity sha512-Fl1TX1dapfXyDqFg2ic9M+vlXRktcPJrc4PR7sRc7sdVrjavg/JHlbUXBt8qWWqhJrmSqg3RNAkAPRiOYw6Ahw==
+
+"@types/web3@1.0.19":
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924"
+ integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==
+ dependencies:
+ "@types/bn.js" "*"
+ "@types/underscore" "*"
+
+"@ungap/promise-all-settled@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
+ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
+
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
+ integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
+ integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
+ integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
+ansi-colors@4.1.1, ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.1, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
+ integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
+ dependencies:
+ typical "^2.6.0"
+
+array-back@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022"
+ integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
+ dependencies:
+ typical "^2.6.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-eventemitter@^0.2.2, async-eventemitter@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
+ integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+ dependencies:
+ lodash "^4.17.11"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.14, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ 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"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
+ dependencies:
+ 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@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+ integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+ integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+ integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
+ dependencies:
+ 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@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
+ dependencies:
+ 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@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
+ dependencies:
+ 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@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ 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@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ 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@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babelify@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+ integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ 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"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bip39@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
+ integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
+ dependencies:
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ unorm "^1.3.3"
+
+blakejs@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+ integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+bluebird@^3.5.0, bluebird@^3.5.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer-xor@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289"
+ integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+bytewise-core@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
+ integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+ dependencies:
+ typewise-core "^1.2"
+
+bytewise@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e"
+ integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
+ dependencies:
+ bytewise-core "^1.2.2"
+ typewise "^1.0.3"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ 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"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+cachedown@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15"
+ integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+ dependencies:
+ abstract-leveldown "^2.4.1"
+ lru-cache "^3.2.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30001243"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001243.tgz#d9250155c91e872186671c523f3ae50cfc94a3aa"
+ integrity sha512-vNxw9mkTBtkmLFnJRv/2rhs1yufpDfCkBZexG3Y0xdOH2Z/eE/85E4Dl5j1YUN34nZVsSp6vVRFQRrez9wJMRA==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chai@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
+ integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.1"
+ type-detect "^4.0.5"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
+chokidar@3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
+chokidar@^3.4.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@2.1.2, clone@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46"
+ integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
+ dependencies:
+ array-back "^2.0.0"
+ find-replace "^1.0.3"
+ typical "^2.6.1"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.5.1:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-pure@^3.0.1:
+ version "3.15.2"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce"
+ integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+crc-32@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
+ integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
+ dependencies:
+ exit-on-epipe "~1.0.1"
+ printj "~1.1.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@4, debug@^4.1.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
+ integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
+ dependencies:
+ ms "2.1.2"
+
+debug@4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
+ integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ inherits "^2.0.3"
+
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotignore@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
+ integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
+ dependencies:
+ minimatch "^3.0.4"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.47:
+ version "1.3.770"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.770.tgz#a9e705a73315f4900880622b3ab76cf1d7221b77"
+ integrity sha512-Kyh8DGK1KfEZuYKIHvuOmrKotsKZQ+qBkDIWHciE3QoFkxXB1KzPP+tfLilSHAfxTON0yYMnFCWkQtUOR7g6KQ==
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@5.0.4, encoding-down@~5.0.0:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614"
+ integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
+ dependencies:
+ abstract-leveldown "^5.0.0"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+ xtend "^4.0.1"
+
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
+encoding@^0.1.11:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enquirer@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
+ integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
+ dependencies:
+ 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-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f"
+ integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==
+ dependencies:
+ cross-fetch "^2.1.1"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
+ integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==
+ dependencies:
+ 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"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-sig-util@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e"
+ integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==
+ dependencies:
+ 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-sig-util@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
+ integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
+ dependencies:
+ ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
+ ethereumjs-util "^5.1.1"
+
+eth-sig-util@^2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5"
+ integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==
+ dependencies:
+ ethereumjs-abi "0.6.8"
+ ethereumjs-util "^5.1.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.0"
+
+eth-tx-summary@^3.1.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
+ integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
+ dependencies:
+ 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"
+
+ethashjs@~0.0.7:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9"
+ integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==
+ dependencies:
+ async "^2.1.2"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.2"
+ miller-rabin "^4.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-waffle@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720"
+ integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ==
+ dependencies:
+ "@ethereum-waffle/chai" "^3.4.0"
+ "@ethereum-waffle/compiler" "^3.4.0"
+ "@ethereum-waffle/mock-contract" "^3.3.0"
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.1"
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.8"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9"
+ integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
+ dependencies:
+ ethereumjs-util "^6.0.0"
+ rlp "^2.2.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-blockchain@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f"
+ integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==
+ dependencies:
+ async "^2.6.1"
+ ethashjs "~0.0.7"
+ ethereumjs-block "~2.2.2"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.1.0"
+ flow-stoplight "^1.0.0"
+ level-mem "^3.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.2"
+ semaphore "^1.1.0"
+
+ethereumjs-common@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd"
+ integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==
+
+ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
+ integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
+
+ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0"
+ integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7, ethereumjs-util@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz#e2b43a30bfcdbcb432a4eb42bd5f2393209b3fd5"
+ integrity sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab"
+ integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.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"
+ util.promisify "^1.0.0"
+
+ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
+ integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474"
+ integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^6.0.0"
+ randombytes "^2.0.6"
+ safe-buffer "^5.1.2"
+ scryptsy "^1.2.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.0.tgz#76558a3020766f310a49f4e1a4c6c1e331761abd"
+ integrity sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==
+ dependencies:
+ "@ethersproject/abi" "^5.0.0"
+ "@ethersproject/abstract-provider" "^5.0.0"
+ "@ethersproject/abstract-signer" "^5.0.0"
+ "@ethersproject/address" "^5.0.0"
+ "@ethersproject/base64" "^5.0.0"
+ "@ethersproject/bignumber" "^5.0.0"
+ "@ethersproject/bytes" "^5.0.0"
+ "@ethersproject/constants" "^5.0.0"
+ "@ethersproject/contracts" "^5.0.0"
+ "@ethersproject/hash" "^5.0.0"
+ "@ethersproject/hdnode" "^5.0.0"
+ "@ethersproject/json-wallets" "^5.0.0"
+ "@ethersproject/keccak256" "^5.0.0"
+ "@ethersproject/logger" "^5.0.0"
+ "@ethersproject/networks" "^5.0.0"
+ "@ethersproject/pbkdf2" "^5.0.0"
+ "@ethersproject/properties" "^5.0.0"
+ "@ethersproject/providers" "^5.0.0"
+ "@ethersproject/random" "^5.0.0"
+ "@ethersproject/rlp" "^5.0.0"
+ "@ethersproject/sha2" "^5.0.0"
+ "@ethersproject/signing-key" "^5.0.0"
+ "@ethersproject/solidity" "^5.0.0"
+ "@ethersproject/strings" "^5.0.0"
+ "@ethersproject/transactions" "^5.0.0"
+ "@ethersproject/units" "^5.0.0"
+ "@ethersproject/wallet" "^5.0.0"
+ "@ethersproject/web" "^5.0.0"
+ "@ethersproject/wordlists" "^5.0.0"
+
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.0.31, ethers@^5.1.4:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.1.tgz#bcff1e9f45bf1a061bf313ec04e8d9881d2d53f9"
+ integrity sha512-SrcddMdCgP1hukDvCPd87Aipbf4NWjQvdfAbZ65XSZGbfyuYPtIrUJPDH5B1SBRsdlfiEgX3eoz28DdBDzMNFg==
+ dependencies:
+ "@ethersproject/abi" "5.4.0"
+ "@ethersproject/abstract-provider" "5.4.0"
+ "@ethersproject/abstract-signer" "5.4.0"
+ "@ethersproject/address" "5.4.0"
+ "@ethersproject/base64" "5.4.0"
+ "@ethersproject/basex" "5.4.0"
+ "@ethersproject/bignumber" "5.4.0"
+ "@ethersproject/bytes" "5.4.0"
+ "@ethersproject/constants" "5.4.0"
+ "@ethersproject/contracts" "5.4.0"
+ "@ethersproject/hash" "5.4.0"
+ "@ethersproject/hdnode" "5.4.0"
+ "@ethersproject/json-wallets" "5.4.0"
+ "@ethersproject/keccak256" "5.4.0"
+ "@ethersproject/logger" "5.4.0"
+ "@ethersproject/networks" "5.4.1"
+ "@ethersproject/pbkdf2" "5.4.0"
+ "@ethersproject/properties" "5.4.0"
+ "@ethersproject/providers" "5.4.1"
+ "@ethersproject/random" "5.4.0"
+ "@ethersproject/rlp" "5.4.0"
+ "@ethersproject/sha2" "5.4.0"
+ "@ethersproject/signing-key" "5.4.0"
+ "@ethersproject/solidity" "5.4.0"
+ "@ethersproject/strings" "5.4.0"
+ "@ethersproject/transactions" "5.4.0"
+ "@ethersproject/units" "5.4.0"
+ "@ethersproject/wallet" "5.4.0"
+ "@ethersproject/web" "5.4.0"
+ "@ethersproject/wordlists" "5.4.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exit-on-epipe@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+ integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ 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"
+
+express@^4.14.0:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ 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"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-replace@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
+ integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+flow-stoplight@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
+ integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+
+follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3, for-each@~0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2, fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fsevents@~2.3.1, fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1, function-bind@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+ganache-core@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3"
+ integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==
+ dependencies:
+ abstract-leveldown "3.0.0"
+ async "2.6.2"
+ bip39 "2.5.0"
+ cachedown "1.0.0"
+ clone "2.1.2"
+ debug "3.2.6"
+ encoding-down "5.0.4"
+ eth-sig-util "3.0.0"
+ ethereumjs-abi "0.6.8"
+ ethereumjs-account "3.0.0"
+ ethereumjs-block "2.2.2"
+ ethereumjs-common "1.5.0"
+ ethereumjs-tx "2.1.2"
+ ethereumjs-util "6.2.1"
+ ethereumjs-vm "4.2.0"
+ heap "0.2.6"
+ keccak "3.0.1"
+ level-sublevel "6.6.4"
+ levelup "3.1.1"
+ lodash "4.17.20"
+ lru-cache "5.1.1"
+ merkle-patricia-tree "3.0.0"
+ patch-package "6.2.2"
+ seedrandom "3.0.1"
+ source-map-support "0.5.12"
+ tmp "0.1.0"
+ web3-provider-engine "14.2.1"
+ websocket "1.0.32"
+ optionalDependencies:
+ ethereumjs-wallet "0.6.5"
+ web3 "1.2.11"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@~5.1.0, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ 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@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ 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@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hardhat@^2.2.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.4.2.tgz#d72956d89ad3d57eddbac346e27572b4471946e2"
+ integrity sha512-tmUyFV9c7g9iODSGO/E7DFegBsFgtTc4oVtvryVOBZ0LP0ViYlgwcsPiRwOdmdcf4QHKcp900vEsD9jKgQyovg==
+ dependencies:
+ "@ethereumjs/block" "^3.3.0"
+ "@ethereumjs/blockchain" "^5.3.0"
+ "@ethereumjs/common" "^2.3.1"
+ "@ethereumjs/tx" "^3.2.1"
+ "@ethereumjs/vm" "^5.3.2"
+ "@ethersproject/abi" "^5.1.2"
+ "@sentry/node" "^5.18.1"
+ "@solidity-parser/parser" "^0.11.0"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ abort-controller "^3.0.0"
+ adm-zip "^0.4.16"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ eth-sig-util "^2.5.2"
+ ethereum-cryptography "^0.1.2"
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^7.0.10"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "^7.1.3"
+ https-proxy-agent "^5.0.0"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ lodash "^4.17.11"
+ merkle-patricia-tree "^4.2.0"
+ mnemonist "^0.38.0"
+ mocha "^7.1.2"
+ node-fetch "^2.6.0"
+ qs "^6.7.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ slash "^3.0.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ "true-case-path" "^2.2.1"
+ tsort "0.0.1"
+ uuid "^3.3.2"
+ ws "^7.4.6"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3, has@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+immutable@^4.0.0-rc.12:
+ version "4.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
+ integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-regex@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+ integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+ dependencies:
+ has "^1.0.3"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
+ integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
+ dependencies:
+ argparse "^2.0.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9"
+ integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
+ dependencies:
+ 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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
+ integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
+ dependencies:
+ inherits "^2.0.1"
+
+json-rpc-random-id@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+ integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@3.0.1, keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
+ integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
+ integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4"
+ integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.5"
+ xtend "^4.0.0"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
+ integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ xtend "^4.0.0"
+
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
+level-mem@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
+ integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
+ dependencies:
+ level-packager "~4.0.0"
+ memdown "~3.0.0"
+
+level-mem@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d"
+ integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==
+ dependencies:
+ level-packager "^5.0.3"
+ memdown "^5.0.0"
+
+level-packager@^5.0.3:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
+level-packager@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
+ integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
+ dependencies:
+ encoding-down "~5.0.0"
+ levelup "^3.0.0"
+
+level-post@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0"
+ integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
+ dependencies:
+ ltgt "^2.1.2"
+
+level-sublevel@6.6.4:
+ version "6.6.4"
+ resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba"
+ integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==
+ dependencies:
+ 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"
+
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level-ws@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b"
+ integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.8"
+ xtend "^4.0.1"
+
+level-ws@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339"
+ integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^3.1.0"
+ xtend "^4.0.1"
+
+levelup@3.1.1, levelup@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
+ integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
+ dependencies:
+ deferred-leveldown "~4.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~3.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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"
+
+levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash@4.17.20:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+log-symbols@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+looper@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
+ integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
+
+looper@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749"
+ integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@5.1.1, lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+ integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
+ dependencies:
+ pseudomap "^1.0.1"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
+ltgt@^2.1.2, ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+ltgt@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
+ integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+mcl-wasm@^0.7.1:
+ version "0.7.8"
+ resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.8.tgz#4d0dc5a92f7bd20892fd3fcd41764acf86fd1e6e"
+ integrity sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw==
+ dependencies:
+ typescript "^4.3.4"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memdown@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb"
+ integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.2.0"
+
+memdown@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
+ integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.1.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merkle-patricia-tree@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8"
+ integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==
+ dependencies:
+ async "^2.6.1"
+ ethereumjs-util "^5.2.0"
+ level-mem "^3.0.1"
+ level-ws "^1.0.0"
+ readable-stream "^3.0.6"
+ rlp "^2.0.0"
+ semaphore ">=1.0.1"
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
+ integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
+ dependencies:
+ 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"
+
+merkle-patricia-tree@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1"
+ integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==
+ dependencies:
+ "@types/levelup" "^4.3.0"
+ ethereumjs-util "^7.0.10"
+ level-mem "^5.0.1"
+ level-ws "^2.0.0"
+ readable-stream "^3.6.0"
+ rlp "^2.2.4"
+ semaphore-async-await "^1.5.1"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mnemonist@^0.38.0:
+ version "0.38.3"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d"
+ integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==
+ dependencies:
+ obliterator "^1.6.1"
+
+mocha@^7.1.2:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+ dependencies:
+ ansi-colors "3.2.3"
+ browser-stdout "1.3.1"
+ chokidar "3.3.0"
+ debug "3.2.6"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ find-up "3.0.0"
+ glob "7.1.3"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ mkdirp "0.5.5"
+ ms "2.1.1"
+ node-environment-flags "1.0.6"
+ object.assign "4.1.0"
+ strip-json-comments "2.0.1"
+ supports-color "6.0.0"
+ which "1.3.1"
+ wide-align "1.1.3"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
+mocha@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
+ integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+ dependencies:
+ "@ungap/promise-all-settled" "1.1.2"
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.5.1"
+ debug "4.3.1"
+ diff "5.0.0"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "4.0.0"
+ log-symbols "4.0.0"
+ minimatch "3.0.4"
+ ms "2.1.3"
+ nanoid "3.1.20"
+ serialize-javascript "5.0.1"
+ strip-json-comments "3.1.1"
+ supports-color "8.1.1"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.1.0"
+ yargs "16.2.0"
+ yargs-parser "20.2.4"
+ yargs-unparser "2.0.0"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanoid@3.1.20:
+ version "3.1.20"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
+ integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ 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"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
+ dependencies:
+ object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-inspect@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+obliterator@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3"
+ integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==
+
+oboe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
+ integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+patch-package@6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+patch-package@^6.2.2:
+ version "6.4.7"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
+ integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+path-browserify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.1.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d"
+ integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==
+
+printj@~1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+ integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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@^1.1.9:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b"
+ integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
+
+pull-defer@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113"
+ integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
+
+pull-level@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac"
+ integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==
+ dependencies:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5"
+ integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
+ dependencies:
+ pull-cat "^1.1.9"
+ pull-stream "^3.4.0"
+
+pull-pushable@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
+ integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
+
+pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
+ version "3.6.14"
+ resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee"
+ integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
+
+pull-window@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0"
+ integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
+ dependencies:
+ looper "^2.0.0"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.7.0:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerate@^1.2.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+ integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
+
+require-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@1.17.0, resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.10.0, resolve@^1.8.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+resumer@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+ integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
+ dependencies:
+ through "~2.3.4"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.2.8, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+scryptsy@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
+ integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
+ dependencies:
+ pbkdf2 "^3.0.3"
+
+secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
+ integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+
+semaphore-async-await@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa"
+ integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=
+
+semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+serialize-javascript@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ 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"
+
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@^0.4.20:
+ version "0.4.26"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5"
+ integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
+
+solc@^0.6.3:
+ version "0.6.12"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e"
+ integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.12:
+ version "0.5.12"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
+ integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.13:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-to-pull-stream@^1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece"
+ integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
+ dependencies:
+ looper "^3.0.0"
+ pull-stream "^3.2.3"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trim@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
+ integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+strip-json-comments@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
+ integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tape@^4.6.3:
+ version "4.13.3"
+ resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278"
+ integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==
+ dependencies:
+ deep-equal "~1.1.1"
+ defined "~1.0.0"
+ dotignore "~0.1.2"
+ for-each "~0.3.3"
+ function-bind "~1.1.1"
+ glob "~7.1.6"
+ has "~1.0.3"
+ inherits "~2.0.4"
+ is-regex "~1.0.5"
+ minimist "~1.2.5"
+ object-inspect "~1.7.0"
+ resolve "~1.17.0"
+ resumer "~0.0.0"
+ string.prototype.trim "~1.2.1"
+ through "~2.3.8"
+
+tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
+ integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+testrpc@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed"
+ integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==
+
+through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@~2.3.4, through@~2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+"true-case-path@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf"
+ integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==
+
+ts-essentials@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
+ integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
+
+ts-essentials@^6.0.3:
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6"
+ integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
+
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
+ dependencies:
+ "@types/mkdirp" "^0.5.2"
+ "@types/prettier" "^2.1.1"
+ "@types/resolve" "^0.0.8"
+ chalk "^2.4.1"
+ glob "^7.1.2"
+ mkdirp "^0.5.1"
+ prettier "^2.1.2"
+ resolve "^1.8.1"
+ ts-essentials "^1.0.0"
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.0:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+tweetnacl@^1.0.0, tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typechain@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e"
+ integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==
+ dependencies:
+ command-line-args "^4.0.7"
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ ts-essentials "^6.0.3"
+ ts-generator "^0.1.1"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typescript@^4.3.4:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4"
+ integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==
+
+typewise-core@^1.2, typewise-core@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
+ integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+
+typewise@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651"
+ integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+ dependencies:
+ typewise-core "^1.2.0"
+
+typewiselite@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e"
+ integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+
+typical@^2.6.0, typical@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
+ integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+underscore@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unorm@^1.3.3:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0, util.promisify@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f"
+ integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.9.1"
+
+web3-core-helpers@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99"
+ integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==
+ dependencies:
+ underscore "1.9.1"
+ web3-eth-iban "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-method@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6"
+ integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-promievent@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf"
+ integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a"
+ integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==
+ dependencies:
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-providers-http "1.2.11"
+ web3-providers-ipc "1.2.11"
+ web3-providers-ws "1.2.11"
+
+web3-core-subscriptions@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd"
+ integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-core@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7"
+ integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-requestmanager "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-abi@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0"
+ integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==
+ dependencies:
+ "@ethersproject/abi" "5.0.0-beta.153"
+ underscore "1.9.1"
+ web3-utils "1.2.11"
+
+web3-eth-accounts@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520"
+ integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.9.1"
+ uuid "3.3.2"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-contract@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90"
+ integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-ens@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532"
+ integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-iban@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef"
+ integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.2.11"
+
+web3-eth-personal@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70"
+ integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793"
+ integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==
+ dependencies:
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-accounts "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-eth-ens "1.2.11"
+ web3-eth-iban "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-net@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b"
+ integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-provider-engine@14.2.1:
+ version "14.2.1"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95"
+ integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==
+ dependencies:
+ 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"
+
+web3-providers-http@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6"
+ integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==
+ dependencies:
+ web3-core-helpers "1.2.11"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21"
+ integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==
+ dependencies:
+ oboe "2.1.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-providers-ws@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb"
+ integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ websocket "^1.0.31"
+
+web3-shh@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f"
+ integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-net "1.2.11"
+
+web3-utils@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82"
+ integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@^1.0.0-beta.31:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.4.0.tgz#e8cb381c81b242dc1d4ecb397200356d404410e6"
+ integrity sha512-b8mEhwh/J928Xk+SQFjtqrR2EGPhpknWLcIt9aCpVPVRXiqjUGo/kpOHKz0azu9c6/onEJ9tWXZt0cVjmH0N5Q==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975"
+ integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==
+ dependencies:
+ web3-bzz "1.2.11"
+ web3-core "1.2.11"
+ web3-eth "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-shh "1.2.11"
+ web3-utils "1.2.11"
+
+websocket@1.0.32:
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+websocket@^1.0.31:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1.3.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+workerpool@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
+ integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
+ integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^7.4.6:
+ version "7.5.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6"
+ integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@20.2.4:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
+
+yargs-unparser@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yargs@^4.7.1:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+ integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA=
+ dependencies:
+ 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"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/omgx_examples/sushi/.env.example b/omgx_examples/sushi/.env.example
new file mode 100644
index 000000000000..c82d8889ea4f
--- /dev/null
+++ b/omgx_examples/sushi/.env.example
@@ -0,0 +1,7 @@
+L2_NODE_WEB3_URL=http://localhost:8545
+DEPLOYER_PRIVATE_KEY=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_1=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_2=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
+TEST_PRIVATE_KEY_3=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+TEST_PRIVATE_KEY_4=0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
+TEST_PRIVATE_KEY_5=0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
\ No newline at end of file
diff --git a/omgx_examples/sushi/PORTING.md b/omgx_examples/sushi/PORTING.md
new file mode 100644
index 000000000000..715249c64980
--- /dev/null
+++ b/omgx_examples/sushi/PORTING.md
@@ -0,0 +1,162 @@
+# Porting to OMGX and Optimism - A case study.
+
+- [Porting to OMGX and Optimism - A case study.](#porting-to-omgx-and-optimism---a-case-study)
+ * [SUSHI](#sushi)
+ * [0. Basics](#0-basics)
+ * [1. No native ETH](#1-no-native-eth)
+ * [2. Timing, `now`, and `block.timestamp`](#2-timing---now---and--blocktimestamp)
+ * [3. Replace `chainid()` with `uint256 chainId = ___`](#3-replace--chainid----with--uint256-chainid)
+ * [4. Update Depreciated Syntax](#5-update-depreciated-syntax)
+ * [5. No tx.origin](#6-no-txorigin)
+ * [6. TEST RESULTS: evm_increaseTime and evm_mine](#7-tests-results--all-good-except-evm-increasetime-and-evm-mine---workaround-pending)
+
+## SUSHI
+
+SUSHI is a DeFi exchange that supports token swapping and many other actions. We started by copying SUSHI's smart contracts into the `/contracts` folder. Then, we ran:
+
+```bash
+yarn install
+yarn build
+yarn analyze
+yarn deploy
+```
+
+We then addressed the warnings and errors one by one. Let's now take that all, step by step.
+
+## 0. Basics
+
+**Your contracts.** As noted, run `yarn install` and drop your contracts into a folder called `contracts`. That's what solc and hardhat will look at, compile, and deploy. Then, run:
+
+```bash
+yarn build
+```
+
+The first time you do this, you will see dozens of errors.
+
+**Missing libraries.** The provided `package.json` is generic and you will see HH411 errors such as
+
+```
+Error HH411: The library foo, imported from contracts/something.sol, is not installed. Try installing it using npm.
+```
+
+This means that you have to install the foo library:
+
+```bash
+yarn add foo
+```
+
+**Solidity Versions.** Once all the missing libraries have been installed, you will see `HH606` errors:
+
+```
+Error HH606: The project cannot be compiled, see reasons below.
+
+The Solidity version pragma statement in these files don't match any of the configured compilers in your config. Change the pragma or configure additional compiler versions in your hardhat config.
+
+ * contracts/something.sol (^0.6.0)
+```
+
+The optimism solc compiler supports Solidity versions 0.5.16, 0.6.12, and 0.7.6. This value is set in `hardhat.config.js`. The first time you run `yarn build` you will typically see many errors relating to your pragmas. If most of your pragmas are around 0.6 you would chose 0.6.12, and so forth. In general, small modifications (such as replacing `^0.5.17` with `^0.5.16` or specifying a broader range such as `pragma solidity >= 0.5.16 < 0.6.5;`) will not affect your code and your unit and integration tests will pick up any exceptions.
+
+At this point, solc and hardhat have all the information they need to get started. Now, you will see actual code issues, such as:
+
+```
+OVM Compiler Error (insert "// @unsupported: ovm" if you don't want this file to be compiled for the OVM):
+ contracts/foo.sol:72:31: ParserError: OVM: ORIGIN is not implemented in the OVM.
+ require(msg.sender == tx.origin, "not eoa");
+
+OVM Compiler Error (insert "// @unsupported: ovm" if you don't want this file to be compiled for the OVM):
+ contracts/WETH.sol:51:16: ParserError: OVM: SELFBALANCE is not implemented in the OVM. (We have no native ETH -- use deposited WETH instead!)
+ return address(this).balance;
+ ^-------------------^
+
+Error HH600: Compilation failed
+```
+
+Let's now tackle those one by one.
+
+## 1. No native ETH
+
+In many smart contracts, ETH is handled slightly differently than ERC20 tokens, but on L2, there is no native ETH. Instead, L2s use an ERC20 representation of ETH such as wETH or oETH. This means that all ETH-specific functions can be deleted, since there are no longer needed. For example:
+
+```diff
+
+contracts/uniswapv2/interfaces/IUniswapV2Router01.sol
+@@ -16,14 +17,15 @@ interface IUniswapV2Router01 {
+ ...
+- function addLiquidityETH(
+- address token,
+- uint amountTokenDesired,
+- uint amountTokenMin,
+- uint amountETHMin,
+- address to,
+- uint deadline
+- ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
++ // CHANGE_OMGX
++ // function addLiquidityETH(
++ // address token,
++ // uint amountTokenDesired,
++ // uint amountTokenMin,
++ // uint amountETHMin,
++ // address to,
++ // uint deadline
++ // ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
+
+```
+
+From a UI/Frontend perspective, 'native' ETH functions are no longer needed and integration test code will also need any ETH-specific tests to be commented out. In the case of the SUSHI port, among other changes, `contracts/mocks/WETH9Mock.sol` can be deleted entirely and many functions in `contracts/uniswapv2/UniswapV2Router02.sol` can also be deleted, such as `removeLiquidityETH` and `swapExactETHForTokens` etc. Removing functions in the contracts also affects the interfaces, of course, e.g. `contracts/uniswapv2/interfaces/IUniswapV2Router01.sol`.
+
+## 2. Timing, `now`, and `block.timestamp`
+
+The L2 does not have traditional blocks. Control over time, and manipulation of apparent time, is critical for L2, since during a fraud proof, the L1 contacts will need to replay the L2 contracts at specific times _in the past_ to check their correctness. `block.timestamp` returns the last L1 block in which a rollup batch was posted. This means that the `block.timestamp` returned on L2 can lag as many as 10 minutes behind L1. Depending on how `block.timestamp` is being used, this 1-10 min lag could have **serious unexpected implications**. See [OVM-vs-EVM-Block-Timestamps](https://hackmd.io/@scopelift/Hy853dTsP#OVM-vs-EVM-Block-Timestamps) for a more extensive discussion. Briefly, consider:
+
+1. The OVM timestamp lags behind the EVM, so it’s possible that e.g. OVM trades execute up 10 minutes after your specified deadline.
+2. `permit` method signatures contain a deadline, and the approval must be sent before that deadline. In certain cases, the approval could take place after the deadline.
+3. Bid and auction duration. If you are trying to run an auction with minute scale bid duration, then a 1-10 minute lag relative to L1 could throw that off completely.
+
+## 3. Replace `chainid()` with `uint256 chainId = ___`
+
+```diff
+
+contracts/SushiToken.sol
+@@ -239,8 +241,8 @@ contract SushiToken is ERC20("SushiToken", "SUSHI"), Ownable {
+ ...
+ function getChainId() internal pure returns (uint) {
+- uint256 chainId;
++ uint256 chainId = 28; //or whatever the L2 ChainID is...
++ //assembly { chainId := chainid() }
+
+```
+
+## 4. Update Depreciated Syntax
+
+Not strictly L2 related, but updated it to help with future maintainability.
+
+```diff
+
+contracts/governance/Timelock.sol
+- (bool success, bytes memory returnData) = target.call.value(value)(callData);
++ (bool success, bytes memory returnData) = target.call{value:value}(callData);
+
+// The following syntax is deprecated:
+// f.gas(...)(), f.value(...)() and (new C).value(...)().
+// Replace with:
+// f{gas: ..., value: ...}() and (new C){value: ...}().
+
+```
+
+## 5. No tx.origin
+
+L2 does not support `tx.origin`. This is typically a non-issue, since `tx.origin` is deprecated anyway and will be removed from L1 at some point. See [Vitalik's answer](https://ethereum.stackexchange.com/questions/196/how-do-i-make-my-dapp-serenity-proof). Secondly, only allowing txs from an EOA is considered an anti-pattern. It breaks composability, it prevents multisig wallets from using your product, and in general it's probably a hack to cover up some underlying security issues in the contracts. There is no easy/obvious one-line replacement for `tx.origin` - any attempt to try to detect the codesize or something of the calling contract would be spoofable. For Compound's use of `msg.sender == tx.origin`, as for Sushi, the best approach is to remove that restriction and make sure the contracts can safely handle calls from other contracts (which involves writing new code). For now, we just commented out the `require`.
+
+```diff
+
+contracts/SushiMaker.sol
+ // Try to make flash-loan exploit harder to do by only allowing externally owned addresses.
+- require(msg.sender == tx.origin, "SushiMaker: must use EOA");
++ //require(msg.sender == tx.origin, "SushiMaker: must use EOA");
+
+```
+
+## 6. TESTS RESULTS: All good EXCEPT evm_increaseTime and evm_mine
+
+All tests clear EXCEPT things related to `evm_increaseTime` and `evm_mine`. Note that this does not affect the contracts _per se_ but affects testing.
\ No newline at end of file
diff --git a/omgx_examples/sushi/README.md b/omgx_examples/sushi/README.md
new file mode 100644
index 000000000000..4bafed61ad22
--- /dev/null
+++ b/omgx_examples/sushi/README.md
@@ -0,0 +1,111 @@
+- [The Contracts Analyzer](#the-contract-analyzer)
+ * [Prerequisites](#prerequisites)
+ * [Setting Up](#setting-up)
+ * [Add Contracts](#add-contracts)
+ * [Notes](#notes)
+ * [Deploying Contracts to LOCAL L2](#deploying-contracts-to-local-l2)
+ * [Deploying Contracts to OMGX RINKEBY](#deploying-contracts-to-omgx-rinkeby)
+ * [Test](#test)
+
+# The Contracts Analyzer
+
+This repo is used to analyze contracts written for L1, as a starting point for evaluating potential code changes needed to deploy them to L2.
+
+## Prerequisites
+
+Please make sure you've installed:
+
+- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+- [Node.js](https://nodejs.org/en/download/)
+- [Yarn](https://classic.yarnpkg.com/en/docs/install#mac-stable)
+
+## Add Contracts
+
+Copy your contracts into `/contracts` and run:
+
+```bash
+yarn build #build the smart contracts with optimistic solc
+yarn analyze
+```
+
+You will probably have to `yarn add` multiple packages, and change/update pragmas, such as, to `pragma solidity 0.6.12;`
+
+## Notes
+
+The code compliles the contracts, which will typically provide extensive debug information and warnings/errors, and also checks for contract size and inline assembly.
+
+## Deploying Contracts to LOCAL L2
+
+First, make sure you have a `.env`. The five TEST_PRIVATE_KEYs are used for testing. The DEPLOYER_PRIVATE_KEY is used to deploy contracts. Since (right now) we don't charge oWETH to deploy contracts on L2, the wallets do not need any funds in them.
+
+```javascript
+L2_NODE_WEB3_URL=http://localhost:8545
+DEPLOYER_PRIVATE_KEY=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_1=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_2=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
+TEST_PRIVATE_KEY_3=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+TEST_PRIVATE_KEY_4=0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
+TEST_PRIVATE_KEY_5=0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
+```
+
+Then, deploy:
+
+```bash
+yarn deploy
+```
+
+You should then see a list of contract addresses.
+
+## Deploying Contracts to OMGX RINKEBY
+
+Make sure you have a `.env`, and that the `L2_NODE_WEB3_URL` is set correctly. Then, set your variables similar to this:
+
+```javascript
+L2_NODE_WEB3_URL=https://rinkeby.omgx.network
+DEPLOYER_PRIVATE_KEY=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_1=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_2=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
+TEST_PRIVATE_KEY_3=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+TEST_PRIVATE_KEY_4=0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
+TEST_PRIVATE_KEY_5=0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
+```
+
+Next, comment out `{gasPrice: 0, gasLimit: 800000}` in three places - they are not needed for now:
+
+```
+GitHub/optimism/packages/omgx/contracts-analyzer/scripts/deploy.js:
+ 66 // Transfer Sushi Ownership to Chef
+ 67 console.log(" 🔑 Transfer Sushi Ownership to Chef")
+ 68: await (await SushiToken.transferOwnership(MasterChef.address, { gasLimit: 800000, gasPrice: 0 })).wait()
+ 69 }
+ 70
+ ..
+ 72 // Transfer ownership of MasterChef to Dev
+ 73 console.log(" 🔑 Transfer ownership of MasterChef to Dev")
+ 74: await (await MasterChef.transferOwnership(deployAddress, { gasLimit: 800000, gasPrice: 0 })).wait()
+ 75 }
+ 76
+
+GitHub/optimism/packages/omgx/contracts-analyzer/scripts/utils.js:
+ 30
+ 31 const nonce = await signerProvider.getTransactionCount()
+ 32: const deployed = await contractArtifacts.deploy(...contractArgs, { nonce, ...overrides, gasPrice: 0, gasLimit: 800000 });
+ 33 await deployed.deployTransaction.wait()
+ 34
+```
+
+Finally, deploy:
+
+```bash
+yarn deploy
+```
+
+You should then see a list of contract addresses.
+
+## Testing
+
+```bash
+yarn test:contracts
+```
+
+If you get `Error: insufficient funds for intrinsic transaction cost`, this means you need to explicitely set `{gasPrice: 0, gasLimit: 800000}` when you call contracts, such as in `await this.Factory__MasterChef.deploy`.
diff --git a/omgx_examples/sushi/contracts/MasterChef.sol b/omgx_examples/sushi/contracts/MasterChef.sol
new file mode 100644
index 000000000000..e82548a582c6
--- /dev/null
+++ b/omgx_examples/sushi/contracts/MasterChef.sol
@@ -0,0 +1,297 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+import "@openzeppelin/contracts/utils/EnumerableSet.sol";
+import "@openzeppelin/contracts/math/SafeMath.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+import "./SushiToken.sol";
+
+interface IMigratorChef {
+ // Perform LP token migration from legacy UniswapV2 to SushiSwap.
+ // Take the current LP token address and return the new LP token address.
+ // Migrator should have full access to the caller's LP token.
+ // Return the new LP token address.
+ //
+ // XXX Migrator must have allowance access to UniswapV2 LP tokens.
+ // SushiSwap must mint EXACTLY the same amount of SushiSwap LP tokens or
+ // else something bad will happen. Traditional UniswapV2 does not
+ // do that so be careful!
+ function migrate(IERC20 token) external returns (IERC20);
+}
+
+// MasterChef is the master of Sushi. He can make Sushi and he is a fair guy.
+//
+// Note that it's ownable and the owner wields tremendous power. The ownership
+// will be transferred to a governance smart contract once SUSHI is sufficiently
+// distributed and the community can show to govern itself.
+//
+// Have fun reading it. Hopefully it's bug-free. God bless.
+contract MasterChef is Ownable {
+ using SafeMath for uint256;
+ using SafeERC20 for IERC20;
+ // Info of each user.
+ struct UserInfo {
+ uint256 amount; // How many LP tokens the user has provided.
+ uint256 rewardDebt; // Reward debt. See explanation below.
+ //
+ // We do some fancy math here. Basically, any point in time, the amount of SUSHIs
+ // entitled to a user but is pending to be distributed is:
+ //
+ // pending reward = (user.amount * pool.accSushiPerShare) - user.rewardDebt
+ //
+ // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
+ // 1. The pool's `accSushiPerShare` (and `lastRewardBlock`) gets updated.
+ // 2. User receives the pending reward sent to his/her address.
+ // 3. User's `amount` gets updated.
+ // 4. User's `rewardDebt` gets updated.
+ }
+ // Info of each pool.
+ struct PoolInfo {
+ IERC20 lpToken; // Address of LP token contract.
+ uint256 allocPoint; // How many allocation points assigned to this pool. SUSHIs to distribute per block.
+ uint256 lastRewardBlock; // Last block number that SUSHIs distribution occurs.
+ uint256 accSushiPerShare; // Accumulated SUSHIs per share, times 1e12. See below.
+ }
+ // The SUSHI TOKEN!
+ SushiToken public sushi;
+ // Dev address.
+ address public devaddr;
+ // Block number when bonus SUSHI period ends.
+ uint256 public bonusEndBlock;
+ // SUSHI tokens created per block.
+ uint256 public sushiPerBlock;
+ // Bonus muliplier for early sushi makers.
+ uint256 public constant BONUS_MULTIPLIER = 10;
+ // The migrator contract. It has a lot of power. Can only be set through governance (owner).
+ IMigratorChef public migrator;
+ // Info of each pool.
+ PoolInfo[] public poolInfo;
+ // Info of each user that stakes LP tokens.
+ mapping(uint256 => mapping(address => UserInfo)) public userInfo;
+ // Total allocation poitns. Must be the sum of all allocation points in all pools.
+ uint256 public totalAllocPoint = 0;
+ // The block number when SUSHI mining starts.
+ uint256 public startBlock;
+ event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
+ event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
+ event EmergencyWithdraw(
+ address indexed user,
+ uint256 indexed pid,
+ uint256 amount
+ );
+
+ constructor(
+ SushiToken _sushi,
+ address _devaddr,
+ uint256 _sushiPerBlock,
+ uint256 _startBlock,
+ uint256 _bonusEndBlock
+ ) public {
+ sushi = _sushi;
+ devaddr = _devaddr;
+ sushiPerBlock = _sushiPerBlock;
+ bonusEndBlock = _bonusEndBlock;
+ startBlock = _startBlock;
+ }
+
+ function poolLength() external view returns (uint256) {
+ return poolInfo.length;
+ }
+
+ // Add a new lp to the pool. Can only be called by the owner.
+ // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ function add(
+ uint256 _allocPoint,
+ IERC20 _lpToken,
+ bool _withUpdate
+ ) public onlyOwner {
+ if (_withUpdate) {
+ massUpdatePools();
+ }
+ uint256 lastRewardBlock =
+ block.number > startBlock ? block.number : startBlock;
+ totalAllocPoint = totalAllocPoint.add(_allocPoint);
+ poolInfo.push(
+ PoolInfo({
+ lpToken: _lpToken,
+ allocPoint: _allocPoint,
+ lastRewardBlock: lastRewardBlock,
+ accSushiPerShare: 0
+ })
+ );
+ }
+
+ // Update the given pool's SUSHI allocation point. Can only be called by the owner.
+ function set(
+ uint256 _pid,
+ uint256 _allocPoint,
+ bool _withUpdate
+ ) public onlyOwner {
+ if (_withUpdate) {
+ massUpdatePools();
+ }
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(
+ _allocPoint
+ );
+ poolInfo[_pid].allocPoint = _allocPoint;
+ }
+
+ // Set the migrator contract. Can only be called by the owner.
+ function setMigrator(IMigratorChef _migrator) public onlyOwner {
+ migrator = _migrator;
+ }
+
+ // Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good.
+ function migrate(uint256 _pid) public {
+ require(address(migrator) != address(0), "migrate: no migrator");
+ PoolInfo storage pool = poolInfo[_pid];
+ IERC20 lpToken = pool.lpToken;
+ uint256 bal = lpToken.balanceOf(address(this));
+ lpToken.safeApprove(address(migrator), bal);
+ IERC20 newLpToken = migrator.migrate(lpToken);
+ require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
+ pool.lpToken = newLpToken;
+ }
+
+ // Return reward multiplier over the given _from to _to block.
+ function getMultiplier(uint256 _from, uint256 _to)
+ public
+ view
+ returns (uint256)
+ {
+ if (_to <= bonusEndBlock) {
+ return _to.sub(_from).mul(BONUS_MULTIPLIER);
+ } else if (_from >= bonusEndBlock) {
+ return _to.sub(_from);
+ } else {
+ return
+ bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
+ _to.sub(bonusEndBlock)
+ );
+ }
+ }
+
+ // View function to see pending SUSHIs on frontend.
+ function pendingSushi(uint256 _pid, address _user)
+ external
+ view
+ returns (uint256)
+ {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = pool.lpToken.balanceOf(address(this));
+ if (block.number > pool.lastRewardBlock && lpSupply != 0) {
+ uint256 multiplier =
+ getMultiplier(pool.lastRewardBlock, block.number);
+ uint256 sushiReward =
+ multiplier.mul(sushiPerBlock).mul(pool.allocPoint).div(
+ totalAllocPoint
+ );
+ accSushiPerShare = accSushiPerShare.add(
+ sushiReward.mul(1e12).div(lpSupply)
+ );
+ }
+ return user.amount.mul(accSushiPerShare).div(1e12).sub(user.rewardDebt);
+ }
+
+ // Update reward vairables for all pools. Be careful of gas spending!
+ function massUpdatePools() public {
+ uint256 length = poolInfo.length;
+ for (uint256 pid = 0; pid < length; ++pid) {
+ updatePool(pid);
+ }
+ }
+
+ // Update reward variables of the given pool to be up-to-date.
+ function updatePool(uint256 _pid) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ if (block.number <= pool.lastRewardBlock) {
+ return;
+ }
+ uint256 lpSupply = pool.lpToken.balanceOf(address(this));
+ if (lpSupply == 0) {
+ pool.lastRewardBlock = block.number;
+ return;
+ }
+ uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
+ uint256 sushiReward =
+ multiplier.mul(sushiPerBlock).mul(pool.allocPoint).div(
+ totalAllocPoint
+ );
+ sushi.mint(devaddr, sushiReward.div(10));
+ sushi.mint(address(this), sushiReward);
+ pool.accSushiPerShare = pool.accSushiPerShare.add(
+ sushiReward.mul(1e12).div(lpSupply)
+ );
+ pool.lastRewardBlock = block.number;
+ }
+
+ // Deposit LP tokens to MasterChef for SUSHI allocation.
+ function deposit(uint256 _pid, uint256 _amount) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][msg.sender];
+ updatePool(_pid);
+ if (user.amount > 0) {
+ uint256 pending =
+ user.amount.mul(pool.accSushiPerShare).div(1e12).sub(
+ user.rewardDebt
+ );
+ safeSushiTransfer(msg.sender, pending);
+ }
+ pool.lpToken.safeTransferFrom(
+ address(msg.sender),
+ address(this),
+ _amount
+ );
+ user.amount = user.amount.add(_amount);
+ user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12);
+ emit Deposit(msg.sender, _pid, _amount);
+ }
+
+ // Withdraw LP tokens from MasterChef.
+ function withdraw(uint256 _pid, uint256 _amount) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][msg.sender];
+ require(user.amount >= _amount, "withdraw: not good");
+ updatePool(_pid);
+ uint256 pending =
+ user.amount.mul(pool.accSushiPerShare).div(1e12).sub(
+ user.rewardDebt
+ );
+ safeSushiTransfer(msg.sender, pending);
+ user.amount = user.amount.sub(_amount);
+ user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12);
+ pool.lpToken.safeTransfer(address(msg.sender), _amount);
+ emit Withdraw(msg.sender, _pid, _amount);
+ }
+
+ // Withdraw without caring about rewards. EMERGENCY ONLY.
+ function emergencyWithdraw(uint256 _pid) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][msg.sender];
+ pool.lpToken.safeTransfer(address(msg.sender), user.amount);
+ emit EmergencyWithdraw(msg.sender, _pid, user.amount);
+ user.amount = 0;
+ user.rewardDebt = 0;
+ }
+
+ // Safe sushi transfer function, just in case if rounding error causes pool to not have enough SUSHIs.
+ function safeSushiTransfer(address _to, uint256 _amount) internal {
+ uint256 sushiBal = sushi.balanceOf(address(this));
+ if (_amount > sushiBal) {
+ sushi.transfer(_to, sushiBal);
+ } else {
+ sushi.transfer(_to, _amount);
+ }
+ }
+
+ // Update dev address by the previous dev.
+ function dev(address _devaddr) public {
+ require(msg.sender == devaddr, "dev: wut?");
+ devaddr = _devaddr;
+ }
+}
diff --git a/omgx_examples/sushi/contracts/MasterChefV2.sol b/omgx_examples/sushi/contracts/MasterChefV2.sol
new file mode 100644
index 000000000000..d1ed2db01f5d
--- /dev/null
+++ b/omgx_examples/sushi/contracts/MasterChefV2.sol
@@ -0,0 +1,328 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "./libraries/SignedSafeMath.sol";
+import "./interfaces/IRewarder.sol";
+import "./interfaces/IMasterChef.sol";
+
+interface IMigratorChef {
+ // Take the current LP token address and return the new LP token address.
+ // Migrator should have full access to the caller's LP token.
+ function migrate(IERC20 token) external returns (IERC20);
+}
+
+/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.
+/// It is the only address with minting rights for SUSHI.
+/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token
+/// that is deposited into the MasterChef V1 (MCV1) contract.
+/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.
+contract MasterChefV2 is BoringOwnable, BoringBatchable {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+ using SignedSafeMath for int256;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ int256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardBlock;
+ uint64 allocPoint;
+ }
+
+ /// @notice Address of MCV1 contract.
+ IMasterChef public immutable MASTER_CHEF;
+ /// @notice Address of SUSHI contract.
+ IERC20 public immutable SUSHI;
+ /// @notice The index of MCV2 master pool in MCV1.
+ uint256 public immutable MASTER_PID;
+ // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).
+ IMigratorChef public migrator;
+
+ /// @notice Info of each MCV2 pool.
+ PoolInfo[] public poolInfo;
+ /// @notice Address of the LP token for each MCV2 pool.
+ IERC20[] public lpToken;
+ /// @notice Address of each `IRewarder` contract in MCV2.
+ IRewarder[] public rewarder;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 public totalAllocPoint;
+
+ uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20;
+ uint256 private constant ACC_SUSHI_PRECISION = 1e12;
+
+ event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogInit();
+
+ /// @param _MASTER_CHEF The SushiSwap MCV1 contract address.
+ /// @param _sushi The SUSHI token contract address.
+ /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract.
+ constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public {
+ MASTER_CHEF = _MASTER_CHEF;
+ SUSHI = _sushi;
+ MASTER_PID = _MASTER_PID;
+ }
+
+ /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.
+ /// Any balance of transaction sender in `dummyToken` is transferred.
+ /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.
+ /// @param dummyToken The address of the ERC-20 token to deposit into MCV1.
+ function init(IERC20 dummyToken) external {
+ uint256 balance = dummyToken.balanceOf(msg.sender);
+ require(balance != 0, "MasterChefV2: Balance must exceed 0");
+ dummyToken.safeTransferFrom(msg.sender, address(this), balance);
+ dummyToken.approve(address(MASTER_CHEF), balance);
+ MASTER_CHEF.deposit(MASTER_PID, balance);
+ emit LogInit();
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolInfo.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _lpToken Address of the LP ERC-20 token.
+ /// @param _rewarder Address of the rewarder delegate.
+ function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {
+ uint256 lastRewardBlock = block.number;
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+ lpToken.push(_lpToken);
+ rewarder.push(_rewarder);
+
+ poolInfo.push(PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardBlock: lastRewardBlock.to64(),
+ accSushiPerShare: 0
+ }));
+ emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ /// @param _rewarder Address of the rewarder delegate.
+ /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
+ function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ if (overwrite) { rewarder[_pid] = _rewarder; }
+ emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
+ }
+
+ /// @notice Set the `migrator` contract. Can only be called by the owner.
+ /// @param _migrator The contract address to set.
+ function setMigrator(IMigratorChef _migrator) public onlyOwner {
+ migrator = _migrator;
+ }
+
+ /// @notice Migrate LP token to another LP contract through the `migrator` contract.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ function migrate(uint256 _pid) public {
+ require(address(migrator) != address(0), "MasterChefV2: no migrator set");
+ IERC20 _lpToken = lpToken[_pid];
+ uint256 bal = _lpToken.balanceOf(address(this));
+ _lpToken.approve(address(migrator), bal);
+ IERC20 newLpToken = migrator.migrate(_lpToken);
+ require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match");
+ lpToken[_pid] = newLpToken;
+ }
+
+ /// @notice View function to see pending SUSHI on frontend.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
+ if (block.number > pool.lastRewardBlock && lpSupply != 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);
+ }
+ pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Calculates and returns the `amount` of SUSHI per block.
+ function sushiPerBlock() public view returns (uint256 amount) {
+ amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK)
+ .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint();
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.number > pool.lastRewardBlock) {
+ uint256 lpSupply = lpToken[pid].balanceOf(address(this));
+ if (lpSupply > 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardBlock = block.number.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+ /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to deposit.
+ /// @param to The receiver of `amount` deposit benefit.
+ function deposit(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][to];
+
+ // Effects
+ user.amount = user.amount.add(amount);
+ user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, to, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);
+
+ emit Deposit(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens.
+ function withdraw(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+
+ // Effects
+ user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of SUSHI rewards.
+ function harvest(uint256 pid, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi;
+
+ // Interactions
+ if (_pendingSushi != 0) {
+ SUSHI.safeTransfer(to, _pendingSushi);
+ }
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens and SUSHI rewards.
+ function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ SUSHI.safeTransfer(to, _pendingSushi);
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.
+ function harvestFromMasterChef() public {
+ MASTER_CHEF.deposit(MASTER_PID, 0);
+ }
+
+ /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of the LP tokens.
+ function emergencyWithdraw(uint256 pid, address to) public {
+ UserInfo storage user = userInfo[pid][msg.sender];
+ uint256 amount = user.amount;
+ user.amount = 0;
+ user.rewardDebt = 0;
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);
+ }
+
+ // Note: transfer can fail or succeed if `amount` is zero.
+ lpToken[pid].safeTransfer(to, amount);
+ emit EmergencyWithdraw(msg.sender, pid, amount, to);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/Migrator.sol b/omgx_examples/sushi/contracts/Migrator.sol
new file mode 100644
index 000000000000..4fc535ca70c5
--- /dev/null
+++ b/omgx_examples/sushi/contracts/Migrator.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+
+
+contract Migrator {
+ address public chef;
+ address public oldFactory;
+ IUniswapV2Factory public factory;
+ uint256 public notBeforeBlock;
+ uint256 public desiredLiquidity = uint256(-1);
+
+ constructor(
+ address _chef,
+ address _oldFactory,
+ IUniswapV2Factory _factory,
+ uint256 _notBeforeBlock
+ ) public {
+ chef = _chef;
+ oldFactory = _oldFactory;
+ factory = _factory;
+ notBeforeBlock = _notBeforeBlock;
+ }
+
+ function migrate(IUniswapV2Pair orig) public returns (IUniswapV2Pair) {
+ require(msg.sender == chef, "not from master chef");
+ require(block.number >= notBeforeBlock, "too early to migrate");
+ require(orig.factory() == oldFactory, "not from old factory");
+ address token0 = orig.token0();
+ address token1 = orig.token1();
+ IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(token0, token1));
+ if (pair == IUniswapV2Pair(address(0))) {
+ pair = IUniswapV2Pair(factory.createPair(token0, token1));
+ }
+ uint256 lp = orig.balanceOf(msg.sender);
+ if (lp == 0) return pair;
+ desiredLiquidity = lp;
+ orig.transferFrom(msg.sender, address(orig), lp);
+ orig.burn(address(pair));
+ pair.mint(msg.sender);
+ desiredLiquidity = uint256(-1);
+ return pair;
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/MiniChefV2.sol b/omgx_examples/sushi/contracts/MiniChefV2.sol
new file mode 100644
index 000000000000..536cd9e81fbf
--- /dev/null
+++ b/omgx_examples/sushi/contracts/MiniChefV2.sol
@@ -0,0 +1,302 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "./libraries/SignedSafeMath.sol";
+import "./interfaces/IRewarder.sol";
+import "./interfaces/IMasterChef.sol";
+
+interface IMigratorChef {
+ // Take the current LP token address and return the new LP token address.
+ // Migrator should have full access to the caller's LP token.
+ function migrate(IERC20 token) external returns (IERC20);
+}
+
+/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.
+/// It is the only address with minting rights for SUSHI.
+/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token
+/// that is deposited into the MasterChef V1 (MCV1) contract.
+/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.
+contract MiniChefV2 is BoringOwnable, BoringBatchable {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+ using SignedSafeMath for int256;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ int256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardTime;
+ uint64 allocPoint;
+ }
+
+ /// @notice Address of SUSHI contract.
+ IERC20 public immutable SUSHI;
+ // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).
+ IMigratorChef public migrator;
+
+ /// @notice Info of each MCV2 pool.
+ PoolInfo[] public poolInfo;
+ /// @notice Address of the LP token for each MCV2 pool.
+ IERC20[] public lpToken;
+ /// @notice Address of each `IRewarder` contract in MCV2.
+ IRewarder[] public rewarder;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 public totalAllocPoint;
+
+ uint256 public sushiPerSecond;
+ uint256 private constant ACC_SUSHI_PRECISION = 1e12;
+
+ event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogSushiPerSecond(uint256 sushiPerSecond);
+
+ /// @param _sushi The SUSHI token contract address.
+ constructor(IERC20 _sushi) public {
+ SUSHI = _sushi;
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolInfo.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _lpToken Address of the LP ERC-20 token.
+ /// @param _rewarder Address of the rewarder delegate.
+ function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+ lpToken.push(_lpToken);
+ rewarder.push(_rewarder);
+
+ poolInfo.push(PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardTime: block.timestamp.to64(),
+ accSushiPerShare: 0
+ }));
+ emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ /// @param _rewarder Address of the rewarder delegate.
+ /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
+ function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ if (overwrite) { rewarder[_pid] = _rewarder; }
+ emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
+ }
+
+ /// @notice Sets the sushi per second to be distributed. Can only be called by the owner.
+ /// @param _sushiPerSecond The amount of Sushi to be distributed per second.
+ function setSushiPerSecond(uint256 _sushiPerSecond) public onlyOwner {
+ sushiPerSecond = _sushiPerSecond;
+ emit LogSushiPerSecond(_sushiPerSecond);
+ }
+
+ /// @notice Set the `migrator` contract. Can only be called by the owner.
+ /// @param _migrator The contract address to set.
+ function setMigrator(IMigratorChef _migrator) public onlyOwner {
+ migrator = _migrator;
+ }
+
+ /// @notice Migrate LP token to another LP contract through the `migrator` contract.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ function migrate(uint256 _pid) public {
+ require(address(migrator) != address(0), "MasterChefV2: no migrator set");
+ IERC20 _lpToken = lpToken[_pid];
+ uint256 bal = _lpToken.balanceOf(address(this));
+ _lpToken.approve(address(migrator), bal);
+ IERC20 newLpToken = migrator.migrate(_lpToken);
+ require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match");
+ lpToken[_pid] = newLpToken;
+ }
+
+ /// @notice View function to see pending SUSHI on frontend.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
+ if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(sushiPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);
+ }
+ pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.timestamp > pool.lastRewardTime) {
+ uint256 lpSupply = lpToken[pid].balanceOf(address(this));
+ if (lpSupply > 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(sushiPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardTime = block.timestamp.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+ /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to deposit.
+ /// @param to The receiver of `amount` deposit benefit.
+ function deposit(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][to];
+
+ // Effects
+ user.amount = user.amount.add(amount);
+ user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, to, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);
+
+ emit Deposit(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens.
+ function withdraw(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+
+ // Effects
+ user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of SUSHI rewards.
+ function harvest(uint256 pid, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi;
+
+ // Interactions
+ if (_pendingSushi != 0) {
+ SUSHI.safeTransfer(to, _pendingSushi);
+ }
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens and SUSHI rewards.
+ function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ SUSHI.safeTransfer(to, _pendingSushi);
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of the LP tokens.
+ function emergencyWithdraw(uint256 pid, address to) public {
+ UserInfo storage user = userInfo[pid][msg.sender];
+ uint256 amount = user.amount;
+ user.amount = 0;
+ user.rewardDebt = 0;
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);
+ }
+
+ // Note: transfer can fail or succeed if `amount` is zero.
+ lpToken[pid].safeTransfer(to, amount);
+ emit EmergencyWithdraw(msg.sender, pid, amount, to);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/Ownable.sol b/omgx_examples/sushi/contracts/Ownable.sol
new file mode 100644
index 000000000000..4ae686f466b1
--- /dev/null
+++ b/omgx_examples/sushi/contracts/Ownable.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+// Audit on 5-Jan-2021 by Keno and BoringCrypto
+
+// P1 - P3: OK
+pragma solidity 0.6.12;
+
+// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
+// Edited by BoringCrypto
+
+// T1 - T4: OK
+contract OwnableData {
+ // V1 - V5: OK
+ address public owner;
+ // V1 - V5: OK
+ address public pendingOwner;
+}
+
+// T1 - T4: OK
+contract Ownable is OwnableData {
+ // E1: OK
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ constructor () internal {
+ owner = msg.sender;
+ emit OwnershipTransferred(address(0), msg.sender);
+ }
+
+ // F1 - F9: OK
+ // C1 - C21: OK
+ function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {
+ if (direct) {
+ // Checks
+ require(newOwner != address(0) || renounce, "Ownable: zero address");
+
+ // Effects
+ emit OwnershipTransferred(owner, newOwner);
+ owner = newOwner;
+ } else {
+ // Effects
+ pendingOwner = newOwner;
+ }
+ }
+
+ // F1 - F9: OK
+ // C1 - C21: OK
+ function claimOwnership() public {
+ address _pendingOwner = pendingOwner;
+
+ // Checks
+ require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
+
+ // Effects
+ emit OwnershipTransferred(owner, _pendingOwner);
+ owner = _pendingOwner;
+ pendingOwner = address(0);
+ }
+
+ // M1 - M5: OK
+ // C1 - C21: OK
+ modifier onlyOwner() {
+ require(msg.sender == owner, "Ownable: caller is not the owner");
+ _;
+ }
+}
diff --git a/omgx_examples/sushi/contracts/SushiBar.sol b/omgx_examples/sushi/contracts/SushiBar.sol
new file mode 100644
index 000000000000..5115523135f1
--- /dev/null
+++ b/omgx_examples/sushi/contracts/SushiBar.sol
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "@openzeppelin/contracts/math/SafeMath.sol";
+
+// SushiBar is the coolest bar in town. You come in with some Sushi, and leave with more! The longer you stay, the more Sushi you get.
+//
+// This contract handles swapping to and from xSushi, SushiSwap's staking token.
+contract SushiBar is ERC20("SushiBar", "xSUSHI"){
+ using SafeMath for uint256;
+ IERC20 public sushi;
+
+ // Define the Sushi token contract
+ constructor(IERC20 _sushi) public {
+ sushi = _sushi;
+ }
+
+ // Enter the bar. Pay some SUSHIs. Earn some shares.
+ // Locks Sushi and mints xSushi
+ function enter(uint256 _amount) public {
+ // Gets the amount of Sushi locked in the contract
+ uint256 totalSushi = sushi.balanceOf(address(this));
+ // Gets the amount of xSushi in existence
+ uint256 totalShares = totalSupply();
+ // If no xSushi exists, mint it 1:1 to the amount put in
+ if (totalShares == 0 || totalSushi == 0) {
+ _mint(msg.sender, _amount);
+ }
+ // Calculate and mint the amount of xSushi the Sushi is worth. The ratio will change overtime, as xSushi is burned/minted and Sushi deposited + gained from fees / withdrawn.
+ else {
+ uint256 what = _amount.mul(totalShares).div(totalSushi);
+ _mint(msg.sender, what);
+ }
+ // Lock the Sushi in the contract
+ sushi.transferFrom(msg.sender, address(this), _amount);
+ }
+
+ // Leave the bar. Claim back your SUSHIs.
+ // Unlocks the staked + gained Sushi and burns xSushi
+ function leave(uint256 _share) public {
+ // Gets the amount of xSushi in existence
+ uint256 totalShares = totalSupply();
+ // Calculates the amount of Sushi the xSushi is worth
+ uint256 what = _share.mul(sushi.balanceOf(address(this))).div(totalShares);
+ _burn(msg.sender, _share);
+ sushi.transfer(msg.sender, what);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/SushiMaker.sol b/omgx_examples/sushi/contracts/SushiMaker.sol
new file mode 100644
index 000000000000..f2edbdacb5ee
--- /dev/null
+++ b/omgx_examples/sushi/contracts/SushiMaker.sol
@@ -0,0 +1,265 @@
+// SPDX-License-Identifier: MIT
+
+// P1 - P3: OK
+pragma solidity 0.6.12;
+import "./libraries/SafeMath.sol";
+import "./libraries/SafeERC20.sol";
+
+import "./uniswapv2/interfaces/IUniswapV2ERC20.sol";
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+
+import "./Ownable.sol";
+
+// SushiMaker is MasterChef's left hand and kinda a wizard. He can cook up Sushi from pretty much anything!
+// This contract handles "serving up" rewards for xSushi holders by trading tokens collected from fees for Sushi.
+
+// T1 - T4: OK
+contract SushiMaker is Ownable {
+ using SafeMath for uint256;
+ using SafeERC20 for IERC20;
+
+ // V1 - V5: OK
+ IUniswapV2Factory public immutable factory;
+ //0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac
+ // V1 - V5: OK
+ address public immutable bar;
+ //0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272
+ // V1 - V5: OK
+ address private immutable sushi;
+ //0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
+ // V1 - V5: OK
+ address private immutable weth;
+ //0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
+
+ // V1 - V5: OK
+ mapping(address => address) internal _bridges;
+
+ // E1: OK
+ event LogBridgeSet(address indexed token, address indexed bridge);
+ // E1: OK
+ event LogConvert(
+ address indexed server,
+ address indexed token0,
+ address indexed token1,
+ uint256 amount0,
+ uint256 amount1,
+ uint256 amountSUSHI
+ );
+
+ constructor(
+ address _factory,
+ address _bar,
+ address _sushi,
+ address _weth
+ ) public {
+ factory = IUniswapV2Factory(_factory);
+ bar = _bar;
+ sushi = _sushi;
+ weth = _weth;
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ function bridgeFor(address token) public view returns (address bridge) {
+ bridge = _bridges[token];
+ if (bridge == address(0)) {
+ bridge = weth;
+ }
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ function setBridge(address token, address bridge) external onlyOwner {
+ // Checks
+ require(
+ token != sushi && token != weth && token != bridge,
+ "SushiMaker: Invalid bridge"
+ );
+
+ // Effects
+ _bridges[token] = bridge;
+ emit LogBridgeSet(token, bridge);
+ }
+
+ // M1 - M5: OK
+ // C1 - C24: OK
+ // C6: It's not a fool proof solution, but it prevents flash loans, so here it's ok to use tx.origin
+ modifier onlyEOA() {
+ // Try to make flash-loan exploit harder to do by only allowing externally owned addresses.
+ // CHANGE_OMGX
+ //require(msg.sender == tx.origin, "SushiMaker: must use EOA");
+ _;
+ }
+
+ // F1 - F10: OK
+ // F3: _convert is separate to save gas by only checking the 'onlyEOA' modifier once in case of convertMultiple
+ // F6: There is an exploit to add lots of SUSHI to the bar, run convert, then remove the SUSHI again.
+ // As the size of the SushiBar has grown, this requires large amounts of funds and isn't super profitable anymore
+ // The onlyEOA modifier prevents this being done with a flash loan.
+ // C1 - C24: OK
+ function convert(address token0, address token1) external onlyEOA() {
+ _convert(token0, token1);
+ }
+
+ // F1 - F10: OK, see convert
+ // C1 - C24: OK
+ // C3: Loop is under control of the caller
+ function convertMultiple(
+ address[] calldata token0,
+ address[] calldata token1
+ ) external onlyEOA() {
+ // TODO: This can be optimized a fair bit, but this is safer and simpler for now
+ uint256 len = token0.length;
+ for (uint256 i = 0; i < len; i++) {
+ _convert(token0[i], token1[i]);
+ }
+ }
+
+ // F1 - F10: OK
+ // C1- C24: OK
+ function _convert(address token0, address token1) internal {
+ // Interactions
+ // S1 - S4: OK
+ IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(token0, token1));
+ require(address(pair) != address(0), "SushiMaker: Invalid pair");
+ // balanceOf: S1 - S4: OK
+ // transfer: X1 - X5: OK
+ IERC20(address(pair)).safeTransfer(
+ address(pair),
+ pair.balanceOf(address(this))
+ );
+ // X1 - X5: OK
+ (uint256 amount0, uint256 amount1) = pair.burn(address(this));
+ if (token0 != pair.token0()) {
+ (amount0, amount1) = (amount1, amount0);
+ }
+ emit LogConvert(
+ msg.sender,
+ token0,
+ token1,
+ amount0,
+ amount1,
+ _convertStep(token0, token1, amount0, amount1)
+ );
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ // All safeTransfer, _swap, _toSUSHI, _convertStep: X1 - X5: OK
+ function _convertStep(
+ address token0,
+ address token1,
+ uint256 amount0,
+ uint256 amount1
+ ) internal returns (uint256 sushiOut) {
+ // Interactions
+ if (token0 == token1) {
+ uint256 amount = amount0.add(amount1);
+ if (token0 == sushi) {
+ IERC20(sushi).safeTransfer(bar, amount);
+ sushiOut = amount;
+ } else if (token0 == weth) {
+ sushiOut = _toSUSHI(weth, amount);
+ } else {
+ address bridge = bridgeFor(token0);
+ amount = _swap(token0, bridge, amount, address(this));
+ sushiOut = _convertStep(bridge, bridge, amount, 0);
+ }
+ } else if (token0 == sushi) {
+ // eg. SUSHI - ETH
+ IERC20(sushi).safeTransfer(bar, amount0);
+ sushiOut = _toSUSHI(token1, amount1).add(amount0);
+ } else if (token1 == sushi) {
+ // eg. USDT - SUSHI
+ IERC20(sushi).safeTransfer(bar, amount1);
+ sushiOut = _toSUSHI(token0, amount0).add(amount1);
+ } else if (token0 == weth) {
+ // eg. ETH - USDC
+ sushiOut = _toSUSHI(
+ weth,
+ _swap(token1, weth, amount1, address(this)).add(amount0)
+ );
+ } else if (token1 == weth) {
+ // eg. USDT - ETH
+ sushiOut = _toSUSHI(
+ weth,
+ _swap(token0, weth, amount0, address(this)).add(amount1)
+ );
+ } else {
+ // eg. MIC - USDT
+ address bridge0 = bridgeFor(token0);
+ address bridge1 = bridgeFor(token1);
+ if (bridge0 == token1) {
+ // eg. MIC - USDT - and bridgeFor(MIC) = USDT
+ sushiOut = _convertStep(
+ bridge0,
+ token1,
+ _swap(token0, bridge0, amount0, address(this)),
+ amount1
+ );
+ } else if (bridge1 == token0) {
+ // eg. WBTC - DSD - and bridgeFor(DSD) = WBTC
+ sushiOut = _convertStep(
+ token0,
+ bridge1,
+ amount0,
+ _swap(token1, bridge1, amount1, address(this))
+ );
+ } else {
+ sushiOut = _convertStep(
+ bridge0,
+ bridge1, // eg. USDT - DSD - and bridgeFor(DSD) = WBTC
+ _swap(token0, bridge0, amount0, address(this)),
+ _swap(token1, bridge1, amount1, address(this))
+ );
+ }
+ }
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ // All safeTransfer, swap: X1 - X5: OK
+ function _swap(
+ address fromToken,
+ address toToken,
+ uint256 amountIn,
+ address to
+ ) internal returns (uint256 amountOut) {
+ // Checks
+ // X1 - X5: OK
+ IUniswapV2Pair pair =
+ IUniswapV2Pair(factory.getPair(fromToken, toToken));
+ require(address(pair) != address(0), "SushiMaker: Cannot convert");
+
+ // Interactions
+ // X1 - X5: OK
+ (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
+ uint256 amountInWithFee = amountIn.mul(997);
+ if (fromToken == pair.token0()) {
+ amountOut =
+ amountIn.mul(997).mul(reserve1) /
+ reserve0.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(0, amountOut, to, new bytes(0));
+ // TODO: Add maximum slippage?
+ } else {
+ amountOut =
+ amountIn.mul(997).mul(reserve0) /
+ reserve1.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(amountOut, 0, to, new bytes(0));
+ // TODO: Add maximum slippage?
+ }
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ function _toSUSHI(address token, uint256 amountIn)
+ internal
+ returns (uint256 amountOut)
+ {
+ // X1 - X5: OK
+ amountOut = _swap(token, sushi, amountIn, bar);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/SushiMakerKashi.sol b/omgx_examples/sushi/contracts/SushiMakerKashi.sol
new file mode 100644
index 000000000000..80912224ea3c
--- /dev/null
+++ b/omgx_examples/sushi/contracts/SushiMakerKashi.sol
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "./libraries/SafeMath.sol";
+import "./libraries/SafeERC20.sol";
+
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+
+import "./Ownable.sol";
+
+interface IBentoBoxWithdraw {
+ function withdraw(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) external returns (uint256 amountOut, uint256 shareOut);
+}
+
+interface IKashiWithdrawFee {
+ function asset() external view returns (address);
+ function balanceOf(address account) external view returns (uint256);
+ function withdrawFees() external;
+ function removeAsset(address to, uint256 fraction) external returns (uint256 share);
+}
+
+// SushiMakerKashi is MasterChef's left hand and kinda a wizard. He can cook up Sushi from pretty much anything!
+// This contract handles "serving up" rewards for xSushi holders by trading tokens collected from Kashi fees for Sushi.
+contract SushiMakerKashi is Ownable {
+ using SafeMath for uint256;
+ using SafeERC20 for IERC20;
+
+ IUniswapV2Factory private immutable factory;
+ //0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac
+ address private immutable bar;
+ //0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272
+ IBentoBoxWithdraw private immutable bentoBox;
+ //0xF5BCE5077908a1b7370B9ae04AdC565EBd643966
+ address private immutable sushi;
+ //0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
+ address private immutable weth;
+ //0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
+ bytes32 private immutable pairCodeHash;
+ //0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303
+
+ mapping(address => address) private _bridges;
+
+ event LogBridgeSet(address indexed token, address indexed bridge);
+ event LogConvert(
+ address indexed server,
+ address indexed token0,
+ uint256 amount0,
+ uint256 amountBENTO,
+ uint256 amountSUSHI
+ );
+
+ constructor(
+ IUniswapV2Factory _factory,
+ address _bar,
+ IBentoBoxWithdraw _bentoBox,
+ address _sushi,
+ address _weth,
+ bytes32 _pairCodeHash
+ ) public {
+ factory = _factory;
+ bar = _bar;
+ bentoBox = _bentoBox;
+ sushi = _sushi;
+ weth = _weth;
+ pairCodeHash = _pairCodeHash;
+ }
+
+ function setBridge(address token, address bridge) external onlyOwner {
+ // Checks
+ require(
+ token != sushi && token != weth && token != bridge,
+ "Maker: Invalid bridge"
+ );
+ // Effects
+ _bridges[token] = bridge;
+ emit LogBridgeSet(token, bridge);
+ }
+
+ modifier onlyEOA() {
+ // Try to make flash-loan exploit harder to do by only allowing externally-owned addresses.
+ // CHANGE_OMGX
+ //require(msg.sender == tx.origin, "Maker: Must use EOA");
+ _;
+ }
+
+ function convert(IKashiWithdrawFee kashiPair) external onlyEOA {
+ _convert(kashiPair);
+ }
+
+ function convertMultiple(IKashiWithdrawFee[] calldata kashiPair) external onlyEOA {
+ for (uint256 i = 0; i < kashiPair.length; i++) {
+ _convert(kashiPair[i]);
+ }
+ }
+
+ function _convert(IKashiWithdrawFee kashiPair) private {
+ // update Kashi fees for this Maker contract (`feeTo`)
+ kashiPair.withdrawFees();
+
+ // convert updated Kashi balance to Bento shares
+ uint256 bentoShares = kashiPair.removeAsset(address(this), kashiPair.balanceOf(address(this)));
+
+ // convert Bento shares to underlying Kashi asset (`token0`) balance (`amount0`) for Maker
+ address token0 = kashiPair.asset();
+ (uint256 amount0, ) = bentoBox.withdraw(IERC20(token0), address(this), address(this), 0, bentoShares);
+
+ emit LogConvert(
+ msg.sender,
+ token0,
+ amount0,
+ bentoShares,
+ _convertStep(token0, amount0)
+ );
+ }
+
+ function _convertStep(address token0, uint256 amount0) private returns (uint256 sushiOut) {
+ if (token0 == sushi) {
+ IERC20(token0).safeTransfer(bar, amount0);
+ sushiOut = amount0;
+ } else if (token0 == weth) {
+ sushiOut = _swap(token0, sushi, amount0, bar);
+ } else {
+ address bridge = _bridges[token0];
+ if (bridge == address(0)) {
+ bridge = weth;
+ }
+ uint256 amountOut = _swap(token0, bridge, amount0, address(this));
+ sushiOut = _convertStep(bridge, amountOut);
+ }
+ }
+
+ function _swap(
+ address fromToken,
+ address toToken,
+ uint256 amountIn,
+ address to
+ ) private returns (uint256 amountOut) {
+ (address token0, address token1) = fromToken < toToken ? (fromToken, toToken) : (toToken, fromToken);
+ IUniswapV2Pair pair =
+ IUniswapV2Pair(
+ uint256(
+ keccak256(abi.encodePacked(hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), pairCodeHash))
+ )
+ );
+
+ (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
+ uint256 amountInWithFee = amountIn.mul(997);
+
+ if (toToken > fromToken) {
+ amountOut =
+ amountInWithFee.mul(reserve1) /
+ reserve0.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(0, amountOut, to, "");
+ } else {
+ amountOut =
+ amountInWithFee.mul(reserve0) /
+ reserve1.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(amountOut, 0, to, "");
+ }
+ }
+}
diff --git a/omgx_examples/sushi/contracts/SushiRoll.sol b/omgx_examples/sushi/contracts/SushiRoll.sol
new file mode 100644
index 000000000000..7becfb69d697
--- /dev/null
+++ b/omgx_examples/sushi/contracts/SushiRoll.sol
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Router01.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+import "./uniswapv2/libraries/UniswapV2Library.sol";
+
+// SushiRoll helps your migrate your existing Uniswap LP tokens to SushiSwap LP ones
+contract SushiRoll {
+ using SafeERC20 for IERC20;
+
+ IUniswapV2Router01 public oldRouter;
+ IUniswapV2Router01 public router;
+
+ constructor(IUniswapV2Router01 _oldRouter, IUniswapV2Router01 _router) public {
+ oldRouter = _oldRouter;
+ router = _router;
+ }
+
+ function migrateWithPermit(
+ address tokenA,
+ address tokenB,
+ uint256 liquidity,
+ uint256 amountAMin,
+ uint256 amountBMin,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public {
+ IUniswapV2Pair pair = IUniswapV2Pair(pairForOldRouter(tokenA, tokenB));
+ pair.permit(msg.sender, address(this), liquidity, deadline, v, r, s);
+
+ migrate(tokenA, tokenB, liquidity, amountAMin, amountBMin, deadline);
+ }
+
+ // msg.sender should have approved 'liquidity' amount of LP token of 'tokenA' and 'tokenB'
+ function migrate(
+ address tokenA,
+ address tokenB,
+ uint256 liquidity,
+ uint256 amountAMin,
+ uint256 amountBMin,
+ uint256 deadline
+ ) public {
+ require(deadline >= block.timestamp, 'SushiSwap: EXPIRED');
+
+ // Remove liquidity from the old router with permit
+ (uint256 amountA, uint256 amountB) = removeLiquidity(
+ tokenA,
+ tokenB,
+ liquidity,
+ amountAMin,
+ amountBMin,
+ deadline
+ );
+
+ // Add liquidity to the new router
+ (uint256 pooledAmountA, uint256 pooledAmountB) = addLiquidity(tokenA, tokenB, amountA, amountB);
+
+ // Send remaining tokens to msg.sender
+ if (amountA > pooledAmountA) {
+ IERC20(tokenA).safeTransfer(msg.sender, amountA - pooledAmountA);
+ }
+ if (amountB > pooledAmountB) {
+ IERC20(tokenB).safeTransfer(msg.sender, amountB - pooledAmountB);
+ }
+ }
+
+ function removeLiquidity(
+ address tokenA,
+ address tokenB,
+ uint256 liquidity,
+ uint256 amountAMin,
+ uint256 amountBMin,
+ uint256 deadline
+ ) internal returns (uint256 amountA, uint256 amountB) {
+ IUniswapV2Pair pair = IUniswapV2Pair(pairForOldRouter(tokenA, tokenB));
+ pair.transferFrom(msg.sender, address(pair), liquidity);
+ (uint256 amount0, uint256 amount1) = pair.burn(address(this));
+ (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
+ (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
+ require(amountA >= amountAMin, 'SushiRoll: INSUFFICIENT_A_AMOUNT');
+ require(amountB >= amountBMin, 'SushiRoll: INSUFFICIENT_B_AMOUNT');
+ }
+
+ // calculates the CREATE2 address for a pair without making any external calls
+ function pairForOldRouter(address tokenA, address tokenB) internal view returns (address pair) {
+ (address token0, address token1) = UniswapV2Library.sortTokens(tokenA, tokenB);
+ pair = address(uint(keccak256(abi.encodePacked(
+ hex'ff',
+ oldRouter.factory(),
+ keccak256(abi.encodePacked(token0, token1)),
+ hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
+ ))));
+ }
+
+ function addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint256 amountADesired,
+ uint256 amountBDesired
+ ) internal returns (uint amountA, uint amountB) {
+ (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired);
+ address pair = UniswapV2Library.pairFor(router.factory(), tokenA, tokenB);
+ IERC20(tokenA).safeTransfer(pair, amountA);
+ IERC20(tokenB).safeTransfer(pair, amountB);
+ IUniswapV2Pair(pair).mint(msg.sender);
+ }
+
+ function _addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint256 amountADesired,
+ uint256 amountBDesired
+ ) internal returns (uint256 amountA, uint256 amountB) {
+ // create the pair if it doesn't exist yet
+ IUniswapV2Factory factory = IUniswapV2Factory(router.factory());
+ if (factory.getPair(tokenA, tokenB) == address(0)) {
+ factory.createPair(tokenA, tokenB);
+ }
+ (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(address(factory), tokenA, tokenB);
+ if (reserveA == 0 && reserveB == 0) {
+ (amountA, amountB) = (amountADesired, amountBDesired);
+ } else {
+ uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
+ if (amountBOptimal <= amountBDesired) {
+ (amountA, amountB) = (amountADesired, amountBOptimal);
+ } else {
+ uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
+ assert(amountAOptimal <= amountADesired);
+ (amountA, amountB) = (amountAOptimal, amountBDesired);
+ }
+ }
+ }
+}
diff --git a/omgx_examples/sushi/contracts/SushiToken.sol b/omgx_examples/sushi/contracts/SushiToken.sol
new file mode 100644
index 000000000000..c57abe96260b
--- /dev/null
+++ b/omgx_examples/sushi/contracts/SushiToken.sol
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+
+
+// SushiToken with Governance.
+contract SushiToken is ERC20("SushiToken", "SUSHI"), Ownable {
+ /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef).
+ function mint(address _to, uint256 _amount) public onlyOwner {
+ _mint(_to, _amount);
+ _moveDelegates(address(0), _delegates[_to], _amount);
+ }
+
+ // Copied and modified from YAM code:
+ // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
+ // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
+ // Which is copied and modified from COMPOUND:
+ // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol
+
+ // @notice A record of each accounts delegate
+ mapping (address => address) internal _delegates;
+
+ /// @notice A checkpoint for marking number of votes from a given block
+ struct Checkpoint {
+ uint32 fromBlock;
+ uint256 votes;
+ }
+
+ /// @notice A record of votes checkpoints for each account, by index
+ mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
+
+ /// @notice The number of checkpoints for each account
+ mapping (address => uint32) public numCheckpoints;
+
+ /// @notice The EIP-712 typehash for the contract's domain
+ bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
+
+ /// @notice The EIP-712 typehash for the delegation struct used by the contract
+ bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
+
+ /// @notice A record of states for signing / validating signatures
+ mapping (address => uint) public nonces;
+
+ /// @notice An event thats emitted when an account changes its delegate
+ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
+
+ /// @notice An event thats emitted when a delegate account's vote balance changes
+ event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
+
+ /**
+ * @notice Delegate votes from `msg.sender` to `delegatee`
+ * @param delegator The address to get delegatee for
+ */
+ function delegates(address delegator)
+ external
+ view
+ returns (address)
+ {
+ return _delegates[delegator];
+ }
+
+ /**
+ * @notice Delegate votes from `msg.sender` to `delegatee`
+ * @param delegatee The address to delegate votes to
+ */
+ function delegate(address delegatee) external {
+ return _delegate(msg.sender, delegatee);
+ }
+
+ /**
+ * @notice Delegates votes from signatory to `delegatee`
+ * @param delegatee The address to delegate votes to
+ * @param nonce The contract state required to match the signature
+ * @param expiry The time at which to expire the signature
+ * @param v The recovery byte of the signature
+ * @param r Half of the ECDSA signature pair
+ * @param s Half of the ECDSA signature pair
+ */
+ function delegateBySig(
+ address delegatee,
+ uint nonce,
+ uint expiry,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ )
+ external
+ {
+ bytes32 domainSeparator = keccak256(
+ abi.encode(
+ DOMAIN_TYPEHASH,
+ keccak256(bytes(name())),
+ getChainId(),
+ address(this)
+ )
+ );
+
+ bytes32 structHash = keccak256(
+ abi.encode(
+ DELEGATION_TYPEHASH,
+ delegatee,
+ nonce,
+ expiry
+ )
+ );
+
+ bytes32 digest = keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ domainSeparator,
+ structHash
+ )
+ );
+
+ address signatory = ecrecover(digest, v, r, s);
+ require(signatory != address(0), "SUSHI::delegateBySig: invalid signature");
+ require(nonce == nonces[signatory]++, "SUSHI::delegateBySig: invalid nonce");
+ require(block.timestamp <= expiry, "SUSHI::delegateBySig: signature expired");
+ return _delegate(signatory, delegatee);
+ }
+
+ /**
+ * @notice Gets the current votes balance for `account`
+ * @param account The address to get votes balance
+ * @return The number of current votes for `account`
+ */
+ function getCurrentVotes(address account)
+ external
+ view
+ returns (uint256)
+ {
+ uint32 nCheckpoints = numCheckpoints[account];
+ return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
+ }
+
+ /**
+ * @notice Determine the prior number of votes for an account as of a block number
+ * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
+ * @param account The address of the account to check
+ * @param blockNumber The block number to get the vote balance at
+ * @return The number of votes the account had as of the given block
+ */
+ function getPriorVotes(address account, uint blockNumber)
+ external
+ view
+ returns (uint256)
+ {
+ require(blockNumber < block.number, "SUSHI::getPriorVotes: not yet determined");
+
+ uint32 nCheckpoints = numCheckpoints[account];
+ if (nCheckpoints == 0) {
+ return 0;
+ }
+
+ // First check most recent balance
+ if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
+ return checkpoints[account][nCheckpoints - 1].votes;
+ }
+
+ // Next check implicit zero balance
+ if (checkpoints[account][0].fromBlock > blockNumber) {
+ return 0;
+ }
+
+ uint32 lower = 0;
+ uint32 upper = nCheckpoints - 1;
+ while (upper > lower) {
+ uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
+ Checkpoint memory cp = checkpoints[account][center];
+ if (cp.fromBlock == blockNumber) {
+ return cp.votes;
+ } else if (cp.fromBlock < blockNumber) {
+ lower = center;
+ } else {
+ upper = center - 1;
+ }
+ }
+ return checkpoints[account][lower].votes;
+ }
+
+ function _delegate(address delegator, address delegatee)
+ internal
+ {
+ address currentDelegate = _delegates[delegator];
+ uint256 delegatorBalance = balanceOf(delegator); // balance of underlying SUSHIs (not scaled);
+ _delegates[delegator] = delegatee;
+
+ emit DelegateChanged(delegator, currentDelegate, delegatee);
+
+ _moveDelegates(currentDelegate, delegatee, delegatorBalance);
+ }
+
+ function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
+ if (srcRep != dstRep && amount > 0) {
+ if (srcRep != address(0)) {
+ // decrease old representative
+ uint32 srcRepNum = numCheckpoints[srcRep];
+ uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
+ uint256 srcRepNew = srcRepOld.sub(amount);
+ _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
+ }
+
+ if (dstRep != address(0)) {
+ // increase new representative
+ uint32 dstRepNum = numCheckpoints[dstRep];
+ uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
+ uint256 dstRepNew = dstRepOld.add(amount);
+ _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
+ }
+ }
+ }
+
+ function _writeCheckpoint(
+ address delegatee,
+ uint32 nCheckpoints,
+ uint256 oldVotes,
+ uint256 newVotes
+ )
+ internal
+ {
+ uint32 blockNumber = safe32(block.number, "SUSHI::_writeCheckpoint: block number exceeds 32 bits");
+
+ if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
+ checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
+ } else {
+ checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
+ numCheckpoints[delegatee] = nCheckpoints + 1;
+ }
+
+ emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
+ }
+
+ function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
+ require(n < 2**32, errorMessage);
+ return uint32(n);
+ }
+
+ function getChainId() internal pure returns (uint) {
+ // CHANGE_OMGX
+ uint256 chainId = 420;
+ return chainId;
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/bentobox/BentoBoxV1.sol b/omgx_examples/sushi/contracts/bentobox/BentoBoxV1.sol
new file mode 100644
index 000000000000..a0c9e194eef0
--- /dev/null
+++ b/omgx_examples/sushi/contracts/bentobox/BentoBoxV1.sol
@@ -0,0 +1,1153 @@
+// SPDX-License-Identifier: UNLICENSED
+// The BentoBox
+
+// ▄▄▄▄· â–„â–„â–„ . â– â–„ â–„â–„â–„â–„â–„ ▄▄▄▄· â–▄• â–„
+// â–â–ˆ ▀█▪▀▄.▀·█▌â–█•██ â–ª â–â–ˆ ▀█▪▪ █▌█▌▪
+// â–█▀▀█▄â–▀▀▪▄â–â–ˆâ–â–â–Œ â–â–ˆ.â–ª ▄█▀▄ â–█▀▀█▄ ▄█▀▄ ·██·
+// ██▄▪â–â–ˆâ–█▄▄▌██â–█▌ â–█▌·â–█▌.â–▌██▄▪â–â–ˆâ–█▌.â–▌▪â–█·█▌
+// ·▀▀▀▀ ▀▀▀ ▀▀ █▪ ▀▀▀ ▀█▄▀▪·▀▀▀▀ ▀█▄▀▪•▀▀ ▀▀
+
+// This contract stores funds, handles their transfers, supports flash loans and strategies.
+
+// Copyright (c) 2021 BoringCrypto - All rights reserved
+// Twitter: @Boring_Crypto
+
+// Special thanks to Keno for all his hard work and support
+
+// Version 22-Mar-2021
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+// solhint-disable avoid-low-level-calls
+// solhint-disable not-rely-on-time
+// solhint-disable no-inline-assembly
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IERC20 {
+ function totalSupply() external view returns (uint256);
+
+ function balanceOf(address account) external view returns (uint256);
+
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice EIP 2612
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+}
+
+// File contracts/interfaces/IFlashLoan.sol
+// License-Identifier: MIT
+
+interface IFlashBorrower {
+ /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.
+ /// @param sender The address of the invoker of this flashloan.
+ /// @param token The address of the token that is loaned.
+ /// @param amount of the `token` that is loaned.
+ /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.
+ /// @param data Additional data that was passed to the flashloan function.
+ function onFlashLoan(
+ address sender,
+ IERC20 token,
+ uint256 amount,
+ uint256 fee,
+ bytes calldata data
+ ) external;
+}
+
+interface IBatchFlashBorrower {
+ /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.
+ /// @param sender The address of the invoker of this flashloan.
+ /// @param tokens Array of addresses for ERC-20 tokens that is loaned.
+ /// @param amounts A one-to-one map to `tokens` that is loaned.
+ /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.
+ /// @param data Additional data that was passed to the flashloan function.
+ function onBatchFlashLoan(
+ address sender,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ uint256[] calldata fees,
+ bytes calldata data
+ ) external;
+}
+
+// File contracts/interfaces/IWETH.sol
+// License-Identifier: MIT
+
+interface IWETH {
+ function deposit() external payable;
+
+ function withdraw(uint256) external;
+}
+
+// File contracts/interfaces/IStrategy.sol
+// License-Identifier: MIT
+
+interface IStrategy {
+ /// @notice Send the assets to the Strategy and call skim to invest them.
+ /// @param amount The amount of tokens to invest.
+ function skim(uint256 amount) external;
+
+ /// @notice Harvest any profits made converted to the asset and pass them to the caller.
+ /// @param balance The amount of tokens the caller thinks it has invested.
+ /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.
+ /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.
+ function harvest(uint256 balance, address sender) external returns (int256 amountAdded);
+
+ /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.
+ /// @dev The `actualAmount` should be very close to the amount.
+ /// The difference should NOT be used to report a loss. That's what harvest is for.
+ /// @param amount The requested amount the caller wants to withdraw.
+ /// @return actualAmount The real amount that is withdrawn.
+ function withdraw(uint256 amount) external returns (uint256 actualAmount);
+
+ /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.
+ /// @param balance The amount of tokens the caller thinks it has invested.
+ /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.
+ function exit(uint256 balance) external returns (int256 amountAdded);
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+library BoringERC20 {
+ bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
+ bytes4 private constant SIG_NAME = 0x06fdde03; // name()
+ bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
+ bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
+ bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)
+
+ /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
+ /// Reverts on a failed transfer.
+ /// @param token The address of the ERC-20 token.
+ /// @param to Transfer tokens to.
+ /// @param amount The token amount.
+ function safeTransfer(
+ IERC20 token,
+ address to,
+ uint256 amount
+ ) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
+ }
+
+ /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
+ /// Reverts on a failed transfer.
+ /// @param token The address of the ERC-20 token.
+ /// @param from Transfer tokens from.
+ /// @param to Transfer tokens to.
+ /// @param amount The token amount.
+ function safeTransferFrom(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 amount
+ ) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0
+// License-Identifier: MIT
+
+/// @notice A library for performing overflow-/underflow-safe math,
+/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).
+library BoringMath {
+ function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+
+ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow");
+ }
+
+ function to128(uint256 a) internal pure returns (uint128 c) {
+ require(a <= uint128(-1), "BoringMath: uint128 Overflow");
+ c = uint128(a);
+ }
+
+ function to64(uint256 a) internal pure returns (uint64 c) {
+ require(a <= uint64(-1), "BoringMath: uint64 Overflow");
+ c = uint64(a);
+ }
+
+ function to32(uint256 a) internal pure returns (uint32 c) {
+ require(a <= uint32(-1), "BoringMath: uint32 Overflow");
+ c = uint32(a);
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.
+library BoringMath128 {
+ function add(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.
+library BoringMath64 {
+ function add(uint64 a, uint64 b) internal pure returns (uint64 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.
+library BoringMath32 {
+ function add(uint32 a, uint32 b) internal pure returns (uint32 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0
+// License-Identifier: MIT
+
+struct Rebase {
+ uint128 elastic;
+ uint128 base;
+}
+
+/// @notice A rebasing library using overflow-/underflow-safe math.
+library RebaseLibrary {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+
+ /// @notice Calculates the base value in relationship to `elastic` and `total`.
+ function toBase(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (uint256 base) {
+ if (total.elastic == 0) {
+ base = elastic;
+ } else {
+ base = elastic.mul(total.base) / total.elastic;
+ if (roundUp && base.mul(total.elastic) / total.base < elastic) {
+ base = base.add(1);
+ }
+ }
+ }
+
+ /// @notice Calculates the elastic value in relationship to `base` and `total`.
+ function toElastic(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (uint256 elastic) {
+ if (total.base == 0) {
+ elastic = base;
+ } else {
+ elastic = base.mul(total.elastic) / total.base;
+ if (roundUp && elastic.mul(total.base) / total.elastic < base) {
+ elastic = elastic.add(1);
+ }
+ }
+ }
+
+ /// @notice Add `elastic` to `total` and doubles `total.base`.
+ /// @return (Rebase) The new total.
+ /// @return base in relationship to `elastic`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 base) {
+ base = toBase(total, elastic, roundUp);
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return (total, base);
+ }
+
+ /// @notice Sub `base` from `total` and update `total.elastic`.
+ /// @return (Rebase) The new total.
+ /// @return elastic in relationship to `base`.
+ function sub(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 elastic) {
+ elastic = toElastic(total, base, roundUp);
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return (total, elastic);
+ }
+
+ /// @notice Add `elastic` and `base` to `total`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return total;
+ }
+
+ /// @notice Subtract `elastic` and `base` to `total`.
+ function sub(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return total;
+ }
+
+ /// @notice Add `elastic` to `total` and update storage.
+ /// @return newElastic Returns updated `elastic`.
+ function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {
+ newElastic = total.elastic = total.elastic.add(elastic.to128());
+ }
+
+ /// @notice Subtract `elastic` from `total` and update storage.
+ /// @return newElastic Returns updated `elastic`.
+ function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {
+ newElastic = total.elastic = total.elastic.sub(elastic.to128());
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0
+// License-Identifier: MIT
+
+// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
+// Edited by BoringCrypto
+
+contract BoringOwnableData {
+ address public owner;
+ address public pendingOwner;
+}
+
+contract BoringOwnable is BoringOwnableData {
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ /// @notice `owner` defaults to msg.sender on construction.
+ constructor() public {
+ owner = msg.sender;
+ emit OwnershipTransferred(address(0), msg.sender);
+ }
+
+ /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
+ /// Can only be invoked by the current `owner`.
+ /// @param newOwner Address of the new owner.
+ /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
+ /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
+ function transferOwnership(
+ address newOwner,
+ bool direct,
+ bool renounce
+ ) public onlyOwner {
+ if (direct) {
+ // Checks
+ require(newOwner != address(0) || renounce, "Ownable: zero address");
+
+ // Effects
+ emit OwnershipTransferred(owner, newOwner);
+ owner = newOwner;
+ pendingOwner = address(0);
+ } else {
+ // Effects
+ pendingOwner = newOwner;
+ }
+ }
+
+ /// @notice Needs to be called by `pendingOwner` to claim ownership.
+ function claimOwnership() public {
+ address _pendingOwner = pendingOwner;
+
+ // Checks
+ require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
+
+ // Effects
+ emit OwnershipTransferred(owner, _pendingOwner);
+ owner = _pendingOwner;
+ pendingOwner = address(0);
+ }
+
+ /// @notice Only allows the `owner` to execute the function.
+ modifier onlyOwner() {
+ require(msg.sender == owner, "Ownable: caller is not the owner");
+ _;
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IMasterContract {
+ /// @notice Init function that gets called from `BoringFactory.deploy`.
+ /// Also kown as the constructor for cloned contracts.
+ /// Any ETH send to `BoringFactory.deploy` ends up here.
+ /// @param data Can be abi encoded arguments or anything else.
+ function init(bytes calldata data) external payable;
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0
+// License-Identifier: MIT
+
+contract BoringFactory {
+ event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);
+
+ /// @notice Mapping from clone contracts to their masterContract.
+ mapping(address => address) public masterContractOf;
+
+ /// @notice Deploys a given master Contract as a clone.
+ /// Any ETH transferred with this call is forwarded to the new clone.
+ /// Emits `LogDeploy`.
+ /// @param masterContract The address of the contract to clone.
+ /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.
+ /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.
+ /// @return cloneAddress Address of the created clone contract.
+ function deploy(
+ address masterContract,
+ bytes calldata data,
+ bool useCreate2
+ ) public payable returns (address cloneAddress) {
+ require(masterContract != address(0), "BoringFactory: No masterContract");
+ bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address
+
+ if (useCreate2) {
+ // each masterContract has different code already. So clones are distinguished by their data only.
+ bytes32 salt = keccak256(data);
+
+ // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/
+ assembly {
+ let clone := mload(0x40)
+ mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
+ mstore(add(clone, 0x14), targetBytes)
+ mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
+ cloneAddress := create2(0, clone, 0x37, salt)
+ }
+ } else {
+ assembly {
+ let clone := mload(0x40)
+ mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
+ mstore(add(clone, 0x14), targetBytes)
+ mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
+ cloneAddress := create(0, clone, 0x37)
+ }
+ }
+ masterContractOf[cloneAddress] = masterContract;
+
+ IMasterContract(cloneAddress).init{value: msg.value}(data);
+
+ emit LogDeploy(masterContract, data, cloneAddress);
+ }
+}
+
+// File contracts/MasterContractManager.sol
+// License-Identifier: UNLICENSED
+
+contract MasterContractManager is BoringOwnable, BoringFactory {
+ event LogWhiteListMasterContract(address indexed masterContract, bool approved);
+ event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);
+ event LogRegisterProtocol(address indexed protocol);
+
+ /// @notice masterContract to user to approval state
+ mapping(address => mapping(address => bool)) public masterContractApproved;
+ /// @notice masterContract to whitelisted state for approval without signed message
+ mapping(address => bool) public whitelistedMasterContracts;
+ /// @notice user nonces for masterContract approvals
+ mapping(address => uint256) public nonces;
+
+ bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
+ // See https://eips.ethereum.org/EIPS/eip-191
+ string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";
+ bytes32 private constant APPROVAL_SIGNATURE_HASH =
+ keccak256("SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)");
+
+ // solhint-disable-next-line var-name-mixedcase
+ bytes32 private immutable _DOMAIN_SEPARATOR;
+ // solhint-disable-next-line var-name-mixedcase
+ uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;
+
+ constructor() public {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);
+ }
+
+ function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
+ return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256("BentoBox V1"), chainId, address(this)));
+ }
+
+ // solhint-disable-next-line func-name-mixedcase
+ function DOMAIN_SEPARATOR() public view returns (bytes32) {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
+ }
+
+ /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.
+ function registerProtocol() public {
+ masterContractOf[msg.sender] = msg.sender;
+ emit LogRegisterProtocol(msg.sender);
+ }
+
+ /// @notice Enables or disables a contract for approval without signed message.
+ function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {
+ // Checks
+ require(masterContract != address(0), "MasterCMgr: Cannot approve 0");
+
+ // Effects
+ whitelistedMasterContracts[masterContract] = approved;
+ emit LogWhiteListMasterContract(masterContract, approved);
+ }
+
+ /// @notice Approves or revokes a `masterContract` access to `user` funds.
+ /// @param user The address of the user that approves or revokes access.
+ /// @param masterContract The address who gains or loses access.
+ /// @param approved If True approves access. If False revokes access.
+ /// @param v Part of the signature. (See EIP-191)
+ /// @param r Part of the signature. (See EIP-191)
+ /// @param s Part of the signature. (See EIP-191)
+ // F4 - Check behaviour for all function arguments when wrong or extreme
+ // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.
+ // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails
+ function setMasterContractApproval(
+ address user,
+ address masterContract,
+ bool approved,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public {
+ // Checks
+ require(masterContract != address(0), "MasterCMgr: masterC not set"); // Important for security
+
+ // If no signature is provided, the fallback is executed
+ if (r == 0 && s == 0 && v == 0) {
+ require(user == msg.sender, "MasterCMgr: user not sender");
+ require(masterContractOf[user] == address(0), "MasterCMgr: user is clone");
+ require(whitelistedMasterContracts[masterContract], "MasterCMgr: not whitelisted");
+ } else {
+ // Important for security - any address without masterContract has address(0) as masterContract
+ // So approving address(0) would approve every address, leading to full loss of funds
+ // Also, ecrecover returns address(0) on failure. So we check this:
+ require(user != address(0), "MasterCMgr: User cannot be 0");
+
+ // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)
+ // C10: nonce + chainId are used to prevent replays
+ // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)
+ // C11: signature is EIP-712 compliant
+ // C12 - abi.encodePacked can't contain variable length user input (SWC-133)
+ // C12: abi.encodePacked has fixed length parameters
+ bytes32 digest =
+ keccak256(
+ abi.encodePacked(
+ EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,
+ DOMAIN_SEPARATOR(),
+ keccak256(
+ abi.encode(
+ APPROVAL_SIGNATURE_HASH,
+ approved
+ ? keccak256("Give FULL access to funds in (and approved to) BentoBox?")
+ : keccak256("Revoke access to BentoBox?"),
+ user,
+ masterContract,
+ approved,
+ nonces[user]++
+ )
+ )
+ )
+ );
+ address recoveredAddress = ecrecover(digest, v, r, s);
+ require(recoveredAddress == user, "MasterCMgr: Invalid Signature");
+ }
+
+ // Effects
+ masterContractApproved[masterContract][user] = approved;
+ emit LogSetMasterContractApproval(masterContract, user, approved);
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0
+// License-Identifier: MIT
+
+contract BaseBoringBatchable {
+ /// @dev Helper function to extract a useful revert message from a failed call.
+ /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.
+ function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
+ // If the _res length is less than 68, then the transaction failed silently (without a revert message)
+ if (_returnData.length < 68) return "Transaction reverted silently";
+
+ assembly {
+ // Slice the sighash.
+ _returnData := add(_returnData, 0x04)
+ }
+ return abi.decode(_returnData, (string)); // All that remains is the revert string
+ }
+
+ /// @notice Allows batched call to self (this contract).
+ /// @param calls An array of inputs for each call.
+ /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.
+ /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.
+ /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.
+ // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
+ // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
+ // C3: The length of the loop is fully under user control, so can't be exploited
+ // C7: Delegatecall is only used on the same contract, so it's safe
+ function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {
+ successes = new bool[](calls.length);
+ results = new bytes[](calls.length);
+ for (uint256 i = 0; i < calls.length; i++) {
+ (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
+ require(success || !revertOnFail, _getRevertMsg(result));
+ successes[i] = success;
+ results[i] = result;
+ }
+ }
+}
+
+contract BoringBatchable is BaseBoringBatchable {
+ /// @notice Call wrapper that performs `ERC20.permit` on `token`.
+ /// Lookup `IERC20.permit`.
+ // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
+ // if part of a batch this could be used to grief once as the second call would not need the permit
+ function permitToken(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public {
+ token.permit(from, to, amount, deadline, v, r, s);
+ }
+}
+
+// File contracts/BentoBox.sol
+// License-Identifier: UNLICENSED
+
+/// @title BentoBox
+/// @author BoringCrypto, Keno
+/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.
+/// Yield from this will go to the token depositors.
+/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.
+/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.
+contract BentoBoxV1 is MasterContractManager, BoringBatchable {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+ using RebaseLibrary for Rebase;
+
+ // ************** //
+ // *** EVENTS *** //
+ // ************** //
+
+ event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);
+
+ event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);
+
+ event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);
+ event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);
+ event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);
+ event LogStrategyInvest(IERC20 indexed token, uint256 amount);
+ event LogStrategyDivest(IERC20 indexed token, uint256 amount);
+ event LogStrategyProfit(IERC20 indexed token, uint256 amount);
+ event LogStrategyLoss(IERC20 indexed token, uint256 amount);
+
+ // *************** //
+ // *** STRUCTS *** //
+ // *************** //
+
+ struct StrategyData {
+ uint64 strategyStartDate;
+ uint64 targetPercentage;
+ uint128 balance; // the balance of the strategy that BentoBox thinks is in there
+ }
+
+ // ******************************** //
+ // *** CONSTANTS AND IMMUTABLES *** //
+ // ******************************** //
+
+ // V2 - Can they be private?
+ // V2: Private to save gas, to verify it's correct, check the constructor arguments
+ IERC20 private immutable wethToken;
+
+ IERC20 private constant USE_ETHEREUM = IERC20(0);
+ uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%
+ uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;
+ uint256 private constant STRATEGY_DELAY = 2 weeks;
+ uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%
+ uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off
+
+ // ***************** //
+ // *** VARIABLES *** //
+ // ***************** //
+
+ // Balance per token per address/contract in shares
+ mapping(IERC20 => mapping(address => uint256)) public balanceOf;
+
+ // Rebase from amount to share
+ mapping(IERC20 => Rebase) public totals;
+
+ mapping(IERC20 => IStrategy) public strategy;
+ mapping(IERC20 => IStrategy) public pendingStrategy;
+ mapping(IERC20 => StrategyData) public strategyData;
+
+ // ******************* //
+ // *** CONSTRUCTOR *** //
+ // ******************* //
+
+ constructor(IERC20 wethToken_) public {
+ wethToken = wethToken_;
+ }
+
+ // ***************** //
+ // *** MODIFIERS *** //
+ // ***************** //
+
+ /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.
+ /// If 'from' is msg.sender, it's allowed.
+ /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances
+ /// can be taken by anyone.
+ /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.
+ /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.
+ modifier allowed(address from) {
+ if (from != msg.sender && from != address(this)) {
+ // From is sender or you are skimming
+ address masterContract = masterContractOf[msg.sender];
+ require(masterContract != address(0), "BentoBox: no masterContract");
+ require(masterContractApproved[masterContract][from], "BentoBox: Transfer not approved");
+ }
+ _;
+ }
+
+ // ************************** //
+ // *** INTERNAL FUNCTIONS *** //
+ // ************************** //
+
+ /// @dev Returns the total balance of `token` this contracts holds,
+ /// plus the total amount this contract thinks the strategy holds.
+ function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {
+ amount = token.balanceOf(address(this)).add(strategyData[token].balance);
+ }
+
+ // ************************ //
+ // *** PUBLIC FUNCTIONS *** //
+ // ************************ //
+
+ /// @dev Helper function to represent an `amount` of `token` in shares.
+ /// @param token The ERC-20 token.
+ /// @param amount The `token` amount.
+ /// @param roundUp If the result `share` should be rounded up.
+ /// @return share The token amount represented in shares.
+ function toShare(
+ IERC20 token,
+ uint256 amount,
+ bool roundUp
+ ) external view returns (uint256 share) {
+ share = totals[token].toBase(amount, roundUp);
+ }
+
+ /// @dev Helper function represent shares back into the `token` amount.
+ /// @param token The ERC-20 token.
+ /// @param share The amount of shares.
+ /// @param roundUp If the result should be rounded up.
+ /// @return amount The share amount back into native representation.
+ function toAmount(
+ IERC20 token,
+ uint256 share,
+ bool roundUp
+ ) external view returns (uint256 amount) {
+ amount = totals[token].toElastic(share, roundUp);
+ }
+
+ /// @notice Deposit an amount of `token` represented in either `amount` or `share`.
+ /// @param token_ The ERC-20 token to deposit.
+ /// @param from which account to pull the tokens.
+ /// @param to which account to push the tokens.
+ /// @param amount Token amount in native representation to deposit.
+ /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.
+ /// @return amountOut The amount deposited.
+ /// @return shareOut The deposited amount repesented in shares.
+ function deposit(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {
+ // Checks
+ require(to != address(0), "BentoBox: to not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;
+ Rebase memory total = totals[token];
+
+ // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.
+ require(total.elastic != 0 || token.totalSupply() > 0, "BentoBox: No tokens");
+ if (share == 0) {
+ // value of the share may be lower than the amount due to rounding, that's ok
+ share = total.toBase(amount, false);
+ // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)
+ if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {
+ return (0, 0);
+ }
+ } else {
+ // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)
+ amount = total.toElastic(share, true);
+ }
+
+ // In case of skimming, check that only the skimmable amount is taken.
+ // For ETH, the full balance is available, so no need to check.
+ // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.
+ require(
+ from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),
+ "BentoBox: Skim too much"
+ );
+
+ balanceOf[token][to] = balanceOf[token][to].add(share);
+ total.base = total.base.add(share.to128());
+ total.elastic = total.elastic.add(amount.to128());
+ totals[token] = total;
+
+ // Interactions
+ // During the first deposit, we check that this token is 'real'
+ if (token_ == USE_ETHEREUM) {
+ // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)
+ // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)
+ IWETH(address(wethToken)).deposit{value: amount}();
+ } else if (from != address(this)) {
+ // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)
+ // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.
+ token.safeTransferFrom(from, address(this), amount);
+ }
+ emit LogDeposit(token, from, to, amount, share);
+ amountOut = amount;
+ shareOut = share;
+ }
+
+ /// @notice Withdraws an amount of `token` from a user account.
+ /// @param token_ The ERC-20 token to withdraw.
+ /// @param from which user to pull the tokens.
+ /// @param to which user to push the tokens.
+ /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.
+ /// @param share Like above, but `share` takes precedence over `amount`.
+ function withdraw(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {
+ // Checks
+ require(to != address(0), "BentoBox: to not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;
+ Rebase memory total = totals[token];
+ if (share == 0) {
+ // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)
+ share = total.toBase(amount, true);
+ } else {
+ // amount may be lower than the value of share due to rounding, that's ok
+ amount = total.toElastic(share, false);
+ }
+
+ balanceOf[token][from] = balanceOf[token][from].sub(share);
+ total.elastic = total.elastic.sub(amount.to128());
+ total.base = total.base.sub(share.to128());
+ // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)
+ require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, "BentoBox: cannot empty");
+ totals[token] = total;
+
+ // Interactions
+ if (token_ == USE_ETHEREUM) {
+ // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.
+ IWETH(address(wethToken)).withdraw(amount);
+ // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.
+ (bool success, ) = to.call{value: amount}("");
+ require(success, "BentoBox: ETH transfer failed");
+ } else {
+ // X2, X3: A malicious token could block withdrawal of just THAT token.
+ // masterContracts may want to take care not to rely on withdraw always succeeding.
+ token.safeTransfer(to, amount);
+ }
+ emit LogWithdraw(token, from, to, amount, share);
+ amountOut = amount;
+ shareOut = share;
+ }
+
+ /// @notice Transfer shares from a user account to another one.
+ /// @param token The ERC-20 token to transfer.
+ /// @param from which user to pull the tokens.
+ /// @param to which user to push the tokens.
+ /// @param share The amount of `token` in shares.
+ // Clones of master contracts can transfer from any account that has approved them
+ // F3 - Can it be combined with another similar function?
+ // F3: This isn't combined with transferMultiple for gas optimization
+ function transfer(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 share
+ ) public allowed(from) {
+ // Checks
+ require(to != address(0), "BentoBox: to not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ balanceOf[token][from] = balanceOf[token][from].sub(share);
+ balanceOf[token][to] = balanceOf[token][to].add(share);
+
+ emit LogTransfer(token, from, to, share);
+ }
+
+ /// @notice Transfer shares from a user account to multiple other ones.
+ /// @param token The ERC-20 token to transfer.
+ /// @param from which user to pull the tokens.
+ /// @param tos The receivers of the tokens.
+ /// @param shares The amount of `token` in shares for each receiver in `tos`.
+ // F3 - Can it be combined with another similar function?
+ // F3: This isn't combined with transfer for gas optimization
+ function transferMultiple(
+ IERC20 token,
+ address from,
+ address[] calldata tos,
+ uint256[] calldata shares
+ ) public allowed(from) {
+ // Checks
+ require(tos[0] != address(0), "BentoBox: to[0] not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ uint256 totalAmount;
+ uint256 len = tos.length;
+ for (uint256 i = 0; i < len; i++) {
+ address to = tos[i];
+ balanceOf[token][to] = balanceOf[token][to].add(shares[i]);
+ totalAmount = totalAmount.add(shares[i]);
+ emit LogTransfer(token, from, to, shares[i]);
+ }
+ balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);
+ }
+
+ /// @notice Flashloan ability.
+ /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.
+ /// @param receiver Address of the token receiver.
+ /// @param token The address of the token to receive.
+ /// @param amount of the tokens to receive.
+ /// @param data The calldata to pass to the `borrower` contract.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Not possible to follow this here, reentrancy has been reviewed
+ // F6 - Check for front-running possibilities, such as the approve function (SWC-114)
+ // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.
+ function flashLoan(
+ IFlashBorrower borrower,
+ address receiver,
+ IERC20 token,
+ uint256 amount,
+ bytes calldata data
+ ) public {
+ uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;
+ token.safeTransfer(receiver, amount);
+
+ borrower.onFlashLoan(msg.sender, token, amount, fee, data);
+
+ require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), "BentoBox: Wrong amount");
+ emit LogFlashLoan(address(borrower), token, amount, fee, receiver);
+ }
+
+ /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.
+ /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.
+ /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.
+ /// @param tokens The addresses of the tokens.
+ /// @param amounts of the tokens for each receiver.
+ /// @param data The calldata to pass to the `borrower` contract.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Not possible to follow this here, reentrancy has been reviewed
+ // F6 - Check for front-running possibilities, such as the approve function (SWC-114)
+ // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.
+ function batchFlashLoan(
+ IBatchFlashBorrower borrower,
+ address[] calldata receivers,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ bytes calldata data
+ ) public {
+ uint256[] memory fees = new uint256[](tokens.length);
+
+ uint256 len = tokens.length;
+ for (uint256 i = 0; i < len; i++) {
+ uint256 amount = amounts[i];
+ fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;
+
+ tokens[i].safeTransfer(receivers[i], amounts[i]);
+ }
+
+ borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);
+
+ for (uint256 i = 0; i < len; i++) {
+ IERC20 token = tokens[i];
+ require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), "BentoBox: Wrong amount");
+ emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);
+ }
+ }
+
+ /// @notice Sets the target percentage of the strategy for `token`.
+ /// @dev Only the owner of this contract is allowed to change this.
+ /// @param token The address of the token that maps to a strategy to change.
+ /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.
+ function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {
+ // Checks
+ require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, "StrategyManager: Target too high");
+
+ // Effects
+ strategyData[token].targetPercentage = targetPercentage_;
+ emit LogStrategyTargetPercentage(token, targetPercentage_);
+ }
+
+ /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.
+ /// Must be called twice with the same arguments.
+ /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.
+ /// @dev Only the owner of this contract is allowed to change this.
+ /// @param token The address of the token that maps to a strategy to change.
+ /// @param newStrategy The address of the contract that conforms to `IStrategy`.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Total amount is updated AFTER interaction. But strategy is under our control.
+ // C4 - Use block.timestamp only for long intervals (SWC-116)
+ // C4: block.timestamp is used for a period of 2 weeks, which is long enough
+ function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {
+ StrategyData memory data = strategyData[token];
+ IStrategy pending = pendingStrategy[token];
+ if (data.strategyStartDate == 0 || pending != newStrategy) {
+ pendingStrategy[token] = newStrategy;
+ // C1 - All math done through BoringMath (SWC-101)
+ // C1: Our sun will swallow the earth well before this overflows
+ data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();
+ emit LogStrategyQueued(token, newStrategy);
+ } else {
+ require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, "StrategyManager: Too early");
+ if (address(strategy[token]) != address(0)) {
+ int256 balanceChange = strategy[token].exit(data.balance);
+ // Effects
+ if (balanceChange > 0) {
+ uint256 add = uint256(balanceChange);
+ totals[token].addElastic(add);
+ emit LogStrategyProfit(token, add);
+ } else if (balanceChange < 0) {
+ uint256 sub = uint256(-balanceChange);
+ totals[token].subElastic(sub);
+ emit LogStrategyLoss(token, sub);
+ }
+
+ emit LogStrategyDivest(token, data.balance);
+ }
+ strategy[token] = pending;
+ data.strategyStartDate = 0;
+ data.balance = 0;
+ pendingStrategy[token] = IStrategy(0);
+ emit LogStrategySet(token, newStrategy);
+ }
+ strategyData[token] = data;
+ }
+
+ /// @notice The actual process of yield farming. Executes the strategy of `token`.
+ /// Optionally does housekeeping if `balance` is true.
+ /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.
+ /// @param token The address of the token for which a strategy is deployed.
+ /// @param balance True if housekeeping should be done.
+ /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Total amount is updated AFTER interaction. But strategy is under our control.
+ // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?
+ function harvest(
+ IERC20 token,
+ bool balance,
+ uint256 maxChangeAmount
+ ) public {
+ StrategyData memory data = strategyData[token];
+ IStrategy _strategy = strategy[token];
+ int256 balanceChange = _strategy.harvest(data.balance, msg.sender);
+ if (balanceChange == 0 && !balance) {
+ return;
+ }
+
+ uint256 totalElastic = totals[token].elastic;
+
+ if (balanceChange > 0) {
+ uint256 add = uint256(balanceChange);
+ totalElastic = totalElastic.add(add);
+ totals[token].elastic = totalElastic.to128();
+ emit LogStrategyProfit(token, add);
+ } else if (balanceChange < 0) {
+ // C1 - All math done through BoringMath (SWC-101)
+ // C1: balanceChange could overflow if it's max negative int128.
+ // But tokens with balances that large are not supported by the BentoBox.
+ uint256 sub = uint256(-balanceChange);
+ totalElastic = totalElastic.sub(sub);
+ totals[token].elastic = totalElastic.to128();
+ data.balance = data.balance.sub(sub.to128());
+ emit LogStrategyLoss(token, sub);
+ }
+
+ if (balance) {
+ uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;
+ // if data.balance == targetBalance there is nothing to update
+ if (data.balance < targetBalance) {
+ uint256 amountOut = targetBalance.sub(data.balance);
+ if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {
+ amountOut = maxChangeAmount;
+ }
+ token.safeTransfer(address(_strategy), amountOut);
+ data.balance = data.balance.add(amountOut.to128());
+ _strategy.skim(amountOut);
+ emit LogStrategyInvest(token, amountOut);
+ } else if (data.balance > targetBalance) {
+ uint256 amountIn = data.balance.sub(targetBalance.to128());
+ if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {
+ amountIn = maxChangeAmount;
+ }
+
+ uint256 actualAmountIn = _strategy.withdraw(amountIn);
+
+ data.balance = data.balance.sub(actualAmountIn.to128());
+ emit LogStrategyDivest(token, actualAmountIn);
+ }
+ }
+
+ strategyData[token] = data;
+ }
+
+ // Contract should be able to receive ETH deposits to support deposit & skim
+ // solhint-disable-next-line no-empty-blocks
+ receive() external payable {}
+}
diff --git a/omgx_examples/sushi/contracts/bentobox/KashiPairMediumRiskV1.sol b/omgx_examples/sushi/contracts/bentobox/KashiPairMediumRiskV1.sol
new file mode 100644
index 000000000000..fb2d7a5b8684
--- /dev/null
+++ b/omgx_examples/sushi/contracts/bentobox/KashiPairMediumRiskV1.sol
@@ -0,0 +1,1437 @@
+// SPDX-License-Identifier: UNLICENSED
+// Kashi Lending Medium Risk
+
+// __ __ __ __ _____ __ __
+// | |/ .---.-.-----| |--|__| | |_.-----.-----.--| |__.-----.-----.
+// | <| _ |__ --| | | | | -__| | _ | | | _ |
+// |__|\__|___._|_____|__|__|__| |_______|_____|__|__|_____|__|__|__|___ |
+// |_____|
+
+// Copyright (c) 2021 BoringCrypto - All rights reserved
+// Twitter: @Boring_Crypto
+
+// Special thanks to:
+// @0xKeno - for all his invaluable contributions
+// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations
+
+// Version: 22-Feb-2021
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+// solhint-disable avoid-low-level-calls
+// solhint-disable no-inline-assembly
+// solhint-disable not-rely-on-time
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0
+// License-Identifier: MIT
+
+/// @notice A library for performing overflow-/underflow-safe math,
+/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).
+library BoringMath {
+ function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+
+ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow");
+ }
+
+ function to128(uint256 a) internal pure returns (uint128 c) {
+ require(a <= uint128(-1), "BoringMath: uint128 Overflow");
+ c = uint128(a);
+ }
+
+ function to64(uint256 a) internal pure returns (uint64 c) {
+ require(a <= uint64(-1), "BoringMath: uint64 Overflow");
+ c = uint64(a);
+ }
+
+ function to32(uint256 a) internal pure returns (uint32 c) {
+ require(a <= uint32(-1), "BoringMath: uint32 Overflow");
+ c = uint32(a);
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.
+library BoringMath128 {
+ function add(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0
+// License-Identifier: MIT
+
+// Audit on 5-Jan-2021 by Keno and BoringCrypto
+// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
+// Edited by BoringCrypto
+
+contract BoringOwnableData {
+ address public owner;
+ address public pendingOwner;
+}
+
+contract BoringOwnable is BoringOwnableData {
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ /// @notice `owner` defaults to msg.sender on construction.
+ constructor() public {
+ owner = msg.sender;
+ emit OwnershipTransferred(address(0), msg.sender);
+ }
+
+ /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
+ /// Can only be invoked by the current `owner`.
+ /// @param newOwner Address of the new owner.
+ /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
+ /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
+ function transferOwnership(
+ address newOwner,
+ bool direct,
+ bool renounce
+ ) public onlyOwner {
+ if (direct) {
+ // Checks
+ require(newOwner != address(0) || renounce, "Ownable: zero address");
+
+ // Effects
+ emit OwnershipTransferred(owner, newOwner);
+ owner = newOwner;
+ pendingOwner = address(0);
+ } else {
+ // Effects
+ pendingOwner = newOwner;
+ }
+ }
+
+ /// @notice Needs to be called by `pendingOwner` to claim ownership.
+ function claimOwnership() public {
+ address _pendingOwner = pendingOwner;
+
+ // Checks
+ require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
+
+ // Effects
+ emit OwnershipTransferred(owner, _pendingOwner);
+ owner = _pendingOwner;
+ pendingOwner = address(0);
+ }
+
+ /// @notice Only allows the `owner` to execute the function.
+ modifier onlyOwner() {
+ require(msg.sender == owner, "Ownable: caller is not the owner");
+ _;
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/Domain.sol@v1.2.0
+// License-Identifier: MIT
+// Based on code and smartness by Ross Campbell and Keno
+// Uses immutable to store the domain separator to reduce gas usage
+// If the chain id changes due to a fork, the forked chain will calculate on the fly.
+
+contract Domain {
+ bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(uint256 chainId,address verifyingContract)");
+ // See https://eips.ethereum.org/EIPS/eip-191
+ string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";
+
+ // solhint-disable var-name-mixedcase
+ bytes32 private immutable _DOMAIN_SEPARATOR;
+ uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;
+
+ /// @dev Calculate the DOMAIN_SEPARATOR
+ function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
+ return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));
+ }
+
+ constructor() public {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);
+ }
+
+ /// @dev Return the DOMAIN_SEPARATOR
+ // It's named internal to allow making it public from the contract that uses it by creating a simple view function
+ // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.
+ // solhint-disable-next-line func-name-mixedcase
+ function DOMAIN_SEPARATOR() public view returns (bytes32) {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
+ }
+
+ function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {
+ digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+// solhint-disable no-inline-assembly
+// solhint-disable not-rely-on-time
+
+// Data part taken out for building of contracts that receive delegate calls
+contract ERC20Data {
+ /// @notice owner > balance mapping.
+ mapping(address => uint256) public balanceOf;
+ /// @notice owner > spender > allowance mapping.
+ mapping(address => mapping(address => uint256)) public allowance;
+ /// @notice owner > nonce mapping. Used in `permit`.
+ mapping(address => uint256) public nonces;
+}
+
+contract ERC20 is ERC20Data, Domain {
+ event Transfer(address indexed _from, address indexed _to, uint256 _value);
+ event Approval(address indexed _owner, address indexed _spender, uint256 _value);
+
+ /// @notice Transfers `amount` tokens from `msg.sender` to `to`.
+ /// @param to The address to move the tokens.
+ /// @param amount of the tokens to move.
+ /// @return (bool) Returns True if succeeded.
+ function transfer(address to, uint256 amount) public returns (bool) {
+ // If `amount` is 0, or `msg.sender` is `to` nothing happens
+ if (amount != 0) {
+ uint256 srcBalance = balanceOf[msg.sender];
+ require(srcBalance >= amount, "ERC20: balance too low");
+ if (msg.sender != to) {
+ require(to != address(0), "ERC20: no zero address"); // Moved down so low balance calls safe some gas
+
+ balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked
+ balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1
+ }
+ }
+ emit Transfer(msg.sender, to, amount);
+ return true;
+ }
+
+ /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.
+ /// @param from Address to draw tokens from.
+ /// @param to The address to move the tokens.
+ /// @param amount The token amount to move.
+ /// @return (bool) Returns True if succeeded.
+ function transferFrom(
+ address from,
+ address to,
+ uint256 amount
+ ) public returns (bool) {
+ // If `amount` is 0, or `from` is `to` nothing happens
+ if (amount != 0) {
+ uint256 srcBalance = balanceOf[from];
+ require(srcBalance >= amount, "ERC20: balance too low");
+
+ if (from != to) {
+ uint256 spenderAllowance = allowance[from][msg.sender];
+ // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).
+ if (spenderAllowance != type(uint256).max) {
+ require(spenderAllowance >= amount, "ERC20: allowance too low");
+ allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked
+ }
+ require(to != address(0), "ERC20: no zero address"); // Moved down so other failed calls safe some gas
+
+ balanceOf[from] = srcBalance - amount; // Underflow is checked
+ balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1
+ }
+ }
+ emit Transfer(from, to, amount);
+ return true;
+ }
+
+ /// @notice Approves `amount` from sender to be spend by `spender`.
+ /// @param spender Address of the party that can draw from msg.sender's account.
+ /// @param amount The maximum collective amount that `spender` can draw.
+ /// @return (bool) Returns True if approved.
+ function approve(address spender, uint256 amount) public returns (bool) {
+ allowance[msg.sender][spender] = amount;
+ emit Approval(msg.sender, spender, amount);
+ return true;
+ }
+
+ // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
+ bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
+
+ /// @notice Approves `value` from `owner_` to be spend by `spender`.
+ /// @param owner_ Address of the owner.
+ /// @param spender The address of the spender that gets approved to draw from `owner_`.
+ /// @param value The maximum collective amount that `spender` can draw.
+ /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).
+ function permit(
+ address owner_,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external {
+ require(owner_ != address(0), "ERC20: Owner cannot be 0");
+ require(block.timestamp < deadline, "ERC20: Expired");
+ require(
+ ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==
+ owner_,
+ "ERC20: Invalid Signature"
+ );
+ allowance[owner_][spender] = value;
+ emit Approval(owner_, spender, value);
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IMasterContract {
+ /// @notice Init function that gets called from `BoringFactory.deploy`.
+ /// Also kown as the constructor for cloned contracts.
+ /// Any ETH send to `BoringFactory.deploy` ends up here.
+ /// @param data Can be abi encoded arguments or anything else.
+ function init(bytes calldata data) external payable;
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0
+// License-Identifier: MIT
+
+struct Rebase {
+ uint128 elastic;
+ uint128 base;
+}
+
+/// @notice A rebasing library using overflow-/underflow-safe math.
+library RebaseLibrary {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+
+ /// @notice Calculates the base value in relationship to `elastic` and `total`.
+ function toBase(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (uint256 base) {
+ if (total.elastic == 0) {
+ base = elastic;
+ } else {
+ base = elastic.mul(total.base) / total.elastic;
+ if (roundUp && base.mul(total.elastic) / total.base < elastic) {
+ base = base.add(1);
+ }
+ }
+ }
+
+ /// @notice Calculates the elastic value in relationship to `base` and `total`.
+ function toElastic(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (uint256 elastic) {
+ if (total.base == 0) {
+ elastic = base;
+ } else {
+ elastic = base.mul(total.elastic) / total.base;
+ if (roundUp && elastic.mul(total.base) / total.elastic < base) {
+ elastic = elastic.add(1);
+ }
+ }
+ }
+
+ /// @notice Add `elastic` to `total` and doubles `total.base`.
+ /// @return (Rebase) The new total.
+ /// @return base in relationship to `elastic`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 base) {
+ base = toBase(total, elastic, roundUp);
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return (total, base);
+ }
+
+ /// @notice Sub `base` from `total` and update `total.elastic`.
+ /// @return (Rebase) The new total.
+ /// @return elastic in relationship to `base`.
+ function sub(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 elastic) {
+ elastic = toElastic(total, base, roundUp);
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return (total, elastic);
+ }
+
+ /// @notice Add `elastic` and `base` to `total`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return total;
+ }
+
+ /// @notice Subtract `elastic` and `base` to `total`.
+ function sub(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return total;
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IERC20 {
+ function totalSupply() external view returns (uint256);
+
+ function balanceOf(address account) external view returns (uint256);
+
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice EIP 2612
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+library BoringERC20 {
+ bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
+ bytes4 private constant SIG_NAME = 0x06fdde03; // name()
+ bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
+ bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
+ bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)
+
+ function returnDataToString(bytes memory data) internal pure returns (string memory) {
+ if (data.length >= 64) {
+ return abi.decode(data, (string));
+ } else if (data.length == 32) {
+ uint8 i = 0;
+ while (i < 32 && data[i] != 0) {
+ i++;
+ }
+ bytes memory bytesArray = new bytes(i);
+ for (i = 0; i < 32 && data[i] != 0; i++) {
+ bytesArray[i] = data[i];
+ }
+ return string(bytesArray);
+ } else {
+ return "???";
+ }
+ }
+
+ /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
+ /// @param token The address of the ERC-20 token contract.
+ /// @return (string) Token symbol.
+ function safeSymbol(IERC20 token) internal view returns (string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));
+ return success ? returnDataToString(data) : "???";
+ }
+
+ /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
+ /// @param token The address of the ERC-20 token contract.
+ /// @return (string) Token name.
+ function safeName(IERC20 token) internal view returns (string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));
+ return success ? returnDataToString(data) : "???";
+ }
+
+ /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
+ /// @param token The address of the ERC-20 token contract.
+ /// @return (uint8) Token decimals.
+ function safeDecimals(IERC20 token) internal view returns (uint8) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));
+ return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
+ }
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IBatchFlashBorrower {
+ function onBatchFlashLoan(
+ address sender,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ uint256[] calldata fees,
+ bytes calldata data
+ ) external;
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IFlashBorrower {
+ function onFlashLoan(
+ address sender,
+ IERC20 token,
+ uint256 amount,
+ uint256 fee,
+ bytes calldata data
+ ) external;
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IStrategy {
+ // Send the assets to the Strategy and call skim to invest them
+ function skim(uint256 amount) external;
+
+ // Harvest any profits made converted to the asset and pass them to the caller
+ function harvest(uint256 balance, address sender) external returns (int256 amountAdded);
+
+ // Withdraw assets. The returned amount can differ from the requested amount due to rounding.
+ // The actualAmount should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for.
+ function withdraw(uint256 amount) external returns (uint256 actualAmount);
+
+ // Withdraw all assets in the safest way possible. This shouldn't fail.
+ function exit(uint256 balance) external returns (int256 amountAdded);
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IBentoBoxV1 {
+ event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);
+ event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);
+ event LogRegisterProtocol(address indexed protocol);
+ event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);
+ event LogStrategyDivest(address indexed token, uint256 amount);
+ event LogStrategyInvest(address indexed token, uint256 amount);
+ event LogStrategyLoss(address indexed token, uint256 amount);
+ event LogStrategyProfit(address indexed token, uint256 amount);
+ event LogStrategyQueued(address indexed token, address indexed strategy);
+ event LogStrategySet(address indexed token, address indexed strategy);
+ event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);
+ event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);
+ event LogWhiteListMasterContract(address indexed masterContract, bool approved);
+ event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ function balanceOf(IERC20, address) external view returns (uint256);
+
+ function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);
+
+ function batchFlashLoan(
+ IBatchFlashBorrower borrower,
+ address[] calldata receivers,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ bytes calldata data
+ ) external;
+
+ function claimOwnership() external;
+
+ function deploy(
+ address masterContract,
+ bytes calldata data,
+ bool useCreate2
+ ) external payable;
+
+ function deposit(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) external payable returns (uint256 amountOut, uint256 shareOut);
+
+ function flashLoan(
+ IFlashBorrower borrower,
+ address receiver,
+ IERC20 token,
+ uint256 amount,
+ bytes calldata data
+ ) external;
+
+ function harvest(
+ IERC20 token,
+ bool balance,
+ uint256 maxChangeAmount
+ ) external;
+
+ function masterContractApproved(address, address) external view returns (bool);
+
+ function masterContractOf(address) external view returns (address);
+
+ function nonces(address) external view returns (uint256);
+
+ function owner() external view returns (address);
+
+ function pendingOwner() external view returns (address);
+
+ function pendingStrategy(IERC20) external view returns (IStrategy);
+
+ function permitToken(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+
+ function registerProtocol() external;
+
+ function setMasterContractApproval(
+ address user,
+ address masterContract,
+ bool approved,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+
+ function setStrategy(IERC20 token, IStrategy newStrategy) external;
+
+ function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;
+
+ function strategy(IERC20) external view returns (IStrategy);
+
+ function strategyData(IERC20)
+ external
+ view
+ returns (
+ uint64 strategyStartDate,
+ uint64 targetPercentage,
+ uint128 balance
+ );
+
+ function toAmount(
+ IERC20 token,
+ uint256 share,
+ bool roundUp
+ ) external view returns (uint256 amount);
+
+ function toShare(
+ IERC20 token,
+ uint256 amount,
+ bool roundUp
+ ) external view returns (uint256 share);
+
+ function totals(IERC20) external view returns (Rebase memory totals_);
+
+ function transfer(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 share
+ ) external;
+
+ function transferMultiple(
+ IERC20 token,
+ address from,
+ address[] calldata tos,
+ uint256[] calldata shares
+ ) external;
+
+ function transferOwnership(
+ address newOwner,
+ bool direct,
+ bool renounce
+ ) external;
+
+ function whitelistMasterContract(address masterContract, bool approved) external;
+
+ function whitelistedMasterContracts(address) external view returns (bool);
+
+ function withdraw(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) external returns (uint256 amountOut, uint256 shareOut);
+}
+
+// File contracts/interfaces/IOracle.sol
+// License-Identifier: MIT
+
+interface IOracle {
+ /// @notice Get the latest exchange rate.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function get(bytes calldata data) external returns (bool success, uint256 rate);
+
+ /// @notice Check the last exchange rate without any state changes.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peek(bytes calldata data) external view returns (bool success, uint256 rate);
+
+ /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peekSpot(bytes calldata data) external view returns (uint256 rate);
+
+ /// @notice Returns a human readable (short) name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable symbol name about this oracle.
+ function symbol(bytes calldata data) external view returns (string memory);
+
+ /// @notice Returns a human readable name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable name about this oracle.
+ function name(bytes calldata data) external view returns (string memory);
+}
+
+// File contracts/interfaces/ISwapper.sol
+// License-Identifier: MIT
+
+interface ISwapper {
+ /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.
+ /// Swaps it for at least 'amountToMin' of token 'to'.
+ /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.
+ /// Returns the amount of tokens 'to' transferred to BentoBox.
+ /// (The BentoBox skim function will be used by the caller to get the swapped funds).
+ function swap(
+ IERC20 fromToken,
+ IERC20 toToken,
+ address recipient,
+ uint256 shareToMin,
+ uint256 shareFrom
+ ) external returns (uint256 extraShare, uint256 shareReturned);
+
+ /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),
+ /// this should be less than or equal to amountFromMax.
+ /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.
+ /// Swaps it for exactly 'exactAmountTo' of token 'to'.
+ /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.
+ /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).
+ /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).
+ /// (The BentoBox skim function will be used by the caller to get the swapped funds).
+ function swapExact(
+ IERC20 fromToken,
+ IERC20 toToken,
+ address recipient,
+ address refundTo,
+ uint256 shareFromSupplied,
+ uint256 shareToExact
+ ) external returns (uint256 shareUsed, uint256 shareReturned);
+}
+
+// File contracts/KashiPair.sol
+// License-Identifier: UNLICENSED
+// Kashi Lending Medium Risk
+
+/// @title KashiPair
+/// @dev This contract allows contract calls to any contract (except BentoBox)
+/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.
+contract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using RebaseLibrary for Rebase;
+ using BoringERC20 for IERC20;
+
+ event LogExchangeRate(uint256 rate);
+ event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);
+ event LogAddCollateral(address indexed from, address indexed to, uint256 share);
+ event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);
+ event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);
+ event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);
+ event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);
+ event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);
+ event LogFeeTo(address indexed newFeeTo);
+ event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);
+
+ // Immutables (for MasterContract and all clones)
+ IBentoBoxV1 public immutable bentoBox;
+ KashiPairMediumRiskV1 public immutable masterContract;
+
+ // MasterContract variables
+ address public feeTo;
+ mapping(ISwapper => bool) public swappers;
+
+ // Per clone variables
+ // Clone init settings
+ IERC20 public collateral;
+ IERC20 public asset;
+ IOracle public oracle;
+ bytes public oracleData;
+
+ // Total amounts
+ uint256 public totalCollateralShare; // Total collateral supplied
+ Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers
+ Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers
+
+ // User balances
+ mapping(address => uint256) public userCollateralShare;
+ // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)
+ mapping(address => uint256) public userBorrowPart;
+
+ /// @notice Exchange and interest rate tracking.
+ /// This is 'cached' here because calls to Oracles can be very expensive.
+ uint256 public exchangeRate;
+
+ struct AccrueInfo {
+ uint64 interestPerSecond;
+ uint64 lastAccrued;
+ uint128 feesEarnedFraction;
+ }
+
+ AccrueInfo public accrueInfo;
+
+ // ERC20 'variables'
+ function symbol() external view returns (string memory) {
+ return string(abi.encodePacked("km", collateral.safeSymbol(), "/", asset.safeSymbol(), "-", oracle.symbol(oracleData)));
+ }
+
+ function name() external view returns (string memory) {
+ return string(abi.encodePacked("Kashi Medium Risk ", collateral.safeName(), "/", asset.safeName(), "-", oracle.name(oracleData)));
+ }
+
+ function decimals() external view returns (uint8) {
+ return asset.safeDecimals();
+ }
+
+ // totalSupply for ERC20 compatibility
+ function totalSupply() public view returns (uint256) {
+ return totalAsset.base;
+ }
+
+ // Settings for the Medium Risk KashiPair
+ uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%
+ uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%
+ uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)
+ uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%
+ uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%
+ uint256 private constant UTILIZATION_PRECISION = 1e18;
+ uint256 private constant FULL_UTILIZATION = 1e18;
+ uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;
+ uint256 private constant FACTOR_PRECISION = 1e18;
+
+ uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR
+ uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR
+ uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR
+ uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear
+
+ uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;
+
+ uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%
+ uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;
+
+ // Fees
+ uint256 private constant PROTOCOL_FEE = 10000; // 10%
+ uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;
+ uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%
+ uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;
+
+ /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.
+ constructor(IBentoBoxV1 bentoBox_) public {
+ bentoBox = bentoBox_;
+ masterContract = this;
+ feeTo = msg.sender;
+ }
+
+ /// @notice Serves as the constructor for clones, as clones can't have a regular constructor
+ /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)
+ function init(bytes calldata data) public payable override {
+ require(address(collateral) == address(0), "KashiPair: already initialized");
+ (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));
+ require(address(collateral) != address(0), "KashiPair: bad pair");
+
+ accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%
+ }
+
+ /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.
+ function accrue() public {
+ AccrueInfo memory _accrueInfo = accrueInfo;
+ // Number of seconds since accrue was called
+ uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;
+ if (elapsedTime == 0) {
+ return;
+ }
+ _accrueInfo.lastAccrued = uint64(block.timestamp);
+
+ Rebase memory _totalBorrow = totalBorrow;
+ if (_totalBorrow.base == 0) {
+ // If there are no borrows, reset the interest rate
+ if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {
+ _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;
+ emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);
+ }
+ accrueInfo = _accrueInfo;
+ return;
+ }
+
+ uint256 extraAmount = 0;
+ uint256 feeFraction = 0;
+ Rebase memory _totalAsset = totalAsset;
+
+ // Accrue interest
+ extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;
+ _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());
+ uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);
+
+ uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee
+ feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;
+ _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());
+ totalAsset.base = _totalAsset.base.add(feeFraction.to128());
+ totalBorrow = _totalBorrow;
+
+ // Update interest rate
+ uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;
+ if (utilization < MINIMUM_TARGET_UTILIZATION) {
+ uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;
+ uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));
+ _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);
+
+ if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {
+ _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum
+ }
+ } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {
+ uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;
+ uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));
+ uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;
+ if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {
+ newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum
+ }
+ _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);
+ }
+
+ emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);
+ accrueInfo = _accrueInfo;
+ }
+
+ /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.
+ /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.
+ function _isSolvent(
+ address user,
+ bool open,
+ uint256 _exchangeRate
+ ) internal view returns (bool) {
+ // accrue must have already been called!
+ uint256 borrowPart = userBorrowPart[user];
+ if (borrowPart == 0) return true;
+ uint256 collateralShare = userCollateralShare[user];
+ if (collateralShare == 0) return false;
+
+ Rebase memory _totalBorrow = totalBorrow;
+
+ return
+ bentoBox.toAmount(
+ collateral,
+ collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(
+ open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE
+ ),
+ false
+ ) >=
+ // Moved exchangeRate here instead of dividing the other side to preserve more precision
+ borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;
+ }
+
+ /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.
+ modifier solvent() {
+ _;
+ require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent");
+ }
+
+ /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.
+ /// This function is supposed to be invoked if needed because Oracle queries can be expensive.
+ /// @return updated True if `exchangeRate` was updated.
+ /// @return rate The new exchange rate.
+ function updateExchangeRate() public returns (bool updated, uint256 rate) {
+ (updated, rate) = oracle.get(oracleData);
+
+ if (updated) {
+ exchangeRate = rate;
+ emit LogExchangeRate(rate);
+ } else {
+ // Return the old rate if fetching wasn't successful
+ rate = exchangeRate;
+ }
+ }
+
+ /// @dev Helper function to move tokens.
+ /// @param token The ERC-20 token.
+ /// @param share The amount in shares to add.
+ /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.
+ /// Only used for accounting checks.
+ /// @param skim If True, only does a balance check on this contract.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ function _addTokens(
+ IERC20 token,
+ uint256 share,
+ uint256 total,
+ bool skim
+ ) internal {
+ if (skim) {
+ require(share <= bentoBox.balanceOf(token, address(this)).sub(total), "KashiPair: Skim too much");
+ } else {
+ bentoBox.transfer(token, msg.sender, address(this), share);
+ }
+ }
+
+ /// @notice Adds `collateral` from msg.sender to the account `to`.
+ /// @param to The receiver of the tokens.
+ /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ /// @param share The amount of shares to add for `to`.
+ function addCollateral(
+ address to,
+ bool skim,
+ uint256 share
+ ) public {
+ userCollateralShare[to] = userCollateralShare[to].add(share);
+ uint256 oldTotalCollateralShare = totalCollateralShare;
+ totalCollateralShare = oldTotalCollateralShare.add(share);
+ _addTokens(collateral, share, oldTotalCollateralShare, skim);
+ emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);
+ }
+
+ /// @dev Concrete implementation of `removeCollateral`.
+ function _removeCollateral(address to, uint256 share) internal {
+ userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);
+ totalCollateralShare = totalCollateralShare.sub(share);
+ emit LogRemoveCollateral(msg.sender, to, share);
+ bentoBox.transfer(collateral, address(this), to, share);
+ }
+
+ /// @notice Removes `share` amount of collateral and transfers it to `to`.
+ /// @param to The receiver of the shares.
+ /// @param share Amount of shares to remove.
+ function removeCollateral(address to, uint256 share) public solvent {
+ // accrue must be called because we check solvency
+ accrue();
+ _removeCollateral(to, share);
+ }
+
+ /// @dev Concrete implementation of `addAsset`.
+ function _addAsset(
+ address to,
+ bool skim,
+ uint256 share
+ ) internal returns (uint256 fraction) {
+ Rebase memory _totalAsset = totalAsset;
+ uint256 totalAssetShare = _totalAsset.elastic;
+ uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);
+ fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;
+ if (_totalAsset.base.add(fraction.to128()) < 1000) {
+ return 0;
+ }
+ totalAsset = _totalAsset.add(share, fraction);
+ balanceOf[to] = balanceOf[to].add(fraction);
+ _addTokens(asset, share, totalAssetShare, skim);
+ emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);
+ }
+
+ /// @notice Adds assets to the lending pair.
+ /// @param to The address of the user to receive the assets.
+ /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ /// @param share The amount of shares to add.
+ /// @return fraction Total fractions added.
+ function addAsset(
+ address to,
+ bool skim,
+ uint256 share
+ ) public returns (uint256 fraction) {
+ accrue();
+ fraction = _addAsset(to, skim, share);
+ }
+
+ /// @dev Concrete implementation of `removeAsset`.
+ function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {
+ Rebase memory _totalAsset = totalAsset;
+ uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);
+ share = fraction.mul(allShare) / _totalAsset.base;
+ balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);
+ _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());
+ _totalAsset.base = _totalAsset.base.sub(fraction.to128());
+ require(_totalAsset.base >= 1000, "Kashi: below minimum");
+ totalAsset = _totalAsset;
+ emit LogRemoveAsset(msg.sender, to, share, fraction);
+ bentoBox.transfer(asset, address(this), to, share);
+ }
+
+ /// @notice Removes an asset from msg.sender and transfers it to `to`.
+ /// @param to The user that receives the removed assets.
+ /// @param fraction The amount/fraction of assets held to remove.
+ /// @return share The amount of shares transferred to `to`.
+ function removeAsset(address to, uint256 fraction) public returns (uint256 share) {
+ accrue();
+ share = _removeAsset(to, fraction);
+ }
+
+ /// @dev Concrete implementation of `borrow`.
+ function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {
+ uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow
+
+ (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);
+ userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);
+ emit LogBorrow(msg.sender, to, amount, feeAmount, part);
+
+ share = bentoBox.toShare(asset, amount, false);
+ Rebase memory _totalAsset = totalAsset;
+ require(_totalAsset.base >= 1000, "Kashi: below minimum");
+ _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());
+ totalAsset = _totalAsset;
+ bentoBox.transfer(asset, address(this), to, share);
+ }
+
+ /// @notice Sender borrows `amount` and transfers it to `to`.
+ /// @return part Total part of the debt held by borrowers.
+ /// @return share Total amount in shares borrowed.
+ function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {
+ accrue();
+ (part, share) = _borrow(to, amount);
+ }
+
+ /// @dev Concrete implementation of `repay`.
+ function _repay(
+ address to,
+ bool skim,
+ uint256 part
+ ) internal returns (uint256 amount) {
+ (totalBorrow, amount) = totalBorrow.sub(part, true);
+ userBorrowPart[to] = userBorrowPart[to].sub(part);
+
+ uint256 share = bentoBox.toShare(asset, amount, true);
+ uint128 totalShare = totalAsset.elastic;
+ _addTokens(asset, share, uint256(totalShare), skim);
+ totalAsset.elastic = totalShare.add(share.to128());
+ emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);
+ }
+
+ /// @notice Repays a loan.
+ /// @param to Address of the user this payment should go.
+ /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ /// @param part The amount to repay. See `userBorrowPart`.
+ /// @return amount The total amount repayed.
+ function repay(
+ address to,
+ bool skim,
+ uint256 part
+ ) public returns (uint256 amount) {
+ accrue();
+ amount = _repay(to, skim, part);
+ }
+
+ // Functions that need accrue to be called
+ uint8 internal constant ACTION_ADD_ASSET = 1;
+ uint8 internal constant ACTION_REPAY = 2;
+ uint8 internal constant ACTION_REMOVE_ASSET = 3;
+ uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;
+ uint8 internal constant ACTION_BORROW = 5;
+ uint8 internal constant ACTION_GET_REPAY_SHARE = 6;
+ uint8 internal constant ACTION_GET_REPAY_PART = 7;
+ uint8 internal constant ACTION_ACCRUE = 8;
+
+ // Functions that don't need accrue to be called
+ uint8 internal constant ACTION_ADD_COLLATERAL = 10;
+ uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;
+
+ // Function on BentoBox
+ uint8 internal constant ACTION_BENTO_DEPOSIT = 20;
+ uint8 internal constant ACTION_BENTO_WITHDRAW = 21;
+ uint8 internal constant ACTION_BENTO_TRANSFER = 22;
+ uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;
+ uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;
+
+ // Any external call (except to BentoBox)
+ uint8 internal constant ACTION_CALL = 30;
+
+ int256 internal constant USE_VALUE1 = -1;
+ int256 internal constant USE_VALUE2 = -2;
+
+ /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.
+ function _num(
+ int256 inNum,
+ uint256 value1,
+ uint256 value2
+ ) internal pure returns (uint256 outNum) {
+ outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);
+ }
+
+ /// @dev Helper function for depositing into `bentoBox`.
+ function _bentoDeposit(
+ bytes memory data,
+ uint256 value,
+ uint256 value1,
+ uint256 value2
+ ) internal returns (uint256, uint256) {
+ (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));
+ amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors
+ share = int256(_num(share, value1, value2));
+ return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));
+ }
+
+ /// @dev Helper function to withdraw from the `bentoBox`.
+ function _bentoWithdraw(
+ bytes memory data,
+ uint256 value1,
+ uint256 value2
+ ) internal returns (uint256, uint256) {
+ (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));
+ return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));
+ }
+
+ /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.
+ /// Calls to `bentoBox` are not allowed for obvious security reasons.
+ /// This also means that calls made from this contract shall *not* be trusted.
+ function _call(
+ uint256 value,
+ bytes memory data,
+ uint256 value1,
+ uint256 value2
+ ) internal returns (bytes memory, uint8) {
+ (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =
+ abi.decode(data, (address, bytes, bool, bool, uint8));
+
+ if (useValue1 && !useValue2) {
+ callData = abi.encodePacked(callData, value1);
+ } else if (!useValue1 && useValue2) {
+ callData = abi.encodePacked(callData, value2);
+ } else if (useValue1 && useValue2) {
+ callData = abi.encodePacked(callData, value1, value2);
+ }
+
+ require(callee != address(bentoBox) && callee != address(this), "KashiPair: can't call");
+
+ (bool success, bytes memory returnData) = callee.call{value: value}(callData);
+ require(success, "KashiPair: call failed");
+ return (returnData, returnValues);
+ }
+
+ struct CookStatus {
+ bool needsSolvencyCheck;
+ bool hasAccrued;
+ }
+
+ /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.
+ /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).
+ /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.
+ /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.
+ /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.
+ /// @return value1 May contain the first positioned return value of the last executed action (if applicable).
+ /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).
+ function cook(
+ uint8[] calldata actions,
+ uint256[] calldata values,
+ bytes[] calldata datas
+ ) external payable returns (uint256 value1, uint256 value2) {
+ CookStatus memory status;
+ for (uint256 i = 0; i < actions.length; i++) {
+ uint8 action = actions[i];
+ if (!status.hasAccrued && action < 10) {
+ accrue();
+ status.hasAccrued = true;
+ }
+ if (action == ACTION_ADD_COLLATERAL) {
+ (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));
+ addCollateral(to, skim, _num(share, value1, value2));
+ } else if (action == ACTION_ADD_ASSET) {
+ (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));
+ value1 = _addAsset(to, skim, _num(share, value1, value2));
+ } else if (action == ACTION_REPAY) {
+ (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));
+ _repay(to, skim, _num(part, value1, value2));
+ } else if (action == ACTION_REMOVE_ASSET) {
+ (int256 fraction, address to) = abi.decode(datas[i], (int256, address));
+ value1 = _removeAsset(to, _num(fraction, value1, value2));
+ } else if (action == ACTION_REMOVE_COLLATERAL) {
+ (int256 share, address to) = abi.decode(datas[i], (int256, address));
+ _removeCollateral(to, _num(share, value1, value2));
+ status.needsSolvencyCheck = true;
+ } else if (action == ACTION_BORROW) {
+ (int256 amount, address to) = abi.decode(datas[i], (int256, address));
+ (value1, value2) = _borrow(to, _num(amount, value1, value2));
+ status.needsSolvencyCheck = true;
+ } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {
+ (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));
+ (bool updated, uint256 rate) = updateExchangeRate();
+ require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), "KashiPair: rate not ok");
+ } else if (action == ACTION_BENTO_SETAPPROVAL) {
+ (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =
+ abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));
+ bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);
+ } else if (action == ACTION_BENTO_DEPOSIT) {
+ (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);
+ } else if (action == ACTION_BENTO_WITHDRAW) {
+ (value1, value2) = _bentoWithdraw(datas[i], value1, value2);
+ } else if (action == ACTION_BENTO_TRANSFER) {
+ (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));
+ bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));
+ } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {
+ (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));
+ bentoBox.transferMultiple(token, msg.sender, tos, shares);
+ } else if (action == ACTION_CALL) {
+ (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);
+
+ if (returnValues == 1) {
+ (value1) = abi.decode(returnData, (uint256));
+ } else if (returnValues == 2) {
+ (value1, value2) = abi.decode(returnData, (uint256, uint256));
+ }
+ } else if (action == ACTION_GET_REPAY_SHARE) {
+ int256 part = abi.decode(datas[i], (int256));
+ value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);
+ } else if (action == ACTION_GET_REPAY_PART) {
+ int256 amount = abi.decode(datas[i], (int256));
+ value1 = totalBorrow.toBase(_num(amount, value1, value2), false);
+ }
+ }
+
+ if (status.needsSolvencyCheck) {
+ require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent");
+ }
+ }
+
+ /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.
+ /// @param users An array of user addresses.
+ /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.
+ /// @param to Address of the receiver in open liquidations if `swapper` is zero.
+ /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.
+ /// @param open True to perform a open liquidation else False.
+ function liquidate(
+ address[] calldata users,
+ uint256[] calldata maxBorrowParts,
+ address to,
+ ISwapper swapper,
+ bool open
+ ) public {
+ // Oracle can fail but we still need to allow liquidations
+ (, uint256 _exchangeRate) = updateExchangeRate();
+ accrue();
+
+ uint256 allCollateralShare;
+ uint256 allBorrowAmount;
+ uint256 allBorrowPart;
+ Rebase memory _totalBorrow = totalBorrow;
+ Rebase memory bentoBoxTotals = bentoBox.totals(collateral);
+ for (uint256 i = 0; i < users.length; i++) {
+ address user = users[i];
+ if (!_isSolvent(user, open, _exchangeRate)) {
+ uint256 borrowPart;
+ {
+ uint256 availableBorrowPart = userBorrowPart[user];
+ borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];
+ userBorrowPart[user] = availableBorrowPart.sub(borrowPart);
+ }
+ uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);
+ uint256 collateralShare =
+ bentoBoxTotals.toBase(
+ borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /
+ (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),
+ false
+ );
+
+ userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);
+ emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);
+ emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);
+
+ // Keep totals
+ allCollateralShare = allCollateralShare.add(collateralShare);
+ allBorrowAmount = allBorrowAmount.add(borrowAmount);
+ allBorrowPart = allBorrowPart.add(borrowPart);
+ }
+ }
+ require(allBorrowAmount != 0, "KashiPair: all are solvent");
+ _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());
+ _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());
+ totalBorrow = _totalBorrow;
+ totalCollateralShare = totalCollateralShare.sub(allCollateralShare);
+
+ uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);
+
+ if (!open) {
+ // Closed liquidation using a pre-approved swapper for the benefit of the LPs
+ require(masterContract.swappers(swapper), "KashiPair: Invalid swapper");
+
+ // Swaps the users' collateral for the borrowed asset
+ bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);
+ swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);
+
+ uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));
+ uint256 extraShare = returnedShare.sub(allBorrowShare);
+ uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee
+ // solhint-disable-next-line reentrancy
+ bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);
+ totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());
+ emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);
+ } else {
+ // Swap using a swapper freely chosen by the caller
+ // Open (flash) liquidation: get proceeds first and provide the borrow after
+ bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);
+ if (swapper != ISwapper(0)) {
+ swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);
+ }
+
+ bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);
+ totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());
+ }
+ }
+
+ /// @notice Withdraws the fees accumulated.
+ function withdrawFees() public {
+ accrue();
+ address _feeTo = masterContract.feeTo();
+ uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;
+ balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);
+ accrueInfo.feesEarnedFraction = 0;
+
+ emit LogWithdrawFees(_feeTo, _feesEarnedFraction);
+ }
+
+ /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.
+ /// MasterContract Only Admin function.
+ /// @param swapper The address of the swapper contract that conforms to `ISwapper`.
+ /// @param enable True to enable the swapper. To disable use False.
+ function setSwapper(ISwapper swapper, bool enable) public onlyOwner {
+ swappers[swapper] = enable;
+ }
+
+ /// @notice Sets the beneficiary of fees accrued in liquidations.
+ /// MasterContract Only Admin function.
+ /// @param newFeeTo The address of the receiver.
+ function setFeeTo(address newFeeTo) public onlyOwner {
+ feeTo = newFeeTo;
+ emit LogFeeTo(newFeeTo);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/bentobox/PeggedOracleV1.sol b/omgx_examples/sushi/contracts/bentobox/PeggedOracleV1.sol
new file mode 100644
index 000000000000..bf8ae8268d77
--- /dev/null
+++ b/omgx_examples/sushi/contracts/bentobox/PeggedOracleV1.sol
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+
+// File contracts/interfaces/IOracle.sol
+// License-Identifier: MIT
+
+interface IOracle {
+ /// @notice Get the latest exchange rate.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function get(bytes calldata data) external returns (bool success, uint256 rate);
+
+ /// @notice Check the last exchange rate without any state changes.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peek(bytes calldata data) external view returns (bool success, uint256 rate);
+
+ /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peekSpot(bytes calldata data) external view returns (uint256 rate);
+
+ /// @notice Returns a human readable (short) name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable symbol name about this oracle.
+ function symbol(bytes calldata data) external view returns (string memory);
+
+ /// @notice Returns a human readable name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable name about this oracle.
+ function name(bytes calldata data) external view returns (string memory);
+}
+
+// File contracts/oracles/PeggedOracle.sol
+// License-Identifier: MIT
+
+/// @title PeggedOracle
+/// @author BoringCrypto
+/// @notice Oracle used for pegged prices that don't change
+/// @dev
+contract PeggedOracleV1 is IOracle {
+ /// @notice
+ /// @dev
+ /// @param rate (uint256) The fixed exchange rate
+ /// @return (bytes)
+ function getDataParameter(uint256 rate) public pure returns (bytes memory) {
+ return abi.encode(rate);
+ }
+
+ // Get the exchange rate
+ /// @inheritdoc IOracle
+ function get(bytes calldata data) public override returns (bool, uint256) {
+ uint256 rate = abi.decode(data, (uint256));
+ return (rate != 0, rate);
+ }
+
+ // Check the exchange rate without any state changes
+ /// @inheritdoc IOracle
+ function peek(bytes calldata data) public view override returns (bool, uint256) {
+ uint256 rate = abi.decode(data, (uint256));
+ return (rate != 0, rate);
+ }
+
+ // Check the current spot exchange rate without any state changes
+ /// @inheritdoc IOracle
+ function peekSpot(bytes calldata data) external view override returns (uint256 rate) {
+ (, rate) = peek(data);
+ }
+
+ /// @inheritdoc IOracle
+ function name(bytes calldata) public view override returns (string memory) {
+ return "Pegged";
+ }
+
+ /// @inheritdoc IOracle
+ function symbol(bytes calldata) public view override returns (string memory) {
+ return "PEG";
+ }
+}
diff --git a/omgx_examples/sushi/contracts/governance/Timelock.sol b/omgx_examples/sushi/contracts/governance/Timelock.sol
new file mode 100644
index 000000000000..b187b3679627
--- /dev/null
+++ b/omgx_examples/sushi/contracts/governance/Timelock.sol
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: MIT
+
+// COPIED FROM https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/GovernorAlpha.sol
+// Copyright 2020 Compound Labs, Inc.
+// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Ctrl+f for XXX to see all the modifications.
+
+// XXX: pragma solidity ^0.5.16;
+pragma solidity 0.6.12;
+
+// XXX: import "./SafeMath.sol";
+import "@openzeppelin/contracts/math/SafeMath.sol";
+
+contract Timelock {
+ using SafeMath for uint;
+
+ event NewAdmin(address indexed newAdmin);
+ event NewPendingAdmin(address indexed newPendingAdmin);
+ event NewDelay(uint indexed newDelay);
+ event CancelTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);
+ event ExecuteTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);
+ event QueueTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);
+
+ uint public constant GRACE_PERIOD = 14 days;
+ uint public constant MINIMUM_DELAY = 2 days;
+ uint public constant MAXIMUM_DELAY = 30 days;
+
+ address public admin;
+ address public pendingAdmin;
+ uint public delay;
+ bool public admin_initialized;
+
+ mapping (bytes32 => bool) public queuedTransactions;
+
+
+ constructor(address admin_, uint delay_) public {
+ require(delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay.");
+ require(delay_ <= MAXIMUM_DELAY, "Timelock::constructor: Delay must not exceed maximum delay.");
+
+ admin = admin_;
+ delay = delay_;
+ admin_initialized = false;
+ }
+
+ // XXX: function() external payable { }
+ receive() external payable { }
+
+ function setDelay(uint delay_) public {
+ require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock.");
+ require(delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay.");
+ require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay.");
+ delay = delay_;
+
+ emit NewDelay(delay);
+ }
+
+ function acceptAdmin() public {
+ require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin.");
+ admin = msg.sender;
+ pendingAdmin = address(0);
+
+ emit NewAdmin(admin);
+ }
+
+ function setPendingAdmin(address pendingAdmin_) public {
+ // allows one time setting of admin for deployment purposes
+ if (admin_initialized) {
+ require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock.");
+ } else {
+ require(msg.sender == admin, "Timelock::setPendingAdmin: First call must come from admin.");
+ admin_initialized = true;
+ }
+ pendingAdmin = pendingAdmin_;
+
+ emit NewPendingAdmin(pendingAdmin);
+ }
+
+ function queueTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public returns (bytes32) {
+ require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin.");
+ require(eta >= getBlockTimestamp().add(delay), "Timelock::queueTransaction: Estimated execution block must satisfy delay.");
+
+ bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
+ queuedTransactions[txHash] = true;
+
+ emit QueueTransaction(txHash, target, value, signature, data, eta);
+ return txHash;
+ }
+
+ function cancelTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public {
+ require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin.");
+
+ bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
+ queuedTransactions[txHash] = false;
+
+ emit CancelTransaction(txHash, target, value, signature, data, eta);
+ }
+
+ function executeTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public payable returns (bytes memory) {
+ require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin.");
+
+ bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
+ require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued.");
+ require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock.");
+ require(getBlockTimestamp() <= eta.add(GRACE_PERIOD), "Timelock::executeTransaction: Transaction is stale.");
+
+ queuedTransactions[txHash] = false;
+
+ bytes memory callData;
+
+ if (bytes(signature).length == 0) {
+ callData = data;
+ } else {
+ callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
+ }
+
+ // CHANGE_OMGX
+ // solium-disable-next-line security/no-call-value
+ // (bool success, bytes memory returnData) = target.call.value(value)(callData);
+
+ // The following syntax is deprecated:
+ // f.gas(...)(), f.value(...)() and (new C).value(...)().
+
+ // Replace these calls by
+ // f{gas: ..., value: ...}() and (new C){value: ...}().
+
+
+ (bool success, bytes memory returnData) = target.call{value:value}(callData);
+ require(success, "Timelock::executeTransaction: Transaction execution reverted.");
+
+ emit ExecuteTransaction(txHash, target, value, signature, data, eta);
+
+ return returnData;
+ }
+
+ function getBlockTimestamp() internal view returns (uint) {
+ // solium-disable-next-line security/no-block-members
+ return block.timestamp;
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/interfaces/IERC20.sol b/omgx_examples/sushi/contracts/interfaces/IERC20.sol
new file mode 100644
index 000000000000..658dd3047af9
--- /dev/null
+++ b/omgx_examples/sushi/contracts/interfaces/IERC20.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+
+interface IERC20 {
+ function totalSupply() external view returns (uint256);
+ function balanceOf(address account) external view returns (uint256);
+ function allowance(address owner, address spender) external view returns (uint256);
+ function approve(address spender, uint256 amount) external returns (bool);
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ // EIP 2612
+ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/interfaces/IMasterChef.sol b/omgx_examples/sushi/contracts/interfaces/IMasterChef.sol
new file mode 100644
index 000000000000..a233bfe9b224
--- /dev/null
+++ b/omgx_examples/sushi/contracts/interfaces/IMasterChef.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+
+interface IMasterChef {
+ using BoringERC20 for IERC20;
+ struct UserInfo {
+ uint256 amount; // How many LP tokens the user has provided.
+ uint256 rewardDebt; // Reward debt. See explanation below.
+ }
+
+ struct PoolInfo {
+ IERC20 lpToken; // Address of LP token contract.
+ uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.
+ uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.
+ uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.
+ }
+
+ function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);
+ function totalAllocPoint() external view returns (uint256);
+ function deposit(uint256 _pid, uint256 _amount) external;
+}
diff --git a/omgx_examples/sushi/contracts/interfaces/IRewarder.sol b/omgx_examples/sushi/contracts/interfaces/IRewarder.sol
new file mode 100644
index 000000000000..d6c0f520663c
--- /dev/null
+++ b/omgx_examples/sushi/contracts/interfaces/IRewarder.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+interface IRewarder {
+ using BoringERC20 for IERC20;
+ function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;
+ // CHANGE_OMGX
+ function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory);
+}
diff --git a/omgx_examples/sushi/contracts/libraries/SafeERC20.sol b/omgx_examples/sushi/contracts/libraries/SafeERC20.sol
new file mode 100644
index 000000000000..2f550e280620
--- /dev/null
+++ b/omgx_examples/sushi/contracts/libraries/SafeERC20.sol
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+
+import "../interfaces/IERC20.sol";
+
+library SafeERC20 {
+ function safeSymbol(IERC20 token) internal view returns(string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
+ return success && data.length > 0 ? abi.decode(data, (string)) : "???";
+ }
+
+ function safeName(IERC20 token) internal view returns(string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
+ return success && data.length > 0 ? abi.decode(data, (string)) : "???";
+ }
+
+ function safeDecimals(IERC20 token) public view returns (uint8) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
+ return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
+ }
+
+ function safeTransfer(IERC20 token, address to, uint256 amount) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: Transfer failed");
+ }
+
+ function safeTransferFrom(IERC20 token, address from, uint256 amount) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, address(this), amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: TransferFrom failed");
+ }
+}
diff --git a/omgx_examples/sushi/contracts/libraries/SafeMath.sol b/omgx_examples/sushi/contracts/libraries/SafeMath.sol
new file mode 100644
index 000000000000..51152c1dbf62
--- /dev/null
+++ b/omgx_examples/sushi/contracts/libraries/SafeMath.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
+library SafeMath {
+ function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "SafeMath: Add Overflow");}
+ function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "SafeMath: Underflow");}
+ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "SafeMath: Mul Overflow");}
+ function to128(uint256 a) internal pure returns (uint128 c) {
+ require(a <= uint128(-1), "SafeMath: uint128 Overflow");
+ c = uint128(a);
+ }
+}
+
+library SafeMath128 {
+ function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "SafeMath: Add Overflow");}
+ function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "SafeMath: Underflow");}
+}
diff --git a/omgx_examples/sushi/contracts/libraries/SignedSafeMath.sol b/omgx_examples/sushi/contracts/libraries/SignedSafeMath.sol
new file mode 100644
index 000000000000..4076f10c9459
--- /dev/null
+++ b/omgx_examples/sushi/contracts/libraries/SignedSafeMath.sol
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+library SignedSafeMath {
+ int256 constant private _INT256_MIN = -2**255;
+
+ /**
+ * @dev Returns the multiplication of two signed integers, reverting on
+ * overflow.
+ *
+ * Counterpart to Solidity's `*` operator.
+ *
+ * Requirements:
+ *
+ * - Multiplication cannot overflow.
+ */
+ function mul(int256 a, int256 b) internal pure returns (int256) {
+ // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
+ // benefit is lost if 'b' is also tested.
+ // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
+ if (a == 0) {
+ return 0;
+ }
+
+ require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
+
+ int256 c = a * b;
+ require(c / a == b, "SignedSafeMath: multiplication overflow");
+
+ return c;
+ }
+
+ /**
+ * @dev Returns the integer division of two signed integers. Reverts on
+ * division by zero. The result is rounded towards zero.
+ *
+ * Counterpart to Solidity's `/` operator. Note: this function uses a
+ * `revert` opcode (which leaves remaining gas untouched) while Solidity
+ * uses an invalid opcode to revert (consuming all remaining gas).
+ *
+ * Requirements:
+ *
+ * - The divisor cannot be zero.
+ */
+ function div(int256 a, int256 b) internal pure returns (int256) {
+ require(b != 0, "SignedSafeMath: division by zero");
+ require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
+
+ int256 c = a / b;
+
+ return c;
+ }
+
+ /**
+ * @dev Returns the subtraction of two signed integers, reverting on
+ * overflow.
+ *
+ * Counterpart to Solidity's `-` operator.
+ *
+ * Requirements:
+ *
+ * - Subtraction cannot overflow.
+ */
+ function sub(int256 a, int256 b) internal pure returns (int256) {
+ int256 c = a - b;
+ require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
+
+ return c;
+ }
+
+ /**
+ * @dev Returns the addition of two signed integers, reverting on
+ * overflow.
+ *
+ * Counterpart to Solidity's `+` operator.
+ *
+ * Requirements:
+ *
+ * - Addition cannot overflow.
+ */
+ function add(int256 a, int256 b) internal pure returns (int256) {
+ int256 c = a + b;
+ require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
+
+ return c;
+ }
+
+ function toUInt256(int256 a) internal pure returns (uint256) {
+ require(a >= 0, "Integer < 0");
+ return uint256(a);
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/ComplexRewarder.sol b/omgx_examples/sushi/contracts/mocks/ComplexRewarder.sol
new file mode 100644
index 000000000000..2ba14fda7ce7
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/ComplexRewarder.sol
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+import "../interfaces/IRewarder.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "../MasterChefV2.sol";
+
+/// @author @0xKeno
+contract ComplexRewarder is IRewarder, BoringOwnable{
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+
+ IERC20 private immutable rewardToken;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardBlock;
+ uint64 allocPoint;
+ }
+
+ /// @notice Info of each pool.
+ mapping (uint256 => PoolInfo) public poolInfo;
+
+ uint256[] public poolIds;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 totalAllocPoint;
+
+ uint256 public tokenPerBlock;
+ uint256 private constant ACC_TOKEN_PRECISION = 1e12;
+
+ address private immutable MASTERCHEF_V2;
+
+ event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogInit();
+
+ constructor (IERC20 _rewardToken, uint256 _tokenPerBlock, address _MASTERCHEF_V2) public {
+ rewardToken = _rewardToken;
+ tokenPerBlock = _tokenPerBlock;
+ MASTERCHEF_V2 = _MASTERCHEF_V2;
+ }
+
+
+ function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][_user];
+ uint256 pending;
+ if (user.amount > 0) {
+ pending =
+ (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub(
+ user.rewardDebt
+ );
+ rewardToken.safeTransfer(to, pending);
+ }
+ user.amount = lpToken;
+ user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION;
+ emit LogOnReward(_user, pid, pending, to);
+ }
+
+ // CHANGE_OMGX
+ function pendingTokens(uint256 pid, address user, uint256) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {
+ IERC20[] memory _rewardTokens = new IERC20[](1);
+ _rewardTokens[0] = (rewardToken);
+ uint256[] memory _rewardAmounts = new uint256[](1);
+ _rewardAmounts[0] = pendingToken(pid, user);
+ return (_rewardTokens, _rewardAmounts);
+ }
+
+ modifier onlyMCV2 {
+ require(
+ msg.sender == MASTERCHEF_V2,
+ "Only MCV2 can call this function."
+ );
+ _;
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolIds.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _pid Pid on MCV2
+ function add(uint256 allocPoint, uint256 _pid) public onlyOwner {
+ require(poolInfo[_pid].lastRewardBlock == 0, "Pool already exists");
+ uint256 lastRewardBlock = block.number;
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+
+ poolInfo[_pid] = PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardBlock: lastRewardBlock.to64(),
+ accSushiPerShare: 0
+ });
+ poolIds.push(_pid);
+ emit LogPoolAddition(_pid, allocPoint);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ function set(uint256 _pid, uint256 _allocPoint) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ emit LogSetPool(_pid, _allocPoint);
+ }
+
+ /// @notice View function to see pending Token
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2);
+ if (block.number > pool.lastRewardBlock && lpSupply != 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply);
+ }
+ pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt);
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.number > pool.lastRewardBlock) {
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2);
+
+ if (lpSupply > 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardBlock = block.number.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/ComplexRewarderTime.sol b/omgx_examples/sushi/contracts/mocks/ComplexRewarderTime.sol
new file mode 100644
index 000000000000..91b10a71f63e
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/ComplexRewarderTime.sol
@@ -0,0 +1,182 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+import "../interfaces/IRewarder.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "../MasterChefV2.sol";
+
+/// @author @0xKeno
+contract ComplexRewarderTime is IRewarder, BoringOwnable{
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+
+ IERC20 private immutable rewardToken;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardTime;
+ uint64 allocPoint;
+ }
+
+ /// @notice Info of each pool.
+ mapping (uint256 => PoolInfo) public poolInfo;
+
+ uint256[] public poolIds;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 totalAllocPoint;
+
+ uint256 public rewardPerSecond;
+ uint256 private constant ACC_TOKEN_PRECISION = 1e12;
+
+ address private immutable MASTERCHEF_V2;
+
+ event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogRewardPerSecond(uint256 rewardPerSecond);
+ event LogInit();
+
+ constructor (IERC20 _rewardToken, uint256 _rewardPerSecond, address _MASTERCHEF_V2) public {
+ rewardToken = _rewardToken;
+ rewardPerSecond = _rewardPerSecond;
+ MASTERCHEF_V2 = _MASTERCHEF_V2;
+ }
+
+
+ function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][_user];
+ uint256 pending;
+ if (user.amount > 0) {
+ pending =
+ (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub(
+ user.rewardDebt
+ );
+ rewardToken.safeTransfer(to, pending);
+ }
+ user.amount = lpToken;
+ user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION;
+ emit LogOnReward(_user, pid, pending, to);
+ }
+
+ // CHANGE_OMGX
+ function pendingTokens(uint256 pid, address user, uint256) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {
+ IERC20[] memory _rewardTokens = new IERC20[](1);
+ _rewardTokens[0] = (rewardToken);
+ uint256[] memory _rewardAmounts = new uint256[](1);
+ _rewardAmounts[0] = pendingToken(pid, user);
+ return (_rewardTokens, _rewardAmounts);
+ }
+
+ /// @notice Sets the sushi per second to be distributed. Can only be called by the owner.
+ /// @param _rewardPerSecond The amount of Sushi to be distributed per second.
+ function setRewardPerSecond(uint256 _rewardPerSecond) public onlyOwner {
+ rewardPerSecond = _rewardPerSecond;
+ emit LogRewardPerSecond(_rewardPerSecond);
+ }
+
+ modifier onlyMCV2 {
+ require(
+ msg.sender == MASTERCHEF_V2,
+ "Only MCV2 can call this function."
+ );
+ _;
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolIds.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _pid Pid on MCV2
+ function add(uint256 allocPoint, uint256 _pid) public onlyOwner {
+ require(poolInfo[_pid].lastRewardTime == 0, "Pool already exists");
+ uint256 lastRewardTime = block.timestamp;
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+
+ poolInfo[_pid] = PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardTime: lastRewardTime.to64(),
+ accSushiPerShare: 0
+ });
+ poolIds.push(_pid);
+ emit LogPoolAddition(_pid, allocPoint);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ function set(uint256 _pid, uint256 _allocPoint) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ emit LogSetPool(_pid, _allocPoint);
+ }
+
+ /// @notice View function to see pending Token
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2);
+ if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply);
+ }
+ pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt);
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.timestamp > pool.lastRewardTime) {
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2);
+
+ if (lpSupply > 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardTime = block.timestamp.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+}
diff --git a/omgx_examples/sushi/contracts/mocks/ERC20Mock.sol b/omgx_examples/sushi/contracts/mocks/ERC20Mock.sol
new file mode 100644
index 000000000000..4520a8d0aa8d
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/ERC20Mock.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+contract ERC20Mock is ERC20 {
+ constructor(
+ string memory name,
+ string memory symbol,
+ uint256 supply
+ ) public ERC20(name, symbol) {
+ _mint(msg.sender, supply);
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/RewarderBrokenMock.sol b/omgx_examples/sushi/contracts/mocks/RewarderBrokenMock.sol
new file mode 100644
index 000000000000..01bdd098b72b
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/RewarderBrokenMock.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "../interfaces/IRewarder.sol";
+
+
+contract RewarderBrokenMock is IRewarder {
+
+ function onSushiReward (uint256, address, address, uint256, uint256) override external {
+ revert();
+ }
+
+ function pendingTokens(uint256 pid, address user, uint256 sushiAmount) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts){
+ revert();
+ }
+
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/RewarderMock.sol b/omgx_examples/sushi/contracts/mocks/RewarderMock.sol
new file mode 100644
index 000000000000..51fb40be7f7d
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/RewarderMock.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "../interfaces/IRewarder.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+
+
+contract RewarderMock is IRewarder {
+ using BoringMath for uint256;
+ using BoringERC20 for IERC20;
+ uint256 private immutable rewardMultiplier;
+ IERC20 private immutable rewardToken;
+ uint256 private constant REWARD_TOKEN_DIVISOR = 1e18;
+ address private immutable MASTERCHEF_V2;
+
+ constructor (uint256 _rewardMultiplier, IERC20 _rewardToken, address _MASTERCHEF_V2) public {
+ rewardMultiplier = _rewardMultiplier;
+ rewardToken = _rewardToken;
+ MASTERCHEF_V2 = _MASTERCHEF_V2;
+ }
+
+ function onSushiReward (uint256, address user, address to, uint256 sushiAmount, uint256) onlyMCV2 override external {
+ uint256 pendingReward = sushiAmount.mul(rewardMultiplier) / REWARD_TOKEN_DIVISOR;
+ uint256 rewardBal = rewardToken.balanceOf(address(this));
+ if (pendingReward > rewardBal) {
+ rewardToken.safeTransfer(to, rewardBal);
+ } else {
+ rewardToken.safeTransfer(to, pendingReward);
+ }
+ }
+
+ function pendingTokens(uint256 pid, address user, uint256 sushiAmount) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {
+ IERC20[] memory _rewardTokens = new IERC20[](1);
+ _rewardTokens[0] = (rewardToken);
+ uint256[] memory _rewardAmounts = new uint256[](1);
+ _rewardAmounts[0] = sushiAmount.mul(rewardMultiplier) / REWARD_TOKEN_DIVISOR;
+ return (_rewardTokens, _rewardAmounts);
+ }
+
+ modifier onlyMCV2 {
+ require(
+ msg.sender == MASTERCHEF_V2,
+ "Only MCV2 can call this function."
+ );
+ _;
+ }
+
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/SushiMakerExploitMock.sol b/omgx_examples/sushi/contracts/mocks/SushiMakerExploitMock.sol
new file mode 100644
index 000000000000..91f9e6265cd9
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/SushiMakerExploitMock.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../SushiMaker.sol";
+
+contract SushiMakerExploitMock {
+ SushiMaker public immutable sushiMaker;
+ constructor (address _sushiMaker) public{
+ sushiMaker = SushiMaker(_sushiMaker);
+ }
+ function convert(address token0, address token1) external {
+ sushiMaker.convert(token0, token1);
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/SushiMakerKashiExploitMock.sol b/omgx_examples/sushi/contracts/mocks/SushiMakerKashiExploitMock.sol
new file mode 100644
index 000000000000..c78d244bb109
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/SushiMakerKashiExploitMock.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../SushiMakerKashi.sol";
+
+contract SushiMakerKashiExploitMock {
+ SushiMakerKashi public immutable sushiMaker;
+
+ constructor(address _sushiMaker) public {
+ sushiMaker = SushiMakerKashi(_sushiMaker);
+ }
+
+ function convert(IKashiWithdrawFee kashiPair) external {
+ sushiMaker.convert(kashiPair);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/mocks/SushiSwapFactoryMock.sol b/omgx_examples/sushi/contracts/mocks/SushiSwapFactoryMock.sol
new file mode 100644
index 000000000000..38b3d092d964
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/SushiSwapFactoryMock.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../uniswapv2/UniswapV2Factory.sol";
+
+contract SushiSwapFactoryMock is UniswapV2Factory {
+ constructor(address _feeToSetter) public UniswapV2Factory(_feeToSetter) {}
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/SushiSwapPairMock.sol b/omgx_examples/sushi/contracts/mocks/SushiSwapPairMock.sol
new file mode 100644
index 000000000000..cd0a80806574
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/SushiSwapPairMock.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../uniswapv2/UniswapV2Pair.sol";
+
+contract SushiSwapPairMock is UniswapV2Pair {
+ constructor() public UniswapV2Pair() {}
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/mocks/WETH9Mock.sol b/omgx_examples/sushi/contracts/mocks/WETH9Mock.sol
new file mode 100644
index 000000000000..c90bcfebe91d
--- /dev/null
+++ b/omgx_examples/sushi/contracts/mocks/WETH9Mock.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+// CHANGE_OMGX
+// contract WETH9Mock {
+// string public name = "Wrapped Ether";
+// string public symbol = "WETH";
+// uint8 public decimals = 18;
+
+// event Approval(address indexed src, address indexed guy, uint256 wad);
+// event Transfer(address indexed src, address indexed dst, uint256 wad);
+// event Deposit(address indexed dst, uint256 wad);
+// event Withdrawal(address indexed src, uint256 wad);
+
+// mapping(address => uint256) public balanceOf;
+// mapping(address => mapping(address => uint256)) public allowance;
+
+// function deposit() public payable {
+// balanceOf[msg.sender] += msg.value;
+// emit Deposit(msg.sender, msg.value);
+// }
+
+// function withdraw(uint256 wad) public {
+// require(balanceOf[msg.sender] >= wad, "WETH9: Error");
+// balanceOf[msg.sender] -= wad;
+// msg.sender.transfer(wad);
+// emit Withdrawal(msg.sender, wad);
+// }
+
+// function totalSupply() public view returns (uint256) {
+// return address(this).balance;
+// }
+
+// function approve(address guy, uint256 wad) public returns (bool) {
+// allowance[msg.sender][guy] = wad;
+// emit Approval(msg.sender, guy, wad);
+// return true;
+// }
+
+// function transfer(address dst, uint256 wad) public returns (bool) {
+// return transferFrom(msg.sender, dst, wad);
+// }
+
+// function transferFrom(
+// address src,
+// address dst,
+// uint256 wad
+// ) public returns (bool) {
+// require(balanceOf[src] >= wad, "WETH9: Error");
+
+// if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) {
+// require(allowance[src][msg.sender] >= wad, "WETH9: Error");
+// allowance[src][msg.sender] -= wad;
+// }
+
+// balanceOf[src] -= wad;
+// balanceOf[dst] += wad;
+
+// emit Transfer(src, dst, wad);
+
+// return true;
+// }
+// }
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/uniswapv2/LICENSE b/omgx_examples/sushi/contracts/uniswapv2/LICENSE
new file mode 100644
index 000000000000..f288702d2fa1
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/omgx_examples/sushi/contracts/uniswapv2/README.md b/omgx_examples/sushi/contracts/uniswapv2/README.md
new file mode 100644
index 000000000000..ffa15f4b06cd
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/README.md
@@ -0,0 +1,13 @@
+# Uniswap V2 Area
+
+Code from [Uniswap V2](https://github.com/Uniswap/uniswap-v2-core/tree/27f6354bae6685612c182c3bc7577e61bc8717e3/contracts) with the following modifications.
+
+1. Change contract version to 0.6.12 and do the necessary patching.
+2. Add `migrator` member in `UniswapV2Factory` which can be set by `feeToSetter`.
+3. Allow `migrator` to specify the amount of `liquidity` during the first mint. Disallow first mint if migrator is set.
+
+To see all diffs:
+
+```
+$ git diff 4c4bf551417e3df09a25aa0dbb6941cccbbac11a .
+```
\ No newline at end of file
diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2ERC20.sol
similarity index 68%
rename from packages/contracts/contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol
rename to omgx_examples/sushi/contracts/uniswapv2/UniswapV2ERC20.sol
index 303d53484bd5..7ed393cd4205 100644
--- a/packages/contracts/contracts/optimistic-ethereum/libraries/standards/UniswapV2ERC20.sol
+++ b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2ERC20.sol
@@ -1,31 +1,28 @@
-// SPDX-License-Identifier: MIT
-pragma solidity >=0.5.16 <0.8.0;
+// SPDX-License-Identifier: GPL-3.0
-import './IUniswapV2ERC20.sol';
-import './UniSafeMath.sol';
+pragma solidity =0.6.12;
-contract UniswapV2ERC20 is IUniswapV2ERC20 {
- using UniSafeMath for uint;
+import './libraries/SafeMath.sol';
- string public override name;
- string public override symbol;
- uint8 public constant override decimals = 18;
- uint public override totalSupply;
- mapping(address => uint) public override balanceOf;
- mapping(address => mapping(address => uint)) public override allowance;
+contract UniswapV2ERC20 {
+ using SafeMathUniswap for uint;
- bytes32 public override DOMAIN_SEPARATOR;
+ string public constant name = 'SushiSwap LP Token';
+ string public constant symbol = 'SLP';
+ uint8 public constant decimals = 18;
+ uint public totalSupply;
+ mapping(address => uint) public balanceOf;
+ mapping(address => mapping(address => uint)) public allowance;
+
+ bytes32 public DOMAIN_SEPARATOR;
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
- bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
- mapping(address => uint) public override nonces;
+ bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
+ mapping(address => uint) public nonces;
- constructor(
- string memory _name,
- string memory _symbol
- ) {
- name = _name;
- symbol = _symbol;
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+ constructor() public {
uint chainId;
assembly {
chainId := chainid()
@@ -64,17 +61,17 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
emit Transfer(from, to, value);
}
- function approve(address spender, uint value) external override returns (bool) {
+ function approve(address spender, uint value) external returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
- function transfer(address to, uint value) external override returns (bool) {
+ function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
- function transferFrom(address from, address to, uint value) external override returns (bool) {
+ function transferFrom(address from, address to, uint value) external returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
}
@@ -82,7 +79,7 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
return true;
}
- function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
+ function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
bytes32 digest = keccak256(
abi.encodePacked(
diff --git a/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Factory.sol b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Factory.sol
new file mode 100644
index 000000000000..f0a56fc279b7
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Factory.sol
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './interfaces/IUniswapV2Factory.sol';
+import './UniswapV2Pair.sol';
+
+contract UniswapV2Factory is IUniswapV2Factory {
+ address public override feeTo;
+ address public override feeToSetter;
+ address public override migrator;
+
+ mapping(address => mapping(address => address)) public override getPair;
+ address[] public override allPairs;
+
+ event PairCreated(address indexed token0, address indexed token1, address pair, uint);
+
+ constructor(address _feeToSetter) public {
+ feeToSetter = _feeToSetter;
+ }
+
+ function allPairsLength() external override view returns (uint) {
+ return allPairs.length;
+ }
+
+ function pairCodeHash() external pure returns (bytes32) {
+ return keccak256(type(UniswapV2Pair).creationCode);
+ }
+
+ function createPair(address tokenA, address tokenB) external override returns (address pair) {
+ require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
+ (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
+ require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
+ require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
+ bytes memory bytecode = type(UniswapV2Pair).creationCode;
+ bytes32 salt = keccak256(abi.encodePacked(token0, token1));
+ assembly {
+ pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
+ }
+ UniswapV2Pair(pair).initialize(token0, token1);
+ getPair[token0][token1] = pair;
+ getPair[token1][token0] = pair; // populate mapping in the reverse direction
+ allPairs.push(pair);
+ emit PairCreated(token0, token1, pair, allPairs.length);
+ }
+
+ function setFeeTo(address _feeTo) external override {
+ require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
+ feeTo = _feeTo;
+ }
+
+ function setMigrator(address _migrator) external override {
+ require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
+ migrator = _migrator;
+ }
+
+ function setFeeToSetter(address _feeToSetter) external override {
+ require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
+ feeToSetter = _feeToSetter;
+ }
+
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Pair.sol b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Pair.sol
new file mode 100644
index 000000000000..408cde6cf9a3
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Pair.sol
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './UniswapV2ERC20.sol';
+import './libraries/Math.sol';
+import './libraries/UQ112x112.sol';
+import './interfaces/IERC20.sol';
+import './interfaces/IUniswapV2Factory.sol';
+import './interfaces/IUniswapV2Callee.sol';
+
+interface IMigrator {
+ // Return the desired amount of liquidity token that the migrator wants.
+ function desiredLiquidity() external view returns (uint256);
+}
+
+contract UniswapV2Pair is UniswapV2ERC20 {
+ using SafeMathUniswap for uint;
+ using UQ112x112 for uint224;
+
+ uint public constant MINIMUM_LIQUIDITY = 10**3;
+ bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
+
+ address public factory;
+ address public token0;
+ address public token1;
+
+ uint112 private reserve0; // uses single storage slot, accessible via getReserves
+ uint112 private reserve1; // uses single storage slot, accessible via getReserves
+ uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves
+
+ uint public price0CumulativeLast;
+ uint public price1CumulativeLast;
+ uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event
+
+ uint private unlocked = 1;
+ modifier lock() {
+ require(unlocked == 1, 'UniswapV2: LOCKED');
+ unlocked = 0;
+ _;
+ unlocked = 1;
+ }
+
+ function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
+ _reserve0 = reserve0;
+ _reserve1 = reserve1;
+ _blockTimestampLast = blockTimestampLast;
+ }
+
+ function _safeTransfer(address token, address to, uint value) private {
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
+ }
+
+ event Mint(address indexed sender, uint amount0, uint amount1);
+ event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
+ event Swap(
+ address indexed sender,
+ uint amount0In,
+ uint amount1In,
+ uint amount0Out,
+ uint amount1Out,
+ address indexed to
+ );
+ event Sync(uint112 reserve0, uint112 reserve1);
+
+ constructor() public {
+ factory = msg.sender;
+ }
+
+ // called once by the factory at time of deployment
+ function initialize(address _token0, address _token1) external {
+ require(msg.sender == factory, 'UniswapV2: FORBIDDEN'); // sufficient check
+ token0 = _token0;
+ token1 = _token1;
+ }
+
+ // update reserves and, on the first call per block, price accumulators
+ function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
+ require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'UniswapV2: OVERFLOW');
+ uint32 blockTimestamp = uint32(block.timestamp % 2**32);
+ uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
+ if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
+ // * never overflows, and + overflow is desired
+ price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
+ price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
+ }
+ reserve0 = uint112(balance0);
+ reserve1 = uint112(balance1);
+ blockTimestampLast = blockTimestamp;
+ emit Sync(reserve0, reserve1);
+ }
+
+ // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
+ function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
+ address feeTo = IUniswapV2Factory(factory).feeTo();
+ feeOn = feeTo != address(0);
+ uint _kLast = kLast; // gas savings
+ if (feeOn) {
+ if (_kLast != 0) {
+ uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
+ uint rootKLast = Math.sqrt(_kLast);
+ if (rootK > rootKLast) {
+ uint numerator = totalSupply.mul(rootK.sub(rootKLast));
+ uint denominator = rootK.mul(5).add(rootKLast);
+ uint liquidity = numerator / denominator;
+ if (liquidity > 0) _mint(feeTo, liquidity);
+ }
+ }
+ } else if (_kLast != 0) {
+ kLast = 0;
+ }
+ }
+
+ // this low-level function should be called from a contract which performs important safety checks
+ function mint(address to) external lock returns (uint liquidity) {
+ (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
+ uint balance0 = IERC20Uniswap(token0).balanceOf(address(this));
+ uint balance1 = IERC20Uniswap(token1).balanceOf(address(this));
+ uint amount0 = balance0.sub(_reserve0);
+ uint amount1 = balance1.sub(_reserve1);
+
+ bool feeOn = _mintFee(_reserve0, _reserve1);
+ uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
+ if (_totalSupply == 0) {
+ address migrator = IUniswapV2Factory(factory).migrator();
+ if (msg.sender == migrator) {
+ liquidity = IMigrator(migrator).desiredLiquidity();
+ require(liquidity > 0 && liquidity != uint256(-1), "Bad desired liquidity");
+ } else {
+ require(migrator == address(0), "Must not have migrator");
+ liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
+ _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
+ }
+ } else {
+ liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
+ }
+ require(liquidity > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED');
+ _mint(to, liquidity);
+
+ _update(balance0, balance1, _reserve0, _reserve1);
+ if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
+ emit Mint(msg.sender, amount0, amount1);
+ }
+
+ // this low-level function should be called from a contract which performs important safety checks
+ function burn(address to) external lock returns (uint amount0, uint amount1) {
+ (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
+ address _token0 = token0; // gas savings
+ address _token1 = token1; // gas savings
+ uint balance0 = IERC20Uniswap(_token0).balanceOf(address(this));
+ uint balance1 = IERC20Uniswap(_token1).balanceOf(address(this));
+ uint liquidity = balanceOf[address(this)];
+
+ bool feeOn = _mintFee(_reserve0, _reserve1);
+ uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
+ amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
+ amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
+ require(amount0 > 0 && amount1 > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED');
+ _burn(address(this), liquidity);
+ _safeTransfer(_token0, to, amount0);
+ _safeTransfer(_token1, to, amount1);
+ balance0 = IERC20Uniswap(_token0).balanceOf(address(this));
+ balance1 = IERC20Uniswap(_token1).balanceOf(address(this));
+
+ _update(balance0, balance1, _reserve0, _reserve1);
+ if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
+ emit Burn(msg.sender, amount0, amount1, to);
+ }
+
+ // this low-level function should be called from a contract which performs important safety checks
+ function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
+ require(amount0Out > 0 || amount1Out > 0, 'UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT');
+ (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
+ require(amount0Out < _reserve0 && amount1Out < _reserve1, 'UniswapV2: INSUFFICIENT_LIQUIDITY');
+
+ uint balance0;
+ uint balance1;
+ { // scope for _token{0,1}, avoids stack too deep errors
+ address _token0 = token0;
+ address _token1 = token1;
+ require(to != _token0 && to != _token1, 'UniswapV2: INVALID_TO');
+ if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
+ if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
+ if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
+ balance0 = IERC20Uniswap(_token0).balanceOf(address(this));
+ balance1 = IERC20Uniswap(_token1).balanceOf(address(this));
+ }
+ uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
+ uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
+ require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');
+ { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
+ uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
+ uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
+ require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
+ }
+
+ _update(balance0, balance1, _reserve0, _reserve1);
+ emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
+ }
+
+ // force balances to match reserves
+ function skim(address to) external lock {
+ address _token0 = token0; // gas savings
+ address _token1 = token1; // gas savings
+ _safeTransfer(_token0, to, IERC20Uniswap(_token0).balanceOf(address(this)).sub(reserve0));
+ _safeTransfer(_token1, to, IERC20Uniswap(_token1).balanceOf(address(this)).sub(reserve1));
+ }
+
+ // force reserves to match balances
+ function sync() external lock {
+ _update(IERC20Uniswap(token0).balanceOf(address(this)), IERC20Uniswap(token1).balanceOf(address(this)), reserve0, reserve1);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Router02.sol b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Router02.sol
new file mode 100644
index 000000000000..663a38d87901
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/UniswapV2Router02.sol
@@ -0,0 +1,460 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './libraries/UniswapV2Library.sol';
+import './libraries/SafeMath.sol';
+import './libraries/TransferHelper.sol';
+import './interfaces/IUniswapV2Router02.sol';
+import './interfaces/IUniswapV2Factory.sol';
+import './interfaces/IERC20.sol';
+import './interfaces/IWETH.sol';
+
+contract UniswapV2Router02 is IUniswapV2Router02 {
+ using SafeMathUniswap for uint;
+
+ address public immutable override factory;
+ // CHANGE_OMGX
+ //address public immutable override WETH;
+
+ modifier ensure(uint deadline) {
+ require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
+ _;
+ }
+
+ constructor(address _factory, address _WETH) public {
+ factory = _factory;
+ // CHANGE_OMGX
+ //WETH = _WETH;
+ }
+
+ // CHANGE_OMGX
+ // receive() external payable {
+ // assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
+ // }
+
+ // **** ADD LIQUIDITY ****
+ function _addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint amountADesired,
+ uint amountBDesired,
+ uint amountAMin,
+ uint amountBMin
+ ) internal virtual returns (uint amountA, uint amountB) {
+ // create the pair if it doesn't exist yet
+ if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
+ IUniswapV2Factory(factory).createPair(tokenA, tokenB);
+ }
+ (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
+ if (reserveA == 0 && reserveB == 0) {
+ (amountA, amountB) = (amountADesired, amountBDesired);
+ } else {
+ uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
+ if (amountBOptimal <= amountBDesired) {
+ require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
+ (amountA, amountB) = (amountADesired, amountBOptimal);
+ } else {
+ uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
+ assert(amountAOptimal <= amountADesired);
+ require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
+ (amountA, amountB) = (amountAOptimal, amountBDesired);
+ }
+ }
+ }
+ function addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint amountADesired,
+ uint amountBDesired,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
+ (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
+ address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
+ TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
+ TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
+ liquidity = IUniswapV2Pair(pair).mint(to);
+ }
+
+ // CHANGE_OMGX
+ // function addLiquidityETH(
+ // address token,
+ // uint amountTokenDesired,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
+ // (amountToken, amountETH) = _addLiquidity(
+ // token,
+ // WETH,
+ // amountTokenDesired,
+ // msg.value,
+ // amountTokenMin,
+ // amountETHMin
+ // );
+ // address pair = UniswapV2Library.pairFor(factory, token, WETH);
+ // TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
+ // IWETH(WETH).deposit{value: amountETH}();
+ // assert(IWETH(WETH).transfer(pair, amountETH));
+ // liquidity = IUniswapV2Pair(pair).mint(to);
+ // // refund dust eth, if any
+ // if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
+ // }
+
+ // **** REMOVE LIQUIDITY ****
+ function removeLiquidity(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
+ address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
+ IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
+ (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
+ (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
+ (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
+ require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
+ require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
+ }
+
+ // CHANGE_OMGX
+ // function removeLiquidityETH(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
+ // (amountToken, amountETH) = removeLiquidity(
+ // token,
+ // WETH,
+ // liquidity,
+ // amountTokenMin,
+ // amountETHMin,
+ // address(this),
+ // deadline
+ // );
+ // TransferHelper.safeTransfer(token, to, amountToken);
+ // IWETH(WETH).withdraw(amountETH);
+ // TransferHelper.safeTransferETH(to, amountETH);
+ // }
+ function removeLiquidityWithPermit(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline,
+ bool approveMax, uint8 v, bytes32 r, bytes32 s
+ ) external virtual override returns (uint amountA, uint amountB) {
+ address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
+ uint value = approveMax ? uint(-1) : liquidity;
+ IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
+ (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
+ }
+
+ // CHANGE_OMGX
+ // function removeLiquidityETHWithPermit(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external virtual override returns (uint amountToken, uint amountETH) {
+ // address pair = UniswapV2Library.pairFor(factory, token, WETH);
+ // uint value = approveMax ? uint(-1) : liquidity;
+ // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
+ // (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
+ // }
+
+ // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
+ // function removeLiquidityETHSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) public virtual override ensure(deadline) returns (uint amountETH) {
+ // (, amountETH) = removeLiquidity(
+ // token,
+ // WETH,
+ // liquidity,
+ // amountTokenMin,
+ // amountETHMin,
+ // address(this),
+ // deadline
+ // );
+ // TransferHelper.safeTransfer(token, to, IERC20Uniswap(token).balanceOf(address(this)));
+ // IWETH(WETH).withdraw(amountETH);
+ // TransferHelper.safeTransferETH(to, amountETH);
+ // }
+ // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external virtual override returns (uint amountETH) {
+ // address pair = UniswapV2Library.pairFor(factory, token, WETH);
+ // uint value = approveMax ? uint(-1) : liquidity;
+ // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
+ // amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
+ // token, liquidity, amountTokenMin, amountETHMin, to, deadline
+ // );
+ // }
+
+ // **** SWAP ****
+ // requires the initial amount to have already been sent to the first pair
+ function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
+ for (uint i; i < path.length - 1; i++) {
+ (address input, address output) = (path[i], path[i + 1]);
+ (address token0,) = UniswapV2Library.sortTokens(input, output);
+ uint amountOut = amounts[i + 1];
+ (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
+ address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
+ IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
+ amount0Out, amount1Out, to, new bytes(0)
+ );
+ }
+ }
+ function swapExactTokensForTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
+ amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
+ require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ TransferHelper.safeTransferFrom(
+ path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ );
+ _swap(amounts, path, to);
+ }
+ function swapTokensForExactTokens(
+ uint amountOut,
+ uint amountInMax,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
+ amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
+ TransferHelper.safeTransferFrom(
+ path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ );
+ _swap(amounts, path, to);
+ }
+
+ // CHANGE_OMGX
+ // function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // payable
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
+ // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ // IWETH(WETH).deposit{value: amounts[0]}();
+ // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
+ // _swap(amounts, path, to);
+ // }
+ // function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ // require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
+ // TransferHelper.safeTransferFrom(
+ // path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ // );
+ // _swap(amounts, path, address(this));
+ // IWETH(WETH).withdraw(amounts[amounts.length - 1]);
+ // TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
+ // }
+ // function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
+ // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ // TransferHelper.safeTransferFrom(
+ // path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ // );
+ // _swap(amounts, path, address(this));
+ // IWETH(WETH).withdraw(amounts[amounts.length - 1]);
+ // TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
+ // }
+ // function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // payable
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ // require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
+ // IWETH(WETH).deposit{value: amounts[0]}();
+ // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
+ // _swap(amounts, path, to);
+ // // refund dust eth, if any
+ // if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
+ // }
+
+ // **** SWAP (supporting fee-on-transfer tokens) ****
+ // requires the initial amount to have already been sent to the first pair
+ function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
+ for (uint i; i < path.length - 1; i++) {
+ (address input, address output) = (path[i], path[i + 1]);
+ (address token0,) = UniswapV2Library.sortTokens(input, output);
+ IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
+ uint amountInput;
+ uint amountOutput;
+ { // scope to avoid stack too deep errors
+ (uint reserve0, uint reserve1,) = pair.getReserves();
+ (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
+ amountInput = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
+ amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
+ }
+ (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
+ address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
+ pair.swap(amount0Out, amount1Out, to, new bytes(0));
+ }
+ }
+ function swapExactTokensForTokensSupportingFeeOnTransferTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) {
+ TransferHelper.safeTransferFrom(
+ path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
+ );
+ uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
+ _swapSupportingFeeOnTransferTokens(path, to);
+ require(
+ IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
+ 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
+ );
+ }
+
+ // CHANGE_OMGX
+ // function swapExactETHForTokensSupportingFeeOnTransferTokens(
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // )
+ // external
+ // virtual
+ // override
+ // payable
+ // ensure(deadline)
+ // {
+ // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // uint amountIn = msg.value;
+ // IWETH(WETH).deposit{value: amountIn}();
+ // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
+ // uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
+ // _swapSupportingFeeOnTransferTokens(path, to);
+ // require(
+ // IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
+ // 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
+ // );
+ // }
+ // function swapExactTokensForETHSupportingFeeOnTransferTokens(
+ // uint amountIn,
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // )
+ // external
+ // virtual
+ // override
+ // ensure(deadline)
+ // {
+ // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // TransferHelper.safeTransferFrom(
+ // path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
+ // );
+ // _swapSupportingFeeOnTransferTokens(path, address(this));
+ // uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
+ // require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ // IWETH(WETH).withdraw(amountOut);
+ // TransferHelper.safeTransferETH(to, amountOut);
+ // }
+
+ // **** LIBRARY FUNCTIONS ****
+ function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
+ return UniswapV2Library.quote(amountA, reserveA, reserveB);
+ }
+
+ function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
+ public
+ pure
+ virtual
+ override
+ returns (uint amountOut)
+ {
+ return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
+ }
+
+ function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
+ public
+ pure
+ virtual
+ override
+ returns (uint amountIn)
+ {
+ return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
+ }
+
+ function getAmountsOut(uint amountIn, address[] memory path)
+ public
+ view
+ virtual
+ override
+ returns (uint[] memory amounts)
+ {
+ return UniswapV2Library.getAmountsOut(factory, amountIn, path);
+ }
+
+ function getAmountsIn(uint amountOut, address[] memory path)
+ public
+ view
+ virtual
+ override
+ returns (uint[] memory amounts)
+ {
+ return UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IERC20.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IERC20.sol
new file mode 100644
index 000000000000..fd7b169f23fb
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IERC20.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IERC20Uniswap {
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+
+ function name() external view returns (string memory);
+ function symbol() external view returns (string memory);
+ function decimals() external view returns (uint8);
+ function totalSupply() external view returns (uint);
+ function balanceOf(address owner) external view returns (uint);
+ function allowance(address owner, address spender) external view returns (uint);
+
+ function approve(address spender, uint value) external returns (bool);
+ function transfer(address to, uint value) external returns (bool);
+ function transferFrom(address from, address to, uint value) external returns (bool);
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Callee.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Callee.sol
new file mode 100644
index 000000000000..a11b1c4b6916
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Callee.sol
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2Callee {
+ function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
+}
diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2ERC20.sol
similarity index 79%
rename from packages/contracts/contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol
rename to omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2ERC20.sol
index f83dae349771..41fb595b3b31 100644
--- a/packages/contracts/contracts/optimistic-ethereum/libraries/standards/IUniswapV2ERC20.sol
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2ERC20.sol
@@ -1,13 +1,14 @@
-// SPDX-License-Identifier: MIT
-pragma solidity >=0.5.16 <0.8.0;
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
interface IUniswapV2ERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
- function name() external view returns (string memory);
- function symbol() external view returns (string memory);
- function decimals() external view returns (uint8);
+ function name() external pure returns (string memory);
+ function symbol() external pure returns (string memory);
+ function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
@@ -21,4 +22,4 @@ interface IUniswapV2ERC20 {
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
-}
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Factory.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Factory.sol
new file mode 100644
index 000000000000..aea4477135b6
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Factory.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2Factory {
+ event PairCreated(address indexed token0, address indexed token1, address pair, uint);
+
+ function feeTo() external view returns (address);
+ function feeToSetter() external view returns (address);
+ function migrator() external view returns (address);
+
+ function getPair(address tokenA, address tokenB) external view returns (address pair);
+ function allPairs(uint) external view returns (address pair);
+ function allPairsLength() external view returns (uint);
+
+ function createPair(address tokenA, address tokenB) external returns (address pair);
+
+ function setFeeTo(address) external;
+ function setFeeToSetter(address) external;
+ function setMigrator(address) external;
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol
new file mode 100644
index 000000000000..9c69f709a775
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2Pair {
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+
+ function name() external pure returns (string memory);
+ function symbol() external pure returns (string memory);
+ function decimals() external pure returns (uint8);
+ function totalSupply() external view returns (uint);
+ function balanceOf(address owner) external view returns (uint);
+ function allowance(address owner, address spender) external view returns (uint);
+
+ function approve(address spender, uint value) external returns (bool);
+ function transfer(address to, uint value) external returns (bool);
+ function transferFrom(address from, address to, uint value) external returns (bool);
+
+ function DOMAIN_SEPARATOR() external view returns (bytes32);
+ function PERMIT_TYPEHASH() external pure returns (bytes32);
+ function nonces(address owner) external view returns (uint);
+
+ function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
+
+ event Mint(address indexed sender, uint amount0, uint amount1);
+ event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
+ event Swap(
+ address indexed sender,
+ uint amount0In,
+ uint amount1In,
+ uint amount0Out,
+ uint amount1Out,
+ address indexed to
+ );
+ event Sync(uint112 reserve0, uint112 reserve1);
+
+ function MINIMUM_LIQUIDITY() external pure returns (uint);
+ function factory() external view returns (address);
+ function token0() external view returns (address);
+ function token1() external view returns (address);
+ function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
+ function price0CumulativeLast() external view returns (uint);
+ function price1CumulativeLast() external view returns (uint);
+ function kLast() external view returns (uint);
+
+ function mint(address to) external returns (uint liquidity);
+ function burn(address to) external returns (uint amount0, uint amount1);
+ function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
+ function skim(address to) external;
+ function sync() external;
+
+ function initialize(address, address) external;
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Router01.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Router01.sol
new file mode 100644
index 000000000000..0058a03607cd
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Router01.sol
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.6.2;
+
+interface IUniswapV2Router01 {
+ function factory() external pure returns (address);
+ // CHANGE_OMGX
+ //function WETH() external view returns (address);
+
+ function addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint amountADesired,
+ uint amountBDesired,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) external returns (uint amountA, uint amountB, uint liquidity);
+ // CHANGE_OMGX
+ // function addLiquidityETH(
+ // address token,
+ // uint amountTokenDesired,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
+ function removeLiquidity(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) external returns (uint amountA, uint amountB);
+ // CHANGE_OMGX
+ // function removeLiquidityETH(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external returns (uint amountToken, uint amountETH);
+ function removeLiquidityWithPermit(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline,
+ bool approveMax, uint8 v, bytes32 r, bytes32 s
+ ) external returns (uint amountA, uint amountB);
+ // CHANGE_OMGX
+ // function removeLiquidityETHWithPermit(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external returns (uint amountToken, uint amountETH);
+ function swapExactTokensForTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external returns (uint[] memory amounts);
+ function swapTokensForExactTokens(
+ uint amountOut,
+ uint amountInMax,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external returns (uint[] memory amounts);
+ // CHANGE_OMGX
+ // function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // payable
+ // returns (uint[] memory amounts);
+ // function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
+ // external
+ // returns (uint[] memory amounts);
+ // function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // returns (uint[] memory amounts);
+ // function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
+ // external
+ // payable
+ // returns (uint[] memory amounts);
+
+ function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
+ function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
+ function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
+ function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
+ function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol
new file mode 100644
index 000000000000..9c5c95dc33cb
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.6.2;
+
+import './IUniswapV2Router01.sol';
+
+interface IUniswapV2Router02 is IUniswapV2Router01 {
+ // CHANGE_OMGX
+ // function removeLiquidityETHSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external returns (uint amountETH);
+ // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external returns (uint amountETH);
+
+ function swapExactTokensForTokensSupportingFeeOnTransferTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external;
+ // CHANGE_OMGX
+ // function swapExactETHForTokensSupportingFeeOnTransferTokens(
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // ) external payable;
+ // function swapExactTokensForETHSupportingFeeOnTransferTokens(
+ // uint amountIn,
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // ) external;
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/uniswapv2/interfaces/IWETH.sol b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IWETH.sol
new file mode 100644
index 000000000000..96b77b74204d
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/interfaces/IWETH.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+// CHANGE_OMGX
+// interface IWETH {
+// function deposit() external payable;
+// function transfer(address to, uint value) external returns (bool);
+// function withdraw(uint) external;
+// }
\ No newline at end of file
diff --git a/omgx_examples/sushi/contracts/uniswapv2/libraries/Math.sol b/omgx_examples/sushi/contracts/uniswapv2/libraries/Math.sol
new file mode 100644
index 000000000000..d183d80ba13a
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/libraries/Math.sol
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+// a library for performing various math operations
+
+library Math {
+ function min(uint x, uint y) internal pure returns (uint z) {
+ z = x < y ? x : y;
+ }
+
+ // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
+ function sqrt(uint y) internal pure returns (uint z) {
+ if (y > 3) {
+ z = y;
+ uint x = y / 2 + 1;
+ while (x < z) {
+ z = x;
+ x = (y / x + x) / 2;
+ }
+ } else if (y != 0) {
+ z = 1;
+ }
+ }
+}
diff --git a/packages/contracts/contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol b/omgx_examples/sushi/contracts/uniswapv2/libraries/SafeMath.sol
similarity index 85%
rename from packages/contracts/contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol
rename to omgx_examples/sushi/contracts/uniswapv2/libraries/SafeMath.sol
index de87bab5d72d..1cc199b6fd67 100644
--- a/packages/contracts/contracts/optimistic-ethereum/libraries/standards/UniSafeMath.sol
+++ b/omgx_examples/sushi/contracts/uniswapv2/libraries/SafeMath.sol
@@ -1,9 +1,10 @@
-// SPDX-License-Identifier: MIT
-pragma solidity >=0.5.16 <0.8.0;
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
-library UniSafeMath {
+library SafeMathUniswap {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/libraries/TransferHelper.sol b/omgx_examples/sushi/contracts/uniswapv2/libraries/TransferHelper.sol
new file mode 100644
index 000000000000..d179a67a9648
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/libraries/TransferHelper.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.6.0;
+
+// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
+library TransferHelper {
+ function safeApprove(address token, address to, uint value) internal {
+ // bytes4(keccak256(bytes('approve(address,uint256)')));
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
+ }
+
+ function safeTransfer(address token, address to, uint value) internal {
+ // bytes4(keccak256(bytes('transfer(address,uint256)')));
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
+ }
+
+ function safeTransferFrom(address token, address from, address to, uint value) internal {
+ // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
+ }
+
+ function safeTransferETH(address to, uint value) internal {
+ (bool success,) = to.call{value:value}(new bytes(0));
+ require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
+ }
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/libraries/UQ112x112.sol b/omgx_examples/sushi/contracts/uniswapv2/libraries/UQ112x112.sol
new file mode 100644
index 000000000000..9af8f74975b3
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/libraries/UQ112x112.sol
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
+
+// range: [0, 2**112 - 1]
+// resolution: 1 / 2**112
+
+library UQ112x112 {
+ uint224 constant Q112 = 2**112;
+
+ // encode a uint112 as a UQ112x112
+ function encode(uint112 y) internal pure returns (uint224 z) {
+ z = uint224(y) * Q112; // never overflows
+ }
+
+ // divide a UQ112x112 by a uint112, returning a UQ112x112
+ function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
+ z = x / uint224(y);
+ }
+}
diff --git a/omgx_examples/sushi/contracts/uniswapv2/libraries/UniswapV2Library.sol b/omgx_examples/sushi/contracts/uniswapv2/libraries/UniswapV2Library.sol
new file mode 100644
index 000000000000..14cffb0583f6
--- /dev/null
+++ b/omgx_examples/sushi/contracts/uniswapv2/libraries/UniswapV2Library.sol
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+import '../interfaces/IUniswapV2Pair.sol';
+
+import "./SafeMath.sol";
+
+library UniswapV2Library {
+ using SafeMathUniswap for uint;
+
+ // returns sorted token addresses, used to handle return values from pairs sorted in this order
+ function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
+ require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
+ (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
+ require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
+ }
+
+ // calculates the CREATE2 address for a pair without making any external calls
+ function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
+ (address token0, address token1) = sortTokens(tokenA, tokenB);
+ pair = address(uint(keccak256(abi.encodePacked(
+ hex'ff',
+ factory,
+ keccak256(abi.encodePacked(token0, token1)),
+ hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
+ ))));
+ }
+
+ // fetches and sorts the reserves for a pair
+ function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
+ (address token0,) = sortTokens(tokenA, tokenB);
+ (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
+ (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
+ }
+
+ // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
+ function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
+ require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
+ require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
+ amountB = amountA.mul(reserveB) / reserveA;
+ }
+
+ // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
+ function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
+ require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
+ require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
+ uint amountInWithFee = amountIn.mul(997);
+ uint numerator = amountInWithFee.mul(reserveOut);
+ uint denominator = reserveIn.mul(1000).add(amountInWithFee);
+ amountOut = numerator / denominator;
+ }
+
+ // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
+ function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
+ require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
+ require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
+ uint numerator = reserveIn.mul(amountOut).mul(1000);
+ uint denominator = reserveOut.sub(amountOut).mul(997);
+ amountIn = (numerator / denominator).add(1);
+ }
+
+ // performs chained getAmountOut calculations on any number of pairs
+ function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
+ require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
+ amounts = new uint[](path.length);
+ amounts[0] = amountIn;
+ for (uint i; i < path.length - 1; i++) {
+ (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
+ amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
+ }
+ }
+
+ // performs chained getAmountIn calculations on any number of pairs
+ function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
+ require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
+ amounts = new uint[](path.length);
+ amounts[amounts.length - 1] = amountOut;
+ for (uint i = path.length - 1; i > 0; i--) {
+ (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
+ amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
+ }
+ }
+}
diff --git a/omgx_examples/sushi/deployments/addresses.json b/omgx_examples/sushi/deployments/addresses.json
new file mode 100644
index 000000000000..519c523743ea
--- /dev/null
+++ b/omgx_examples/sushi/deployments/addresses.json
@@ -0,0 +1 @@
+{"SushiToken":"0x057ef64E23666F000b34aE31332854aCBd1c8544","SushiBar":"0x261D8c5e9742e6f7f1076Fa1F560894524e19cad","MasterChef":"0xCE3478A9E0167a6Bc5716DC39DbbbfAc38F27623","UniswapV2Factory":"0xe4EB561155AFCe723bB1fF8606Fbfe9b28d5d38D","UniswapV2Router02":"0xcf27F781841484d5CF7e155b44954D7224caF1dD","SushiRoll":"0x673cD70FA883394a1f3DEb3221937Ceb7C2618D7"}
\ No newline at end of file
diff --git a/omgx_examples/sushi/hardhat.config.ts b/omgx_examples/sushi/hardhat.config.ts
new file mode 100644
index 000000000000..1c77d95ccca9
--- /dev/null
+++ b/omgx_examples/sushi/hardhat.config.ts
@@ -0,0 +1,40 @@
+import '@eth-optimism/hardhat-ovm';
+import '@eth-optimism/plugins/hardhat/compiler';
+import '@eth-optimism/plugins/hardhat/ethers';
+import '@nomiclabs/hardhat-ethers';
+import '@nomiclabs/hardhat-waffle';
+import "@tenderly/hardhat-tenderly";
+
+const config = {
+ mocha: {
+ timeout: 60000,
+ },
+ networks: {
+ omgx: {
+ url: 'http://localhost:8545',
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true,
+ },
+ },
+ solidity: {
+ compilers: [
+ {
+ version: "0.6.12",
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 1
+ }
+ }
+ },
+ ],
+ },
+ ovm: {
+ solcVersion: '0.6.12',
+ },
+}
+
+export default config
\ No newline at end of file
diff --git a/omgx_examples/sushi/package.json b/omgx_examples/sushi/package.json
new file mode 100644
index 000000000000..8a0d4a543685
--- /dev/null
+++ b/omgx_examples/sushi/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "@omgx/sushi-example",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "build": "TARGET=ovm hardhat compile --network omgx ",
+ "deploy": "TARGET=ovm hardhat --network omgx run scripts/deploy.js",
+ "analyze": "TARGET=ovm hardhat run scripts/analyze.js",
+ "test:contracts": "hardhat test"
+ },
+ "dependencies": {
+ "@eth-optimism/ethereumjs-vm": "^4.2.0-alpha.3",
+ "@eth-optimism/hardhat-ovm": "^0.0.3",
+ "patch-package": "^6.4.7"
+ },
+ "devDependencies": {
+ "@boringcrypto/boring-solidity": "boringcrypto/BoringSolidity#e06e943",
+ "@eth-optimism/plugins": "^0.0.16",
+ "@ethersproject/providers": "^5.1.2",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "@openzeppelin/contracts": "^3.1.0",
+ "@tenderly/hardhat-tenderly": "^1.0.12",
+ "chai-as-promised": "^7.1.1",
+ "chalk": "^4.1.1",
+ "dotenv": "^8.2.0",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.1.4",
+ "expect": "^26.6.2",
+ "hardhat": "2.0.6",
+ "ramda": "^0.27.1"
+ }
+}
diff --git a/omgx_examples/sushi/patches/@openzeppelin+contracts+3.4.1.patch b/omgx_examples/sushi/patches/@openzeppelin+contracts+3.4.1.patch
new file mode 100644
index 000000000000..27bb13454ddb
--- /dev/null
+++ b/omgx_examples/sushi/patches/@openzeppelin+contracts+3.4.1.patch
@@ -0,0 +1,13 @@
+diff --git a/node_modules/@openzeppelin/contracts/utils/Address.sol b/node_modules/@openzeppelin/contracts/utils/Address.sol
+index 42a9dc1..c26c635 100644
+--- a/node_modules/@openzeppelin/contracts/utils/Address.sol
++++ b/node_modules/@openzeppelin/contracts/utils/Address.sol
+@@ -112,7 +112,7 @@ library Address {
+ * _Available since v3.1._
+ */
+ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
+- require(address(this).balance >= value, "Address: insufficient balance for call");
++ //require(address(this).balance >= value, "Address: insufficient balance for call");
+ require(isContract(target), "Address: call to non-contract");
+
+ // solhint-disable-next-line avoid-low-level-calls
diff --git a/omgx_examples/sushi/scripts/analyze.js b/omgx_examples/sushi/scripts/analyze.js
new file mode 100644
index 000000000000..698a89bcf59c
--- /dev/null
+++ b/omgx_examples/sushi/scripts/analyze.js
@@ -0,0 +1,91 @@
+const fs = require("fs");
+const chalk = require("chalk");
+const bre = require("hardhat");
+
+async function main() {
+
+ console.log(" 📡 Analyzing...\n");
+
+ try {
+
+ const alertMessages = { critical: 0, minor: 0 };
+ const dirents = fs.readdirSync(`contracts`, { withFileTypes: true });
+
+ const contractNames = dirents
+ .filter(dirent => dirent.isFile())
+ .filter(dirent => !(dirent.name === '.DS_Store'))
+ .map(dirent => dirent.name.replace(".sol", ""));
+
+ const inlineAssemblyReg = /\bassembly([\s]*)\{{1}?\s?(.)?[\s\w:=(),]+\}/gm;
+
+ for (let contractName of contractNames) {
+ console.log(` 📡 Analyzing ${chalk.cyan(contractName)}`);
+
+ const contract = fs
+ .readFileSync(`${bre.config.paths.artifacts}-ovm/contracts/${contractName}.sol/${contractName}.json`)
+ .toString();
+
+ const sizeByte = Buffer.from(
+ JSON.parse(contract).deployedBytecode.replace(/__\$\w*\$__/g, '0'.repeat(40)).slice(2),
+ 'hex'
+ ).length;
+
+ const sizeKB = (sizeByte / 1024).toFixed(2);
+
+ console.log(` 💡${chalk.cyan(contractName)} size: ${sizeKB} kB`);
+
+ if (sizeKB > 18) {
+ console.log(` 🚨${chalk.red(`${chalk.cyan(contractName)} is larger than 18 kB. It might fail to deploy on L2. Please consider reducing the contract's size.`)}`);
+ alertMessages.minor += 1;
+ }
+
+ const contractSource = fs
+ .readFileSync(`${bre.config.paths.sources}/${contractName}.sol`)
+ .toString();
+
+ const contractSourceArr = contractSource.split("\n");
+ while ((result = inlineAssemblyReg.exec(contractSource)) !== null) {
+ let index = 0;
+ const startIndex = result.index;
+ for (let i in contractSourceArr) {
+ if (index <= startIndex && index + contractSourceArr[i].length - 1 >= startIndex) {
+ console.log(` 🚨${chalk.red(`Found inline Assembly at ${bre.config.paths.sources}/${contractName}.sol#L${Number(i) + 1}`)}`);
+ alertMessages.critical += 1;
+ break;
+ }
+ index += contractSourceArr[i].length + 1;
+ }
+ }
+
+ console.log('\n');
+ }
+
+ if (alertMessages.critical === 0) {
+ console.log(` 🌕Passed\n`);
+ } else {
+ console.log(` 🚨${chalk.red(`Found ${alertMessages.critical} critical issues. Please fix them before deploying contracts.`)}\n`);
+ }
+
+ if (alertMessages.minor === 1) {
+ console.log(` 🚨${chalk.red(`Found 1 minor issue. Please review it before deploying contracts.`)}\n`);
+ } else if (alertMessages.minor > 1) {
+ console.log(` 🚨${chalk.red(`Found ${alertMessages.minor} minor issues. Please review them before deploying contracts.`)}\n`);
+ }
+
+ } catch(e) {
+ if(e.toString().indexOf("no such file or directory")>=0){
+ console.log(e)
+ return false
+ }else{
+ console.log(e);
+ return false;
+ }
+ }
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
\ No newline at end of file
diff --git a/omgx_examples/sushi/scripts/deploy.js b/omgx_examples/sushi/scripts/deploy.js
new file mode 100644
index 000000000000..9527cc92554f
--- /dev/null
+++ b/omgx_examples/sushi/scripts/deploy.js
@@ -0,0 +1,130 @@
+const fs = require("fs");
+const dotenv = require('dotenv');
+const bre = require("hardhat");
+const { utils } = require('ethers');
+dotenv.config();
+const { deploy } = require('./utils');
+
+const env = process.env;
+const deployPrivateKey = env.DEPLOYER_PRIVATE_KEY;
+const l2RpcUrl = env.L2_NODE_WEB3_URL;
+const l2ETHAddress = "0x4200000000000000000000000000000000000006";
+
+function writeFileSyncRecursive(filename, content, charset) {
+ const folders = filename.split('/').slice(0, -1)
+ if (folders.length) {
+ // create folder path if it doesn't exist
+ folders.reduce((last, folder) => {
+ const folderPath = last ? last + '/' + folder : folder
+ if (!fs.existsSync(folderPath)) {
+ fs.mkdirSync(folderPath, { recursive: true })
+ }
+ return folderPath
+ })
+ }
+ fs.writeFileSync('.'+filename, content, charset)
+}
+
+const main = async () => {
+
+ console.log(` 📡 Deploying...\n`);
+
+ const deployAddress = new ethers.Wallet(deployPrivateKey).address;
+
+ // contracts
+ const SushiToken = await deploy({
+ contractName: "SushiToken",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: []
+ })
+
+ const SushiBar = await deploy({
+ contractName: "SushiBar",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [SushiToken.address]
+ })
+
+ const MasterChef = await deploy({
+ contractName: "MasterChef",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [
+ SushiToken.address,
+ deployAddress,
+ utils.parseEther("100000000"),
+ "0",
+ utils.parseEther("100000000")
+ ]
+ });
+
+ if (await SushiToken.owner() !== MasterChef.address) {
+ // Transfer Sushi Ownership to Chef
+ console.log(" 🔑 Transfer Sushi Ownership to Chef")
+ await (await SushiToken.transferOwnership(MasterChef.address, { gasLimit: 800000, gasPrice: 0 })).wait()
+ }
+
+ if (await MasterChef.owner() !== deployAddress) {
+ // Transfer ownership of MasterChef to Dev
+ console.log(" 🔑 Transfer ownership of MasterChef to Dev")
+ await (await MasterChef.transferOwnership(deployAddress, { gasLimit: 800000, gasPrice: 0 })).wait()
+ }
+
+ const UniswapV2Factory = await deploy({
+ contractName: "UniswapV2Factory",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [deployAddress],
+ })
+
+ const UniswapV2Router02 = await deploy({
+ contractName: "UniswapV2Router02",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [UniswapV2Factory.address, l2ETHAddress],
+ })
+
+ //const UNISWAP_ROUTER = new Map()
+ //UNISWAP_ROUTER.set("1", "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D")
+
+ const SushiRoll = await deploy({
+ contractName: "SushiRoll",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ // _args: ["0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", UniswapV2Router02.address]
+ _args: [l2ETHAddress,l2ETHAddress]
+ })
+
+ // save address
+ const addresses = {
+ SushiToken: SushiToken.address,
+ SushiBar: SushiBar.address,
+ MasterChef: MasterChef.address,
+ UniswapV2Factory: UniswapV2Factory.address,
+ UniswapV2Router02: UniswapV2Router02.address,
+ SushiRoll: SushiRoll.address,
+ }
+
+ writeFileSyncRecursive(`/deployments/addresses.json`,JSON.stringify(addresses));
+
+ console.log(
+ "\n\n 🛰 Addresses: \n",
+ addresses,
+ )
+};
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
+
+exports.deploy = deploy;
diff --git a/omgx_examples/sushi/scripts/utils.js b/omgx_examples/sushi/scripts/utils.js
new file mode 100644
index 000000000000..19fee6c14b59
--- /dev/null
+++ b/omgx_examples/sushi/scripts/utils.js
@@ -0,0 +1,89 @@
+/* eslint no-use-before-define: "warn" */
+const fs = require("fs");
+const chalk = require("chalk");
+const { l2ethers } = require("hardhat");
+const { utils } = require("ethers");
+const R = require("ramda");
+
+async function deploy({
+ rpcUrl,
+ contractName,
+ pk, ovm = false,
+ _args = [],
+ overrides = {},
+}) {
+
+ console.log(` 🛰 ${ovm?`OVM`:`EVM`} Deploying: ${contractName} on ${rpcUrl}`);
+
+ const contractArgs = _args || [];
+
+ const provider = new ethers.providers.JsonRpcProvider(rpcUrl)
+ const signerProvider = new ethers.Wallet(pk).connect(provider)
+
+ let contractArtifacts
+
+ if(ovm === true) {
+ contractArtifacts = await l2ethers.getContractFactory(contractName, signerProvider);
+ } else {
+ contractArtifacts = await ethers.getContractFactory(contractName, signerProvider);
+ }
+
+ const nonce = await signerProvider.getTransactionCount()
+ const deployed = await contractArtifacts.deploy(...contractArgs, { nonce, ...overrides, gasPrice: 0, gasLimit: 800000 });
+ await deployed.deployTransaction.wait()
+
+ const checkCode = async (_address) => {
+ let code = await provider.getCode(_address)
+ console.log(` 📱 Code: ${code.slice(0, 100)}`)
+ }
+
+ let result = await checkCode(deployed.address)
+ if(result=="0x"){
+ console.log("☢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸ CONTRACT DID NOT DEPLOY ☢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸")
+ return 0
+ }
+
+ const encoded = abiEncodeArgs(deployed, contractArgs);
+ fs.writeFileSync(`artifacts-ovm/${contractName}.address`, deployed.address);
+
+ let extraGasInfo = ""
+ if(deployed&&deployed.deployTransaction){
+ const gasUsed = deployed.deployTransaction.gasLimit.mul(deployed.deployTransaction.gasPrice)
+ extraGasInfo = "("+utils.formatEther(gasUsed)+" ETH)"
+ }
+
+ console.log(
+ " 📄",
+ chalk.cyan(contractName),
+ "deployed to:",
+ chalk.magenta(deployed.address),
+ chalk.grey(extraGasInfo)
+ );
+
+ if (!encoded || encoded.length <= 2) return deployed;
+ fs.writeFileSync(`artifacts-ovm/${contractName}.args`, encoded.slice(2));
+
+ return deployed;
+};
+
+
+// abi encodes contract arguments
+// useful when you want to manually verify the contracts
+// for example, on Etherscan
+const abiEncodeArgs = (deployed, contractArgs) => {
+ // not writing abi encoded args if this does not pass
+ if (
+ !contractArgs ||
+ !deployed ||
+ !R.hasPath(["interface", "deploy"], deployed)
+ ) {
+ return "";
+ }
+ const encoded = utils.defaultAbiCoder.encode(
+ deployed.interface.deploy.inputs,
+ contractArgs
+ );
+ return encoded;
+};
+
+exports.deploy = deploy;
diff --git a/omgx_examples/sushi/test/MasterChef.test.js b/omgx_examples/sushi/test/MasterChef.test.js
new file mode 100644
index 000000000000..d9ad0dd6bd63
--- /dev/null
+++ b/omgx_examples/sushi/test/MasterChef.test.js
@@ -0,0 +1,335 @@
+
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const { advanceBlockTo } = require("./utilities/time");
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+describe("MasterChef", function () {
+ before(async function () {
+
+ this.Factory__MasterChef = new ContractFactory(
+ MasterChefJSON.abi,
+ MasterChefJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__ERC20Mock = new ContractFactory(
+ ERC20MockJSON.abi,
+ ERC20MockJSON.bytecode,
+ minter,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+ })
+
+ it("should set correct state variables", async function () {
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "1000")
+ await this.chef.deployTransaction.wait()
+
+ const ownershipTX = await this.sushi.transferOwnership(this.chef.address)
+ await ownershipTX.wait()
+
+ const sushi = await this.chef.sushi()
+ const devaddr = await this.chef.devaddr()
+ const owner = await this.sushi.owner()
+
+ expect(sushi).to.equal(this.sushi.address)
+ expect(devaddr).to.equal(dev.address)
+ expect(owner).to.equal(this.chef.address)
+ })
+
+ it("should allow dev and only dev to update dev", async function () {
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "1000")
+ await this.chef.deployTransaction.wait()
+
+ expect(await this.chef.devaddr()).to.equal(dev.address)
+
+ let ownershipTX = await this.chef.connect(dev).dev(bob.address, { from: dev.address })
+ await ownershipTX.wait()
+ expect(await this.chef.devaddr()).to.equal(bob.address)
+
+ ownershipTX = await this.chef.connect(bob).dev(alice.address, { from: bob.address })
+ await ownershipTX.wait()
+ expect(await this.chef.devaddr()).to.equal(alice.address)
+ })
+
+ /******************************************************************/
+ /******************** evm_mint is not supported *******************/
+ /******************************************************************/
+
+ context("With ERC/LP token added to the field", function () {
+ beforeEach(async function () {
+ this.lp = await this.Factory__ERC20Mock.deploy("LPToken", "LP", "10000000000")
+
+ let tx
+ tx = await this.lp.transfer(alice.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp.transfer(bob.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp.transfer(carol.address, "1000")
+ await tx.wait()
+
+ this.lp2 = await this.Factory__ERC20Mock.deploy("LPToken2", "LP2", "10000000000")
+
+ tx = await this.lp2.transfer(alice.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp2.transfer(bob.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp2.transfer(carol.address, "1000")
+ await tx.wait()
+ })
+
+ it("should allow emergency withdraw", async function () {
+ // 100 per block farming rate starting at block 100 with bonus until block 1000
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "100", "100", "1000")
+ await this.chef.deployTransaction.wait()
+
+ const addTX = await this.chef.add("100", this.lp.address, true)
+ await addTX.wait()
+
+ const approveTX = await this.lp.connect(bob).approve(this.chef.address, "1000")
+ await approveTX.wait()
+
+ const depositTX = await this.chef.connect(bob).deposit(0, "100")
+ await depositTX.wait()
+
+ expect(await this.lp.balanceOf(bob.address)).to.equal("900")
+
+ const withdrawTX = await this.chef.connect(bob).emergencyWithdraw(0)
+ await withdrawTX.wait()
+
+ expect(await this.lp.balanceOf(bob.address)).to.equal("1000")
+ })
+
+ /******************************************************************/
+ /******************** evm_mint is not supported *******************/
+ /******************************************************************/
+ // it("should give out SUSHIs only after farming time", async function () {
+ // // 100 per block farming rate starting at block 100 with bonus until block 1000
+ // this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "100", "100", "1000")
+ // await this.chef.deployTransaction.wait()
+
+ // const tx = await this.sushi.transferOwnership(this.chef.address)
+ // await tx.wait()
+
+ // const add = await this.chef.add("100", this.lp.address, true)
+ // await add.wait()
+
+ // const approve = await this.lp.connect(bob).approve(this.chef.address, "1000")
+ // await approve.wait()
+
+ // let deposit
+ // deposit = await this.chef.connect(bob).deposit(0, "100")
+ // await deposit.wait()
+ // await advanceBlockTo("89")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 90
+ // await deposit.wait()
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // await advanceBlockTo("94")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 95
+ // await deposit.wait()
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // await advanceBlockTo("99")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 100
+ // await deposit.wait()
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // await advanceBlockTo("100")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 101
+ // await deposit.wait()
+ // // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("1000")
+
+ // await advanceBlockTo("104")
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 105
+ // await deposit.wait()
+
+ // const bobBalance = await this.sushi.balanceOf(bob.address);
+ // const devBalance = await this.sushi.balanceOf(dev.address);
+ // const supply = await this.sushi.totalSupply();
+ // console.log({
+ // bobBalance: bobBalance.toString(),
+ // devBalance: devBalance.toString(),
+ // supply: supply.toString(),
+ // })
+ // // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("5000")
+ // // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("500")
+ // // expect(await this.sushi.totalSupply()).to.equal("5500")
+ // })
+
+ // it("should not distribute SUSHIs if no one deposit", async function () {
+ // // 100 per block farming rate starting at block 200 with bonus until block 1000
+ // this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "100", "200", "1000")
+ // await this.chef.deployTransaction.wait()
+
+ // const transferOwnershipTX = await this.sushi.transferOwnership(this.chef.address)
+ // await transferOwnershipTX.wait()
+
+ // const addTX = await this.chef.add("100", this.lp.address, true)
+ // await addTX.wait()
+
+ // const approveTX = await this.lp.connect(bob).approve(this.chef.address, "1000")
+ // await approveTX.wait()
+
+ // await advanceBlockTo("199")
+ // expect(await this.sushi.totalSupply()).to.equal("0")
+ // await advanceBlockTo("204")
+ // expect(await this.sushi.totalSupply()).to.equal("0")
+ // await advanceBlockTo("209")
+
+ // const depositTX = await this.chef.connect(bob).deposit(0, "10") // block 210
+ // await depositTX.wait()
+
+ // expect(await this.sushi.totalSupply()).to.equal("0")
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(dev.address)).to.equal("0")
+ // expect(await this.lp.balanceOf(bob.address)).to.equal("990")
+
+ // await advanceBlockTo("219")
+
+ // const withdrawTX = await this.chef.connect(bob).withdraw(0, "10") // block 220
+ // await withdrawTX.wait()
+
+ // expect(await this.sushi.totalSupply()).to.equal("11000")
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("10000")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("1000")
+ // expect(await this.lp.balanceOf(this.bob.address)).to.equal("1000")
+ // })
+
+ // it("should distribute SUSHIs properly for each staker", async function () {
+ // // 100 per block farming rate starting at block 300 with bonus until block 1000
+ // this.chef = await this.MasterChef.deploy(this.sushi.address, this.dev.address, "100", "300", "1000")
+ // await this.chef.deployed()
+ // await this.sushi.transferOwnership(this.chef.address)
+ // await this.chef.add("100", this.lp.address, true)
+ // await this.lp.connect(this.alice).approve(this.chef.address, "1000", {
+ // from: this.alice.address,
+ // })
+ // await this.lp.connect(this.bob).approve(this.chef.address, "1000", {
+ // from: this.bob.address,
+ // })
+ // await this.lp.connect(this.carol).approve(this.chef.address, "1000", {
+ // from: this.carol.address,
+ // })
+ // // Alice deposits 10 LPs at block 310
+ // await advanceBlockTo("309")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // // Bob deposits 20 LPs at block 314
+ // await advanceBlockTo("313")
+ // await this.chef.connect(this.bob).deposit(0, "20", { from: this.bob.address })
+ // // Carol deposits 30 LPs at block 318
+ // await advanceBlockTo("317")
+ // await this.chef.connect(this.carol).deposit(0, "30", { from: this.carol.address })
+ // // Alice deposits 10 more LPs at block 320. At this point:
+ // // Alice should have: 4*1000 + 4*1/3*1000 + 2*1/6*1000 = 5666
+ // // MasterChef should have the remaining: 10000 - 5666 = 4334
+ // await advanceBlockTo("319")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // expect(await this.sushi.totalSupply()).to.equal("11000")
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("5666")
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.carol.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.chef.address)).to.equal("4334")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("1000")
+ // // Bob withdraws 5 LPs at block 330. At this point:
+ // // Bob should have: 4*2/3*1000 + 2*2/6*1000 + 10*2/7*1000 = 6190
+ // await advanceBlockTo("329")
+ // await this.chef.connect(this.bob).withdraw(0, "5", { from: this.bob.address })
+ // expect(await this.sushi.totalSupply()).to.equal("22000")
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("5666")
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("6190")
+ // expect(await this.sushi.balanceOf(this.carol.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.chef.address)).to.equal("8144")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("2000")
+ // // Alice withdraws 20 LPs at block 340.
+ // // Bob withdraws 15 LPs at block 350.
+ // // Carol withdraws 30 LPs at block 360.
+ // await advanceBlockTo("339")
+ // await this.chef.connect(this.alice).withdraw(0, "20", { from: this.alice.address })
+ // await advanceBlockTo("349")
+ // await this.chef.connect(this.bob).withdraw(0, "15", { from: this.bob.address })
+ // await advanceBlockTo("359")
+ // await this.chef.connect(this.carol).withdraw(0, "30", { from: this.carol.address })
+ // expect(await this.sushi.totalSupply()).to.equal("55000")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("5000")
+ // // Alice should have: 5666 + 10*2/7*1000 + 10*2/6.5*1000 = 11600
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("11600")
+ // // Bob should have: 6190 + 10*1.5/6.5 * 1000 + 10*1.5/4.5*1000 = 11831
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("11831")
+ // // Carol should have: 2*3/6*1000 + 10*3/7*1000 + 10*3/6.5*1000 + 10*3/4.5*1000 + 10*1000 = 26568
+ // expect(await this.sushi.balanceOf(this.carol.address)).to.equal("26568")
+ // // All of them should have 1000 LPs back.
+ // expect(await this.lp.balanceOf(this.alice.address)).to.equal("1000")
+ // expect(await this.lp.balanceOf(this.bob.address)).to.equal("1000")
+ // expect(await this.lp.balanceOf(this.carol.address)).to.equal("1000")
+ // })
+
+ // it("should give proper SUSHIs allocation to each pool", async function () {
+ // // 100 per block farming rate starting at block 400 with bonus until block 1000
+ // this.chef = await this.MasterChef.deploy(this.sushi.address, this.dev.address, "100", "400", "1000")
+ // await this.sushi.transferOwnership(this.chef.address)
+ // await this.lp.connect(this.alice).approve(this.chef.address, "1000", { from: this.alice.address })
+ // await this.lp2.connect(this.bob).approve(this.chef.address, "1000", { from: this.bob.address })
+ // // Add first LP to the pool with allocation 1
+ // await this.chef.add("10", this.lp.address, true)
+ // // Alice deposits 10 LPs at block 410
+ // await advanceBlockTo("409")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // // Add LP2 to the pool with allocation 2 at block 420
+ // await advanceBlockTo("419")
+ // await this.chef.add("20", this.lp2.address, true)
+ // // Alice should have 10*1000 pending reward
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("10000")
+ // // Bob deposits 10 LP2s at block 425
+ // await advanceBlockTo("424")
+ // await this.chef.connect(this.bob).deposit(1, "5", { from: this.bob.address })
+ // // Alice should have 10000 + 5*1/3*1000 = 11666 pending reward
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("11666")
+ // await advanceBlockTo("430")
+ // // At block 430. Bob should get 5*2/3*1000 = 3333. Alice should get ~1666 more.
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("13333")
+ // expect(await this.chef.pendingSushi(1, this.bob.address)).to.equal("3333")
+ // })
+
+ // it("should stop giving bonus SUSHIs after the bonus period ends", async function () {
+ // // 100 per block farming rate starting at block 500 with bonus until block 600
+ // this.chef = await this.MasterChef.deploy(this.sushi.address, this.dev.address, "100", "500", "600")
+ // await this.sushi.transferOwnership(this.chef.address)
+ // await this.lp.connect(this.alice).approve(this.chef.address, "1000", { from: this.alice.address })
+ // await this.chef.add("1", this.lp.address, true)
+ // // Alice deposits 10 LPs at block 590
+ // await advanceBlockTo("589")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // // At block 605, she should have 1000*10 + 100*5 = 10500 pending.
+ // await advanceBlockTo("605")
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("10500")
+ // // At block 606, Alice withdraws all pending rewards and should get 10600.
+ // await this.chef.connect(this.alice).deposit(0, "0", { from: this.alice.address })
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("10600")
+ // })
+ })
+})
diff --git a/omgx_examples/sushi/test/MasterChefV2.test.js b/omgx_examples/sushi/test/MasterChefV2.test.js
new file mode 100644
index 000000000000..a39618b29601
--- /dev/null
+++ b/omgx_examples/sushi/test/MasterChefV2.test.js
@@ -0,0 +1,262 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+const { deploy, getBigNumber, createSLP } = require('./utilities/index');
+
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const brokenRewarderJSON = require('../artifacts/contracts/mocks/RewarderBrokenMock.sol/RewarderBrokenMock.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const MasterChefV2JSON = require('../artifacts/contracts/MasterChefV2.sol/MasterChefV2.ovm.json');
+const RewarderMockJSON = require('../artifacts/contracts/mocks/RewarderMock.sol/RewarderMock.ovm.json');
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+describe("MasterChefV2", function () {
+ before(async function () {
+ await deploy(this, [
+ ["brokenRewarder", brokenRewarderJSON]
+ ])
+ })
+
+ beforeEach(async function () {
+ await deploy(this, [
+ ["sushi", SushiTokenJSON],
+ ])
+
+ await deploy(this,
+ [["lp", ERC20MockJSON, ["LP Token", "LPT", getBigNumber(10)]],
+ ["dummy", ERC20MockJSON, ["Dummy", "DummyT", getBigNumber(10)]],
+ ['chef', MasterChefJSON, [this.sushi.address, alice.address, getBigNumber(100), "0", "0"]]
+ ])
+
+ let transferTX, addTX, approveTX, depositTX, initTX
+ transferTX = await this.sushi.transferOwnership(this.chef.address)
+ await transferTX.wait()
+ addTX = await this.chef.add(100, this.lp.address, true)
+ await addTX.wait()
+ addTX = await this.chef.add(100, this.dummy.address, true)
+ await addTX.wait()
+ approveTX = await this.lp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ depositTX = await this.chef.deposit(0, getBigNumber(10))
+ await depositTX.wait()
+
+ await deploy(this, [
+ ['chef2', MasterChefV2JSON, [this.chef.address, this.sushi.address, 1]],
+ ["rlp", ERC20MockJSON, ["LP", "rLPT", getBigNumber(10)]],
+ ["r", ERC20MockJSON, ["Reward", "RewardT", getBigNumber(100000)]],
+ ])
+ await deploy(this, [["rewarder", RewarderMockJSON, [getBigNumber(1), this.r.address, this.chef2.address]]])
+ approveTX = await this.dummy.approve(this.chef2.address, getBigNumber(10))
+ await approveTX.wait()
+ initTX = await this.chef2.init(this.dummy.address)
+ await initTX.wait()
+ transferTX = await this.rlp.transfer(alice.address, getBigNumber(1))
+ await transferTX.wait()
+ })
+
+ describe("Init", function () {
+ it("Balance of dummyToken should be 0 after init(), repeated execution should fail", async function () {
+ const initTX = await this.chef2.init(this.dummy.address)
+ await expect(initTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+ describe("PoolLength", function () {
+ it("PoolLength should execute", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ expect((await this.chef2.poolLength())).to.be.equal(1);
+ })
+ })
+
+ describe("Set", function() {
+ it("Should emit event LogSetPool", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef2.set(0, 10, this.dummy.address, false))
+ .to.emit(this.chef2, "LogSetPool")
+ .withArgs(0, 10, this.rewarder.address, false)
+ await expect(this.chef2.set(0, 10, this.dummy.address, true))
+ .to.emit(this.chef2, "LogSetPool")
+ .withArgs(0, 10, this.dummy.address, true)
+ })
+
+ it("Should revert if invalid pool", async function () {
+ const setTX = await this.chef2.set(0, 10, this.rewarder.address, false)
+ await expect(setTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("PendingSushi", function() {
+// it("PendingSushi should equal ExpectedSushi", async function () {
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlock()
+// let log2 = await this.chef2.updatePool(0)
+// await advanceBlock()
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber + 1 - log.blockNumber).div(2)
+// let pendingSushi = await this.chef2.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// it("When block is lastRewardBlock", async function () {
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlockTo(3)
+// let log2 = await this.chef2.updatePool(0)
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber - log.blockNumber).div(2)
+// let pendingSushi = await this.chef2.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// })
+
+ describe("MassUpdatePools", function () {
+ it("Should call updatePool", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const massUpdatePoolsTX = await this.chef2.massUpdatePools([0])
+ await massUpdatePoolsTX.wait()
+ //expect('updatePool').to.be.calledOnContract(); //not suported by heardhat
+ //expect('updatePool').to.be.calledOnContractWith(0); //not suported by heardhat
+
+ })
+
+ it("Updating invalid pools should fail", async function () {
+ const massUpdatePoolsTX = await this.chef2.set(0, 10, this.rewarder.address, false)
+ await expect(massUpdatePoolsTX.wait()).to.be.eventually.rejected;
+ })
+})
+
+ describe("Add", function () {
+ it("Should add pool with reward token multiplier", async function () {
+ await expect(this.chef2.add(10, this.rlp.address, this.rewarder.address))
+ .to.emit(this.chef2, "LogPoolAddition")
+ .withArgs(0, 10, this.rlp.address, this.rewarder.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+ // describe("UpdatePool", function () {
+ // it("Should emit event LogUpdatePool", async function () {
+ // const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ // await addTX.wait()
+ // await advanceBlockTo(1)
+ // await expect(this.chef2.updatePool(0))
+ // .to.emit(this.chef2, "LogUpdatePool")
+ // .withArgs(0, (await this.chef2.poolInfo(0)).lastRewardBlock,
+ // (await this.rlp.balanceOf(this.chef2.address)),
+ // (await this.chef2.poolInfo(0)).accSushiPerShare)
+ // })
+
+ // it("Should take else path", async function () {
+ // const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ // await addTX.wait()
+ // await advanceBlockTo(1)
+ // const batchTX = await this.chef2.batch(
+ // [
+ // this.chef2.interface.encodeFunctionData("updatePool", [0]),
+ // this.chef2.interface.encodeFunctionData("updatePool", [0]),
+ // ],
+ // true
+ // )
+ // await batchTX.wait()
+ // })
+ // })
+
+ describe("Deposit", function () {
+ it("Depositing 0 amount", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const approveTX = await this.rlp.approve(this.chef2.address, getBigNumber(10))
+ await approveTX.wait()
+ await expect(this.chef2.deposit(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef2, "Deposit")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+
+ it("Depositing into non-existent pool should fail", async function () {
+ const depositTX = await this.chef2.deposit(1001, getBigNumber(0), alice.address)
+ await expect(depositTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+ describe("Withdraw", function () {
+ it("Withdraw 0 amount", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef2.withdraw(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef2, "Withdraw")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+// describe("Harvest", function () {
+// it("Should give back the correct amount of SUSHI and reward", async function () {
+// await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// expect(await this.chef2.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlockTo(20)
+// await this.chef2.harvestFromMasterChef()
+// let log2 = await this.chef2.withdraw(0, getBigNumber(1), this.alice.address)
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber - log.blockNumber).div(2)
+// expect((await this.chef2.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef2.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(await this.r.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// it("Harvest with empty user balance", async function () {
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.chef2.harvest(0, this.alice.address)
+// })
+
+// it("Harvest for SUSHI-only pool", async function () {
+// await this.chef2.add(10, this.rlp.address, ADDRESS_ZERO)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// expect(await this.chef2.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlock()
+// await this.chef2.harvestFromMasterChef()
+// let log2 = await this.chef2.withdraw(0, getBigNumber(1), this.alice.address)
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber - log.blockNumber).div(2)
+// expect((await this.chef2.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef2.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// })
+
+ describe("EmergencyWithdraw", function() {
+ it("Should emit event EmergencyWithdraw", async function () {
+ let transferTX, addTX, approveTX, depositTX
+ transferTX = await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+ await transferTX.wait()
+ addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ approveTX = await this.rlp.approve(this.chef2.address, getBigNumber(10))
+ await approveTX.wait()
+ depositTX = await this.chef2.deposit(0, getBigNumber(1), alice.address)
+ await depositTX.wait()
+ //await this.chef2.emergencyWithdraw(0, this.alice.address)
+ await expect(this.chef2.connect(alice).emergencyWithdraw(0, alice.address))
+ .to.emit(this.chef2, "EmergencyWithdraw")
+ .withArgs(alice.address, 0, getBigNumber(1), alice.address)
+ })
+ })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/Migrator.test.js b/omgx_examples/sushi/test/Migrator.test.js
new file mode 100644
index 000000000000..525e3ec12a7e
--- /dev/null
+++ b/omgx_examples/sushi/test/Migrator.test.js
@@ -0,0 +1,162 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const MigratorJSON = require('../artifacts/contracts/Migrator.sol/Migrator.ovm.json');
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const UniswapV2FactoryJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Factory.sol/UniswapV2Factory.ovm.json');
+const UniswapV2PairJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Pair.sol/UniswapV2Pair.ovm.json');
+
+describe("Migrator", function () {
+ before(async function () {
+ this.Factory__MasterChef = new ContractFactory(
+ MasterChefJSON.abi,
+ MasterChefJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__ERC20Mock = new ContractFactory(
+ ERC20MockJSON.abi,
+ ERC20MockJSON.bytecode,
+ minter,
+ )
+
+ this.Factory__Migrator = new ContractFactory(
+ MigratorJSON.abi,
+ MigratorJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__UniswapV2Factory = new ContractFactory(
+ UniswapV2FactoryJSON.abi,
+ UniswapV2FactoryJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__UniswapV2Pair = new ContractFactory(
+ UniswapV2PairJSON.abi,
+ UniswapV2PairJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.factory1 = await this.Factory__UniswapV2Factory.deploy(bob.address)
+ await this.factory1.deployTransaction.wait()
+
+ this.factory2 = await this.Factory__UniswapV2Factory.deploy(bob.address)
+ await this.factory2.deployTransaction.wait()
+
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+
+ this.weth = await this.Factory__ERC20Mock.deploy("WETH", "WETH", "100000000")
+ await this.weth.deployTransaction.wait()
+
+ this.token = await this.Factory__ERC20Mock.deploy("TOKEN", "TOKEN", "100000000")
+ await this.token.deployTransaction.wait()
+
+ const pair1 = await this.factory1.createPair(this.weth.address, this.token.address)
+ const pair1TX = await pair1.wait()
+
+ this.lp1 = await this.Factory__UniswapV2Pair.attach(pair1TX.events[1].args.pair)
+
+ const pair2 = await this.factory2.createPair(this.weth.address, this.token.address)
+ const pair2TX = await pair2.wait()
+
+ this.lp2 = await this.Factory__UniswapV2Pair.attach(pair2TX.events[1].args.pair)
+
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "100000")
+ await this.chef.deployTransaction.wait()
+
+ this.migrator = await this.Factory__Migrator.deploy(this.chef.address, this.factory1.address, this.factory2.address, "0")
+ await this.migrator.deployTransaction.wait()
+
+ const transfer = await this.sushi.transferOwnership(this.chef.address)
+ await transfer.wait()
+
+ const add = await this.chef.add("100", this.lp1.address, true)
+ await add.wait()
+ })
+
+ it("should do the migration successfully", async function () {
+ let transfer
+ transfer = await this.token.transfer(this.lp1.address, "10000000")
+ await transfer.wait()
+ transfer = await this.weth.transfer(this.lp1.address, "500000")
+ await transfer.wait()
+ const mint = await this.lp1.mint(minter.address)
+ await mint.wait()
+ expect(await this.lp1.balanceOf(minter.address)).to.equal("2235067")
+
+ // Add some fake revenue
+ transfer = await this.token.transfer(this.lp1.address, "100000")
+ await transfer.wait()
+ transfer = await this.weth.transfer(this.lp1.address, "5000")
+ await transfer.wait()
+ const sync = await this.lp1.sync()
+ await sync.wait()
+ const approve = await this.lp1.connect(minter).approve(this.chef.address, "100000000000", { from: minter.address })
+ await approve.wait()
+ const deposit = await this.chef.connect(minter).deposit("0", "2000000", { from: minter.address })
+ await deposit.wait()
+ expect(await this.lp1.balanceOf(this.chef.address), "2000000")
+ let migrate
+ migrate = await this.chef.migrate(0)
+ await expect(migrate.wait()).to.be.eventually.rejected;
+
+ let setMigrate
+ setMigrate = await this.chef.setMigrator(this.migrator.address)
+ await setMigrate.wait()
+ migrate = await this.chef.migrate(0)
+ await expect(migrate.wait()).to.be.eventually.rejected;
+
+ setMigrate = await this.factory2.setMigrator(this.migrator.address)
+ await setMigrate.wait()
+ migrate = await this.chef.migrate(0)
+ await migrate.wait()
+ expect(await this.lp1.balanceOf(this.chef.address)).to.equal("0")
+ expect(await this.lp2.balanceOf(this.chef.address)).to.equal("2000000")
+
+ const withdraw = await this.chef.connect(minter).withdraw("0", "2000000")
+ await withdraw.wait()
+ transfer = await this.lp2.connect(minter).transfer(this.lp2.address, "2000000")
+ await transfer.wait()
+ const burn = await this.lp2.burn(bob.address)
+ await burn.wait()
+ expect(await this.token.balanceOf(bob.address)).to.equal("9033718")
+ expect(await this.weth.balanceOf(bob.address)).to.equal("451685")
+ })
+
+ it("should allow first minting from public only after migrator is gone", async function () {
+ const setMigrate = await this.factory2.setMigrator(this.migrator.address)
+ await setMigrate.wait()
+
+ this.tokenx = await this.Factory__ERC20Mock.deploy("TOKENX", "TOKENX", "100000000")
+ await this.tokenx.deployTransaction.wait()
+
+ const pair = await this.factory2.createPair(this.weth.address, this.tokenx.address)
+ const pairTX = await pair.wait()
+
+ this.lpx = await this.Factory__UniswapV2Pair.attach(pairTX.events[1].args.pair)
+
+ let transfer
+ transfer = await this.weth.connect(minter).transfer(this.lpx.address, "10000000")
+ await transfer.wait()
+ transfer = await this.tokenx.connect(minter).transfer(this.lpx.address, "500000")
+ await transfer.wait()
+ const mint = await this.lpx.mint(minter.address)
+ await expect(mint.wait()).to.be.eventually.rejected;
+ })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/MiniChefV2.test.js b/omgx_examples/sushi/test/MiniChefV2.test.js
new file mode 100644
index 000000000000..0efdb0c60ed2
--- /dev/null
+++ b/omgx_examples/sushi/test/MiniChefV2.test.js
@@ -0,0 +1,250 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+const { deploy, getBigNumber, createSLP } = require('./utilities/index');
+
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const brokenRewarderJSON = require('../artifacts/contracts/mocks/RewarderBrokenMock.sol/RewarderBrokenMock.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const MiniChefV2JSON = require('../artifacts/contracts/MiniChefV2.sol/MiniChefV2.ovm.json');
+const RewarderMockJSON = require('../artifacts/contracts/mocks/RewarderMock.sol/RewarderMock.ovm.json');
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+describe("MiniChefV2", function () {
+ before(async function () {
+ await deploy(this, [
+ ["brokenRewarder", brokenRewarderJSON]
+ ])
+ })
+
+ beforeEach(async function () {
+ await deploy(this, [
+ ["sushi", SushiTokenJSON],
+ ])
+
+ await deploy(this,
+ [["lp", ERC20MockJSON, ["LP Token", "LPT", getBigNumber(10)]],
+ ["dummy", ERC20MockJSON, ["Dummy", "DummyT", getBigNumber(10)]],
+ ['chef', MiniChefV2JSON, [this.sushi.address]],
+ ["rlp", ERC20MockJSON, ["LP", "rLPT", getBigNumber(10)]],
+ ["r", ERC20MockJSON, ["Reward", "RewardT", getBigNumber(100000)]],
+ ])
+
+ await deploy(this, [["rewarder", RewarderMockJSON, [getBigNumber(1), this.r.address, this.chef.address]]])
+
+ const mintTX = await this.sushi.mint(this.chef.address, getBigNumber(10000))
+ await mintTX.wait()
+ const approveTX = await this.lp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ const setupTX = await this.chef.setSushiPerSecond("10000000000000000")
+ await setupTX.wait()
+ const transferTX = await this.rlp.transfer(alice.address, getBigNumber(1))
+ await transferTX.wait()
+ })
+
+ describe("PoolLength", function () {
+ it("PoolLength should execute", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ expect((await this.chef.poolLength())).to.be.equal(1);
+ })
+ })
+
+ describe("Set", function() {
+ it("Should emit event LogSetPool", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef.set(0, 10, this.dummy.address, false))
+ .to.emit(this.chef, "LogSetPool")
+ .withArgs(0, 10, this.rewarder.address, false)
+ await expect(this.chef.set(0, 10, this.dummy.address, true))
+ .to.emit(this.chef, "LogSetPool")
+ .withArgs(0, 10, this.dummy.address, true)
+ })
+
+ it("Should revert if invalid pool", async function () {
+ const setTX = await this.chef.set(0, 10, this.rewarder.address, false)
+ await expect(setTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("PendingSushi", function() {
+// it("PendingSushi should equal ExpectedSushi", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceTime(86400)
+// let log2 = await this.chef.updatePool(0)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// let pendingSushi = await this.chef.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// it("When time is lastRewardTime", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlockTo(3)
+// let log2 = await this.chef.updatePool(0)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// let pendingSushi = await this.chef.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// })
+
+// describe("MassUpdatePools", function () {
+// it("Should call updatePool", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await advanceBlockTo(1)
+// await this.chef.massUpdatePools([0])
+// //expect('updatePool').to.be.calledOnContract(); //not suported by heardhat
+// //expect('updatePool').to.be.calledOnContractWith(0); //not suported by heardhat
+
+// })
+
+// it("Updating invalid pools should fail", async function () {
+// let err;
+// try {
+// await this.chef.massUpdatePools([0, 10000, 100000])
+// } catch (e) {
+// err = e;
+// }
+
+// assert.equal(err.toString(), "Error: VM Exception while processing transaction: invalid opcode")
+// })
+// })
+
+ describe("Add", function () {
+ it("Should add pool with reward token multiplier", async function () {
+ await expect(this.chef.add(10, this.rlp.address, this.rewarder.address))
+ .to.emit(this.chef, "LogPoolAddition")
+ .withArgs(0, 10, this.rlp.address, this.rewarder.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("UpdatePool", function () {
+// it("Should emit event LogUpdatePool", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await advanceBlockTo(1)
+// await expect(this.chef.updatePool(0))
+// .to.emit(this.chef, "LogUpdatePool")
+// .withArgs(0, (await this.chef.poolInfo(0)).lastRewardTime,
+// (await this.rlp.balanceOf(this.chef.address)),
+// (await this.chef.poolInfo(0)).accSushiPerShare)
+// })
+
+// it("Should take else path", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await advanceBlockTo(1)
+// await this.chef.batch(
+// [
+// this.chef.interface.encodeFunctionData("updatePool", [0]),
+// this.chef.interface.encodeFunctionData("updatePool", [0]),
+// ],
+// true
+// )
+// })
+// })
+
+ describe("Deposit", function () {
+ it("Depositing 0 amount", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const approveTX = await this.rlp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ await expect(this.chef.deposit(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef, "Deposit")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+
+ it("Depositing into non-existent pool should fail", async function () {
+ const depositTX = await this.chef.deposit(1001, getBigNumber(0), bob.address)
+ await expect(depositTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+ describe("Withdraw", function () {
+ it("Withdraw 0 amount", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef.withdraw(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef, "Withdraw")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("Harvest", function () {
+// it("Should give back the correct amount of SUSHI and reward", async function () {
+// await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// expect(await this.chef.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceTime(86400)
+// let log2 = await this.chef.withdraw(0, getBigNumber(1), this.alice.address)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// expect((await this.chef.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(await this.r.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// it("Harvest with empty user balance", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.chef.harvest(0, this.alice.address)
+// })
+
+// it("Harvest for SUSHI-only pool", async function () {
+// await this.chef.add(10, this.rlp.address, ADDRESS_ZERO)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// expect(await this.chef.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlock()
+// let log2 = await this.chef.withdraw(0, getBigNumber(1), this.alice.address)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// expect((await this.chef.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// })
+
+ describe("EmergencyWithdraw", function() {
+ it("Should emit event EmergencyWithdraw", async function () {
+ const transferTX = await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+ await transferTX.wait()
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const approveTX = await this.rlp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ const depositTX = await this.chef.deposit(0, getBigNumber(1), alice.address)
+ await depositTX.wait()
+ //await this.chef.emergencyWithdraw(0, this.alice.address)
+ await expect(this.chef.connect(alice).emergencyWithdraw(0, alice.address))
+ .to.emit(this.chef, "EmergencyWithdraw")
+ .withArgs(alice.address, 0, getBigNumber(1), alice.address)
+ })
+ })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/SushiBar.test.js b/omgx_examples/sushi/test/SushiBar.test.js
new file mode 100644
index 000000000000..60792f4ca25a
--- /dev/null
+++ b/omgx_examples/sushi/test/SushiBar.test.js
@@ -0,0 +1,97 @@
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { ContractFactory } = require('ethers');
+const { bob, alice, carol } = require('./utilities/wallet');
+
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const SushiBarJSON = require('../artifacts/contracts/SushiBar.sol/SushiBar.ovm.json');
+
+describe("SushiBar", function () {
+ before(async function () {
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiBar = new ContractFactory(
+ SushiBarJSON.abi,
+ SushiBarJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+ this.bar = await this.Factory__SushiBar.deploy(this.sushi.address)
+ await this.bar.deployTransaction.wait()
+ let mint
+ mint = await this.sushi.mint(alice.address, "100")
+ await mint.wait()
+ mint = await this.sushi.mint(bob.address, "100")
+ await mint.wait()
+ mint = await this.sushi.mint(carol.address, "100")
+ await mint.wait()
+ })
+
+ it("should not allow enter if not enough approve", async function () {
+ let barTransfer, approve
+ barTransfer = await this.bar.enter("100")
+ await expect(barTransfer.wait()).to.be.eventually.rejected;
+
+ approve = await this.sushi.approve(this.bar.address, "50")
+ await approve.wait()
+ barTransfer = await this.bar.enter("100")
+ await expect(barTransfer.wait()).to.be.eventually.rejected;
+
+ approve = await this.sushi.approve(this.bar.address, "100")
+ await approve.wait()
+ barTransfer = await this.bar.enter("100")
+ await barTransfer.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("100")
+ })
+
+ it("should not allow withraw more than what you have", async function () {
+ const approve = await this.sushi.approve(this.bar.address, "100")
+ await approve.wait()
+ const barTransfer = await this.bar.enter("100")
+ await barTransfer.wait()
+ const barWithdraw = await this.bar.leave("200")
+ await expect(barWithdraw.wait()).to.be.eventually.rejected;
+ })
+
+ it("should work with more than one participant", async function () {
+ let approve, barTransfer, barDeposit, barWithdraw
+ approve = await this.sushi.approve(this.bar.address, "100")
+ await approve.wait()
+ approve = await this.sushi.connect(alice).approve(this.bar.address, "100")
+ await approve.wait()
+ // Bob enters and gets 20 shares. Alice enters and gets 10 shares.
+ barTransfer = await this.bar.enter("20")
+ await barTransfer.wait()
+ barTransfer = await this.bar.connect(alice).enter("10")
+ await barTransfer.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("20")
+ expect(await this.bar.balanceOf(alice.address)).to.equal("10")
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("30")
+ // SushiBar get 20 more SUSHIs from an external source.
+ barTransfer = await this.sushi.connect(carol).transfer(this.bar.address, "20")
+ await barTransfer.wait()
+ // Alice deposits 10 more SUSHIs. She should receive 10*30/50 = 6 shares.
+ barDeposit = await this.bar.enter("10")
+ await barDeposit.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("26")
+ expect(await this.bar.balanceOf(alice.address)).to.equal("10")
+ // Bob withdraws 5 shares. He should receive 5*60/36 = 8 shares
+ barWithdraw = await this.bar.connect(alice).leave("5")
+ await barWithdraw.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("26")
+ expect(await this.bar.balanceOf(alice.address)).to.equal("5")
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("52")
+ expect(await this.sushi.balanceOf(bob.address)).to.equal("70")
+ expect(await this.sushi.balanceOf(alice.address)).to.equal("98")
+ })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/SushiMaker.test.js b/omgx_examples/sushi/test/SushiMaker.test.js
new file mode 100644
index 000000000000..d5761b873cc5
--- /dev/null
+++ b/omgx_examples/sushi/test/SushiMaker.test.js
@@ -0,0 +1,221 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+const { deploy, getBigNumber, createSLP } = require('./utilities/index');
+
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const UniswapV2FactoryJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Factory.sol/UniswapV2Factory.ovm.json');
+const UniswapV2PairJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Pair.sol/UniswapV2Pair.ovm.json');
+const SushiMakerExploitMockJSON = require('../artifacts/contracts/mocks/SushiMakerExploitMock.sol/SushiMakerExploitMock.ovm.json')
+const SushiMakerJSON = require('../artifacts/contracts/SushiMaker.sol/SushiMaker.ovm.json');
+const SushiBarJSON = require('../artifacts/contracts/SushiBar.sol/SushiBar.ovm.json');
+
+describe("SushiMaker", function () {
+ before(async function () {
+ this.Factory__UniswapV2Pair = new ContractFactory(
+ UniswapV2PairJSON.abi,
+ UniswapV2PairJSON.bytecode,
+ bob,
+ )
+ })
+ beforeEach(async function () {
+ await deploy(this, [
+ ["sushi", ERC20MockJSON, ["SUSHI", "SUSHI", getBigNumber("10000000")]],
+ ["dai", ERC20MockJSON, ["DAI", "DAI", getBigNumber("10000000")]],
+ ["mic", ERC20MockJSON, ["MIC", "MIC", getBigNumber("10000000")]],
+ ["usdc", ERC20MockJSON, ["USDC", "USDC", getBigNumber("10000000")]],
+ ["weth", ERC20MockJSON, ["WETH", "ETH", getBigNumber("10000000")]],
+ ["strudel", ERC20MockJSON, ["$TRDL", "$TRDL", getBigNumber("10000000")]],
+ ["factory", UniswapV2FactoryJSON, [bob.address]],
+ ])
+ await deploy(this, [["bar", SushiBarJSON, [this.sushi.address]]])
+ await deploy(this, [["sushiMaker", SushiMakerJSON, [this.factory.address, this.bar.address, this.sushi.address, this.weth.address]]])
+ await deploy(this, [["exploiter", SushiMakerExploitMockJSON, [this.sushiMaker.address]]])
+ await createSLP(this, "sushiEth", this.sushi, this.weth, getBigNumber(10))
+ await createSLP(this, "strudelEth", this.strudel, this.weth, getBigNumber(10))
+ await createSLP(this, "daiEth", this.dai, this.weth, getBigNumber(10))
+ await createSLP(this, "usdcEth", this.usdc, this.weth, getBigNumber(10))
+ await createSLP(this, "micUSDC", this.mic, this.usdc, getBigNumber(10))
+ await createSLP(this, "sushiUSDC", this.sushi, this.usdc, getBigNumber(10))
+ await createSLP(this, "daiUSDC", this.dai, this.usdc, getBigNumber(10))
+ await createSLP(this, "daiMIC", this.dai, this.mic, getBigNumber(10))
+ })
+ describe("setBridge", function () {
+ it("does not allow to set bridge for Sushi", async function () {
+ const setBridgeTX = await this.sushiMaker.setBridge(this.sushi.address, this.weth.address)
+ await expect(setBridgeTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("does not allow to set bridge for WETH", async function () {
+ const setBridgeTX = await this.sushiMaker.setBridge(this.weth.address, this.sushi.address)
+ await expect(setBridgeTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("does not allow to set bridge to itself", async function () {
+ const setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.dai.address)
+ await expect(setBridgeTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("emits correct event on bridge", async function () {
+ await expect(this.sushiMaker.setBridge(this.dai.address, this.sushi.address))
+ .to.emit(this.sushiMaker, "LogBridgeSet")
+ .withArgs(this.dai.address, this.sushi.address)
+ })
+ })
+ describe("convert", function () {
+ it("should convert SUSHI - ETH", async function () {
+ let transferTX, convertTX
+ transferTX = await this.sushiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.sushi.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushiEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1897569270781234370")
+ })
+
+ it("should convert USDC - ETH", async function () {
+ let transferTX, convertTX
+ transferTX = await this.usdcEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.usdc.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.usdcEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("should convert $TRDL - ETH", async function () {
+ let transferTX, convertTX
+ transferTX = await this.strudelEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.strudel.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.strudelEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("should convert USDC - SUSHI", async function () {
+ let transferTX, convertTX
+ transferTX = await this.sushiUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.usdc.address, this.sushi.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushiUSDC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1897569270781234370")
+ })
+
+ it("should convert using standard ETH path", async function () {
+ let transferTX, convertTX
+ transferTX = await this.daiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("converts MIC/USDC using more complex path", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.micUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.usdc.address, this.sushi.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.mic.address, this.usdc.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.mic.address, this.usdc.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.micUSDC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("converts DAI/USDC using more complex path", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.daiUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.usdc.address, this.sushi.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.usdc.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.usdc.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiUSDC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("converts DAI/MIC using two step path", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.daiMIC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.usdc.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.mic.address, this.dai.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.mic.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiMIC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1200963016721363748")
+ })
+
+ it("reverts if it loops back", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.daiMIC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.mic.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.mic.address, this.dai.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.mic.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("reverts if caller is not EOA", async function () {
+ let transferTX, convertTX
+ transferTX = await this.sushiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.exploiter.convert(this.sushi.address, this.weth.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("reverts if pair does not exist", async function () {
+ let convertTX
+ convertTX = await this.sushiMaker.convert(this.mic.address, this.micUSDC.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("reverts if no path is available", async function () {
+ let transferTX, convertTX
+ transferTX = await this.micUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.mic.address, this.usdc.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.micUSDC.balanceOf(this.sushiMaker.address)).to.equal(getBigNumber(1))
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal(0)
+ })
+ })
+
+ describe("convertMultiple", function () {
+ it("should allow to convert multiple", async function () {
+ let transferTX, convertTX
+ transferTX = await this.daiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ transferTX = await this.sushiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convertMultiple([this.dai.address, this.sushi.address], [this.weth.address, this.weth.address])
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("3186583558687783097")
+ })
+ })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/SushiRoll.test.js b/omgx_examples/sushi/test/SushiRoll.test.js
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/omgx_examples/sushi/test/SushiToken.test.js b/omgx_examples/sushi/test/SushiToken.test.js
new file mode 100644
index 000000000000..ae0093626d7c
--- /dev/null
+++ b/omgx_examples/sushi/test/SushiToken.test.js
@@ -0,0 +1,85 @@
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { bob, alice, carol } = require('./utilities/wallet');
+
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+
+describe("SushiToken", function () {
+ before(async function () {
+ this.Factory__SushiTokenPool = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiTokenPool.deploy()
+ await this.sushi.deployTransaction.wait()
+ })
+
+ it("should have correct name and symbol and decimal", async function () {
+ const name = await this.sushi.name()
+ const symbol = await this.sushi.symbol()
+ const decimals = await this.sushi.decimals()
+ expect(name, "SushiToken")
+ expect(symbol, "SUSHI")
+ expect(decimals, "18")
+ })
+
+ it("should only allow owner to mint token", async function () {
+ const bobMint = await this.sushi.mint(bob.address, "1000")
+ await bobMint.wait()
+ const aliceMint = await this.sushi.mint(alice.address, "100")
+ await aliceMint.wait()
+
+ // not the owner
+ const carolMint = await this.sushi.connect(alice).mint(carol.address, "1000")
+ await expect(carolMint.wait()).to.be.eventually.rejected;
+
+ const totalSupply = await this.sushi.totalSupply()
+ const aliceBal = await this.sushi.balanceOf(alice.address)
+ const bobBal = await this.sushi.balanceOf(bob.address)
+ const carolBal = await this.sushi.balanceOf(carol.address)
+ expect(totalSupply).to.equal("1100")
+ expect(aliceBal).to.equal("100")
+ expect(bobBal).to.equal("1000")
+ expect(carolBal).to.equal("0")
+ })
+
+ it("should supply token transfers properly", async function () {
+ const aliceMint = await this.sushi.mint(alice.address, "100")
+ await aliceMint.wait()
+ const bobMint = await this.sushi.mint(bob.address, "1000")
+ await bobMint.wait()
+ const carolTX = await this.sushi.transfer(carol.address, "10")
+ await carolTX.wait()
+ const bobTX = await this.sushi.connect(bob).transfer(carol.address, "100", {
+ from: bob.address,
+ })
+ await bobTX.wait()
+
+ const totalSupply = await this.sushi.totalSupply()
+ const aliceBal = await this.sushi.balanceOf(alice.address)
+ const bobBal = await this.sushi.balanceOf(bob.address)
+ const carolBal = await this.sushi.balanceOf(carol.address)
+ expect(totalSupply, "1100")
+ expect(aliceBal, "90")
+ expect(bobBal, "900")
+ expect(carolBal, "110")
+ })
+
+ it("should fail if you try to do bad transfers", async function () {
+ const aliceMint = await this.sushi.mint(alice.address, "100")
+ await aliceMint.wait()
+ //ERC20: transfer amount exceeds balance
+ const carolTX = await this.sushi.transfer(carol.address, "110");
+ await expect(carolTX.wait()).to.be.eventually.rejected;
+ //ERC20: transfer amount exceeds balance
+ const bobTX = await this.sushi.connect(bob).transfer(carol.address, "1", { from: bob.address });
+ await expect(bobTX.wait()).to.be.eventually.rejected;
+ })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/Timelock.test.js b/omgx_examples/sushi/test/Timelock.test.js
new file mode 100644
index 000000000000..e8df4504388e
--- /dev/null
+++ b/omgx_examples/sushi/test/Timelock.test.js
@@ -0,0 +1,161 @@
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { encodeParameters } = require('./utilities/index');
+const { latest, duration, increase } = require('./utilities/time');
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const TimelockJSON = require('../artifacts/contracts/governance/Timelock.sol/Timelock.ovm.json');
+
+/******************************************************************/
+/************* evm_increaseTime is not supported ****************/
+/**** this could be something Optimism adds in the near future! ***/
+/******************************************************************/
+
+describe("Timelock", function () {
+ before(async function () {
+ this.Factory__MasterChef = new ContractFactory(
+ MasterChefJSON.abi,
+ MasterChefJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__ERC20Mock = new ContractFactory(
+ ERC20MockJSON.abi,
+ ERC20MockJSON.bytecode,
+ minter,
+ )
+
+ this.Factory__Timelock = new ContractFactory(
+ TimelockJSON.abi,
+ TimelockJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+ this.timelock = await this.Factory__Timelock.deploy(bob.address, "259200")
+ await this.timelock.deployTransaction.wait()
+ })
+
+ it("should not allow non-owner to do operation", async function () {
+ let transferOwnership
+ transferOwnership = await this.sushi.transferOwnership(this.timelock.address);
+ await transferOwnership.wait()
+
+ transferOwnership = await this.sushi.transferOwnership(carol.address);
+ await expect(transferOwnership.wait()).to.be.eventually.rejected;
+
+ transferOwnership = await this.sushi.connect(alice).transferOwnership(carol.address);
+ await expect(transferOwnership.wait()).to.be.eventually.rejected;
+
+ const timelock = await this.timelock.connect(alice).queueTransaction(
+ this.sushi.address,
+ "0",
+ "transferOwnership(address)",
+ encodeParameters(["address"], [carol.address]),
+ (await latest()).add(duration.days(4))
+ )
+ await expect(timelock.wait()).to.be.eventually.rejected;
+ })
+
+ /******************************************************************/
+ /************* evm_increaseTime is not supported ****************/
+ /**** this could be something Optimism adds in the near future! ***/
+ /******************************************************************/
+
+ // it("should do the timelock thing", async function () {
+ // let transferOwnership, queueTransaction
+ // transferOwnership = await this.sushi.connect(bob).transferOwnership(this.timelock.address);
+ // await transferOwnership.wait()
+
+ // const eta = (await latest()).add(duration.days(4))
+ // queueTransaction = await this.timelock
+ // .connect(bob)
+ // .queueTransaction(this.sushi.address, "0", "transferOwnership(address)", encodeParameters(["address"], [carol.address]), eta)
+ // await queueTransaction.wait()
+
+ // await increase(duration.days(1))
+
+ // queueTransaction = await this.timelock
+ // .connect(bob)
+ // .executeTransaction(this.sushi.address, "0", "transferOwnership(address)", encodeParameters(["address"], [carol.address]), eta)
+ // await expect(queueTransaction.wait()).to.be.eventually.rejected;
+
+ // await increase(duration.days(4))
+ // await this.timelock
+ // .connect(alice)
+ // .executeTransaction(this.sushi.address, "0", "transferOwnership(address)", encodeParameters(["address"], [carol.address]), eta)
+ // expect(await this.sushi.owner()).to.equal(carol.address)
+ // })
+
+ // it("should also work with MasterChef", async function () {
+ // let transferOwner
+ // this.lp1 = await this.Factory__ERC20Mock.deploy("LPToken", "LP", "10000000000")
+ // await this.lp1.deployTransaction.wait()
+ // this.lp2 = await this.Factory__ERC20Mock.deploy("LPToken", "LP", "10000000000")
+ // await this.lp2.deployTransaction.wait()
+ // this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "1000")
+ // await this.chef.deployTransaction.wait()
+ // transferOwner = await this.sushi.transferOwnership(this.chef.address)
+ // await transferOwner.wait()
+ // const deposit = await this.chef.add("100", this.lp1.address, true)
+ // await deposit.wait()
+ // transferOwner = await this.chef.transferOwnership(this.timelock.address)
+ // await transferOwner.wait()
+ // const eta = (await latest()).add(duration.days(4))
+ // await this.timelock
+ // .connect(this.bob)
+ // .queueTransaction(
+ // this.chef.address,
+ // "0",
+ // "set(uint256,uint256,bool)",
+ // encodeParameters(["uint256", "uint256", "bool"], ["0", "200", false]),
+ // eta
+ // )
+ // await this.timelock
+ // .connect(this.bob)
+ // .queueTransaction(
+ // this.chef.address,
+ // "0",
+ // "add(uint256,address,bool)",
+ // encodeParameters(["uint256", "address", "bool"], ["100", this.lp2.address, false]),
+ // eta
+ // )
+ // await increase(duration.days(4))
+ // await this.timelock
+ // .connect(this.bob)
+ // .executeTransaction(
+ // this.chef.address,
+ // "0",
+ // "set(uint256,uint256,bool)",
+ // encodeParameters(["uint256", "uint256", "bool"], ["0", "200", false]),
+ // eta
+ // )
+ // await this.timelock
+ // .connect(this.bob)
+ // .executeTransaction(
+ // this.chef.address,
+ // "0",
+ // "add(uint256,address,bool)",
+ // encodeParameters(["uint256", "address", "bool"], ["100", this.lp2.address, false]),
+ // eta
+ // )
+ // expect((await this.chef.poolInfo("0")).allocPoint).to.equal("200")
+ // expect(await this.chef.totalAllocPoint()).to.equal("300")
+ // expect(await this.chef.poolLength()).to.equal("2")
+ // })
+})
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/utilities/index.js b/omgx_examples/sushi/test/utilities/index.js
new file mode 100644
index 000000000000..c04cf4df4ea2
--- /dev/null
+++ b/omgx_examples/sushi/test/utilities/index.js
@@ -0,0 +1,57 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { bob } = require('./wallet');
+
+const BASE_TEN = 10
+const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"
+
+function encodeParameters(types, values) {
+ const abi = new ethers.utils.AbiCoder()
+ return abi.encode(types, values)
+}
+
+async function deploy(thisObject, contracts) {
+ for (let i in contracts) {
+ let contract = contracts[i]
+ // console.log(`Deploying ${contract[0]}...`)
+ let Factory__contract = new ContractFactory(
+ contract[1].abi,
+ contract[1].bytecode,
+ bob,
+ )
+ thisObject[contract[0]] = await Factory__contract.deploy(...(contract[2] || []))
+ await thisObject[contract[0]].deployTransaction.wait()
+ }
+}
+
+async function createSLP(thisObject, name, tokenA, tokenB, amount) {
+ let transfer, mint
+ // console.log(`Creating SLP ${name}...`)
+ const createPairTx = await thisObject.factory.createPair(tokenA.address, tokenB.address)
+ const pairTX = await createPairTx.wait()
+
+ const _pair = pairTX.events[1].args.pair
+
+ thisObject[name] = await thisObject.Factory__UniswapV2Pair.attach(_pair)
+
+ transfer = await tokenA.transfer(thisObject[name].address, amount)
+ await transfer.wait()
+ transfer = await tokenB.transfer(thisObject[name].address, amount)
+ await transfer.wait()
+
+ mint = await thisObject[name].mint(bob.address)
+ await mint.wait()
+}
+
+// Defaults to e18 using amount * 10^18
+function getBigNumber(amount, decimals = 18) {
+ return BigNumber.from(amount).mul(BigNumber.from(BASE_TEN).pow(decimals))
+}
+
+module.exports = {
+ getBigNumber,
+ createSLP,
+ deploy,
+ encodeParameters,
+ BASE_TEN,
+ ADDRESS_ZERO,
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/utilities/time.js b/omgx_examples/sushi/test/utilities/time.js
new file mode 100644
index 000000000000..8bfcad74cfb0
--- /dev/null
+++ b/omgx_examples/sushi/test/utilities/time.js
@@ -0,0 +1,68 @@
+const { ethers } = require("hardhat")
+const { BigNumber, providers } = require('ethers');
+const { Provider } = require('./wallet');
+
+async function advanceBlock() {
+ const mine = await Provider.send("evm_mine", [])
+ await mine.wait()
+}
+
+async function advanceBlockTo(blockNumber) {
+ const block = await Provider.getBlockNumber()
+ console.log({ block })
+ for (let i = await Provider.getBlockNumber(); i < blockNumber; i++) {
+ await advanceBlock()
+ }
+}
+
+async function increase(value) {
+ const increaseTime = await Provider.send("evm_increaseTime", [value.toNumber()])
+ console.log(increaseTime)
+ await increaseTime.wait()
+ await advanceBlock()
+}
+
+async function latest() {
+ const block = await Provider.getBlock("latest")
+ return BigNumber.from(block.timestamp)
+}
+
+async function advanceTimeAndBlock(time) {
+ await advanceTime(time)
+ await advanceBlock()
+}
+
+async function advanceTime(time) {
+ await Provider.send("evm_increaseTime", [time])
+}
+
+const duration = {
+ seconds: function (val) {
+ return BigNumber.from(val)
+ },
+ minutes: function (val) {
+ return BigNumber.from(val).mul(this.seconds("60"))
+ },
+ hours: function (val) {
+ return BigNumber.from(val).mul(this.minutes("60"))
+ },
+ days: function (val) {
+ return BigNumber.from(val).mul(this.hours("24"))
+ },
+ weeks: function (val) {
+ return BigNumber.from(val).mul(this.days("7"))
+ },
+ years: function (val) {
+ return BigNumber.from(val).mul(this.days("365"))
+ },
+}
+
+module.exports = {
+ advanceBlock,
+ advanceBlockTo,
+ increase,
+ latest,
+ advanceTimeAndBlock,
+ advanceTime,
+ duration,
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/test/utilities/wallet.js b/omgx_examples/sushi/test/utilities/wallet.js
new file mode 100644
index 000000000000..967529c55e81
--- /dev/null
+++ b/omgx_examples/sushi/test/utilities/wallet.js
@@ -0,0 +1,24 @@
+const {
+ Contract,
+ Wallet,
+ ContractFactory,
+ BigNumber,
+ providers
+} = require('ethers');
+require('dotenv').config();
+
+const Provider = new providers.JsonRpcProvider(process.env.L2_NODE_WEB3_URL || "http://localhost:8545");
+const bob = new Wallet(process.env.TEST_PRIVATE_KEY_1, Provider);
+const alice = new Wallet(process.env.TEST_PRIVATE_KEY_2, Provider);
+const carol = new Wallet(process.env.TEST_PRIVATE_KEY_3, Provider);
+const dev = new Wallet(process.env.TEST_PRIVATE_KEY_4, Provider);
+const minter = new Wallet(process.env.TEST_PRIVATE_KEY_5, Provider);
+
+module.exports = {
+ bob,
+ alice,
+ carol,
+ dev,
+ minter,
+ Provider,
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/tsconfig.json b/omgx_examples/sushi/tsconfig.json
new file mode 100644
index 000000000000..65c3bc2f5230
--- /dev/null
+++ b/omgx_examples/sushi/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./dist",
+ "resolveJsonModule": true
+ },
+ "include": ["./test"],
+ "files": ["./hardhat.config.ts"]
+}
\ No newline at end of file
diff --git a/omgx_examples/sushi/yarn.lock b/omgx_examples/sushi/yarn.lock
new file mode 100644
index 000000000000..ae8ae4400c7f
--- /dev/null
+++ b/omgx_examples/sushi/yarn.lock
@@ -0,0 +1,8979 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
+ integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
+ dependencies:
+ "@babel/highlight" "^7.14.5"
+
+"@babel/helper-validator-identifier@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8"
+ integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==
+
+"@babel/highlight@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
+ integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.5"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@boringcrypto/boring-solidity@boringcrypto/BoringSolidity#e06e943":
+ version "1.0.4"
+ resolved "https://codeload.github.com/boringcrypto/BoringSolidity/tar.gz/e06e943e7e8a168ed0395ef663a17fd71a6949a2"
+
+"@ensdomains/ens@^0.4.4":
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc"
+ integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==
+ dependencies:
+ bluebird "^3.5.2"
+ eth-ens-namehash "^2.0.8"
+ solc "^0.4.20"
+ testrpc "0.0.1"
+ web3-utils "^1.0.0-beta.31"
+
+"@ensdomains/resolver@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89"
+ integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
+
+"@eth-optimism/contracts@0.0.2-alpha.14":
+ version "0.0.2-alpha.14"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.0.2-alpha.14.tgz#382ae9250e7d89e7729bcfe73ffdb85897e385c2"
+ integrity sha512-EeOKiQ+Tu/bZqlq2bsXJegRYHhBXlcDO+fNXG1NJyies23rcLrjR7LMocJmw/F9TpYJ08UqvOHttD5w//cntpg==
+ dependencies:
+ "@eth-optimism/solc" "^0.6.12-alpha.1"
+ "@ethersproject/contracts" "^5.0.5"
+ "@ethersproject/hardware-wallets" "^5.0.8"
+ "@openzeppelin/contracts" "^3.3.0"
+ ethers "5.0.0"
+ ganache-core "^2.12.1"
+
+"@eth-optimism/ethereumjs-vm@^4.2.0-alpha.2", "@eth-optimism/ethereumjs-vm@^4.2.0-alpha.3":
+ version "4.2.0-alpha.3"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/ethereumjs-vm/-/ethereumjs-vm-4.2.0-alpha.3.tgz#f1831462b395629627e7f774b6eca7cfe33d46b4"
+ integrity sha512-gqqMDJEx+WY5UcU6yyC2xNZyIwyl3dFPwfGi6VcrtlyzMwXj4OIYtSEZOBAgufNt02Z19Exbww4lornXgTgGyw==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ debug "^4.2.0"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.0"
+ ethers "^5.0.14"
+ 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"
+ util.promisify "^1.0.0"
+ uuid "^8.3.0"
+
+"@eth-optimism/hardhat-ovm@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.0.3.tgz#4d9e34e4a466a4750b68785bec73ff76e44f6198"
+ integrity sha512-J4B+HXjP2DA8FWaKTbZ+7qIULNM3OxQrkXklcfb63WRjvlR3xWNK72BBMMVA4V1W9BwDNx5hgr08hehg6mmV1w==
+ dependencies:
+ node-fetch "^2.6.1"
+
+"@eth-optimism/plugins@^0.0.16":
+ version "0.0.16"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/plugins/-/plugins-0.0.16.tgz#eae8a3e3be4d92aac866e31acad96291d4ae5c76"
+ integrity sha512-vXYljJzQu+kSUydG6WIgGxfnP54nbutKmzbAcy8j2GJgLLhtZSxCIA+UhBiO1mA4k/qFeUGJcf8kZfaddKygIQ==
+ dependencies:
+ "@eth-optimism/contracts" "0.0.2-alpha.14"
+ "@eth-optimism/ethereumjs-vm" "^4.2.0-alpha.2"
+ "@nomiclabs/hardhat-truffle5" "^2.0.0"
+ bn.js "^5.1.3"
+ ethereumjs-account "^3.0.0"
+ ethjs-common-v1 "npm:ethereumjs-common@1.5.0"
+ ethjs-util-v6 "npm:ethereumjs-util@6.2.1"
+ node-fetch "^2.6.1"
+
+"@eth-optimism/solc@^0.6.12-alpha.1":
+ version "0.6.12-alpha.1"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/solc/-/solc-0.6.12-alpha.1.tgz#041876f83b34c6afe2f19dfe9626568df6ed8590"
+ integrity sha512-Ky73mo+2iNJs/VTaT751nMeZ7hXns0TBAlffTOxIOsScjAZ/zi/KWsDUo3r89aV2JKXcYAU/bLidxF40MVJeUw==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+"@ethereum-waffle/chai@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.0.tgz#2477877410a96bf370edd64df905b04fb9aba9d5"
+ integrity sha512-GVaFKuFbFUclMkhHtQTDnWBnBQMJc/pAbfbFj/nnIK237WPLsO3KDDslA7m+MNEyTAOFrcc0CyfruAGGXAQw3g==
+ dependencies:
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.0"
+
+"@ethereum-waffle/compiler@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz#68917321212563544913de33e408327745cb1284"
+ integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw==
+ dependencies:
+ "@resolver-engine/imports" "^0.3.3"
+ "@resolver-engine/imports-fs" "^0.3.3"
+ "@typechain/ethers-v5" "^2.0.0"
+ "@types/mkdirp" "^0.5.2"
+ "@types/node-fetch" "^2.5.5"
+ ethers "^5.0.1"
+ mkdirp "^0.5.1"
+ node-fetch "^2.6.1"
+ solc "^0.6.3"
+ ts-generator "^0.1.1"
+ typechain "^3.0.0"
+
+"@ethereum-waffle/ens@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.3.0.tgz#d54f4c8e6b7bcafdc13ab294433f45416b2b2791"
+ integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw==
+ dependencies:
+ "@ensdomains/ens" "^0.4.4"
+ "@ensdomains/resolver" "^0.2.4"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/mock-contract@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz#7b331f1c95c5d46ee9478f7a6be2869f707d307a"
+ integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw==
+ dependencies:
+ "@ethersproject/abi" "^5.0.1"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/provider@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.0.tgz#a36a0890d4fbc230e807870c8d3b683594efef00"
+ integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ==
+ dependencies:
+ "@ethereum-waffle/ens" "^3.3.0"
+ ethers "^5.0.1"
+ ganache-core "^2.13.2"
+ patch-package "^6.2.2"
+ postinstall-postinstall "^2.1.0"
+
+"@ethersproject/abi@5.0.0-beta.153":
+ version "5.0.0-beta.153"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
+ integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==
+ dependencies:
+ "@ethersproject/address" ">=5.0.0-beta.128"
+ "@ethersproject/bignumber" ">=5.0.0-beta.130"
+ "@ethersproject/bytes" ">=5.0.0-beta.129"
+ "@ethersproject/constants" ">=5.0.0-beta.128"
+ "@ethersproject/hash" ">=5.0.0-beta.128"
+ "@ethersproject/keccak256" ">=5.0.0-beta.127"
+ "@ethersproject/logger" ">=5.0.0-beta.129"
+ "@ethersproject/properties" ">=5.0.0-beta.131"
+ "@ethersproject/strings" ">=5.0.0-beta.130"
+
+"@ethersproject/abi@5.0.7":
+ version "5.0.7"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b"
+ integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==
+ dependencies:
+ "@ethersproject/address" "^5.0.4"
+ "@ethersproject/bignumber" "^5.0.7"
+ "@ethersproject/bytes" "^5.0.4"
+ "@ethersproject/constants" "^5.0.4"
+ "@ethersproject/hash" "^5.0.4"
+ "@ethersproject/keccak256" "^5.0.3"
+ "@ethersproject/logger" "^5.0.5"
+ "@ethersproject/properties" "^5.0.3"
+ "@ethersproject/strings" "^5.0.4"
+
+"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242"
+ integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/abstract-provider@5.4.0", "@ethersproject/abstract-provider@^5.0.0", "@ethersproject/abstract-provider@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d"
+ integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+
+"@ethersproject/abstract-signer@5.4.0", "@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65"
+ integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/address@5.4.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
+ integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+
+"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.0.0", "@ethersproject/base64@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
+ integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+
+"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6"
+ integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/bignumber@5.4.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9"
+ integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
+ integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/constants@5.4.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
+ integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+
+"@ethersproject/contracts@5.4.0", "@ethersproject/contracts@^5.0.0", "@ethersproject/contracts@^5.0.5":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.0.tgz#e05fe6bd33acc98741e27d553889ec5920078abb"
+ integrity sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw==
+ dependencies:
+ "@ethersproject/abi" "^5.4.0"
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+
+"@ethersproject/hardware-wallets@^5.0.8":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hardware-wallets/-/hardware-wallets-5.4.0.tgz#bce275b395e26b6f50481095331157614490a473"
+ integrity sha512-Ea4ymm4etZoSWy93OcEGZkuVqyYdl/RjMlaXY6yQIYjsGi75sm4apbTiBA8DA9uajkv1FVakJZEBBTaVGgnBLA==
+ dependencies:
+ "@ledgerhq/hw-app-eth" "5.27.2"
+ "@ledgerhq/hw-transport" "5.26.0"
+ "@ledgerhq/hw-transport-u2f" "5.26.0"
+ ethers "^5.4.0"
+ optionalDependencies:
+ "@ledgerhq/hw-transport-node-hid" "5.26.0"
+
+"@ethersproject/hash@5.4.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.0", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
+ integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.0.0", "@ethersproject/hdnode@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac"
+ integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/basex" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/pbkdf2" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.0.0", "@ethersproject/json-wallets@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95"
+ integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hdnode" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/pbkdf2" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
+ integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@5.4.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
+ integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
+
+"@ethersproject/networks@5.4.0", "@ethersproject/networks@^5.0.0", "@ethersproject/networks@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.0.tgz#71eecd3ef3755118b42c1a5d2a44a7e07202e10a"
+ integrity sha512-5fywtKRDcnaVeA5SjxXH3DOQqe/IbeD/plwydi94SdPps1fbDUrnO6SzDExaruBZXxpxJcO9upG9UComsei4bg==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.0.0", "@ethersproject/pbkdf2@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c"
+ integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+
+"@ethersproject/properties@5.4.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
+ integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/providers@5.4.0", "@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.1.2":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.0.tgz#1b9eeaf394d790a662ec66373d7219c82f4433f2"
+ integrity sha512-XRmI9syLnkNdLA8ikEeg0duxmwSWTTt9S+xabnTOyI51JPJyhQ0QUNT+wvmod218ebb7rLupHDPQ7UVe2/+Tjg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/basex" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.4.0", "@ethersproject/random@^5.0.0", "@ethersproject/random@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16"
+ integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.0.0", "@ethersproject/rlp@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
+ integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.0.0", "@ethersproject/sha2@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371"
+ integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.0.0", "@ethersproject/signing-key@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
+ integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.4.0", "@ethersproject/solidity@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec"
+ integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/sha2" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/strings@5.4.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
+ integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
+ integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+
+"@ethersproject/units@5.4.0", "@ethersproject/units@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe"
+ integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/wallet@5.4.0", "@ethersproject/wallet@^5.0.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353"
+ integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/hdnode" "^5.4.0"
+ "@ethersproject/json-wallets" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/random" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/web@5.4.0", "@ethersproject/web@^5.0.0", "@ethersproject/web@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
+ integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==
+ dependencies:
+ "@ethersproject/base64" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.0.0", "@ethersproject/wordlists@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7"
+ integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@jest/types@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
+ integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^15.0.0"
+ chalk "^4.0.0"
+
+"@ledgerhq/cryptoassets@^5.27.2":
+ version "5.53.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz#11dcc93211960c6fd6620392e4dd91896aaabe58"
+ integrity sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw==
+ dependencies:
+ invariant "2"
+
+"@ledgerhq/devices@^5.26.0", "@ledgerhq/devices@^5.51.1":
+ version "5.51.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7"
+ integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==
+ dependencies:
+ "@ledgerhq/errors" "^5.50.0"
+ "@ledgerhq/logs" "^5.50.0"
+ rxjs "6"
+ semver "^7.3.5"
+
+"@ledgerhq/errors@^5.26.0", "@ledgerhq/errors@^5.50.0":
+ version "5.50.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9"
+ integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==
+
+"@ledgerhq/hw-app-eth@5.27.2":
+ version "5.27.2"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz#65a2ed613a69340e0cd69c942147455ec513d006"
+ integrity sha512-llNdrE894cCN8j6yxJEUniciyLVcLmu5N0UmIJLOObztG+5rOF4bX54h4SreTWK+E10Z0CzHSeyE5Lz/tVcqqQ==
+ dependencies:
+ "@ledgerhq/cryptoassets" "^5.27.2"
+ "@ledgerhq/errors" "^5.26.0"
+ "@ledgerhq/hw-transport" "^5.26.0"
+ bignumber.js "^9.0.1"
+ rlp "^2.2.6"
+
+"@ledgerhq/hw-transport-node-hid-noevents@^5.26.0":
+ version "5.51.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.51.1.tgz#71f37f812e448178ad0bcc2258982150d211c1ab"
+ integrity sha512-9wFf1L8ZQplF7XOY2sQGEeOhpmBRzrn+4X43kghZ7FBDoltrcK+s/D7S+7ffg3j2OySyP6vIIIgloXylao5Scg==
+ dependencies:
+ "@ledgerhq/devices" "^5.51.1"
+ "@ledgerhq/errors" "^5.50.0"
+ "@ledgerhq/hw-transport" "^5.51.1"
+ "@ledgerhq/logs" "^5.50.0"
+ node-hid "2.1.1"
+
+"@ledgerhq/hw-transport-node-hid@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.26.0.tgz#69bc4f8067cdd9c09ef4aed0e0b3c58328936e4b"
+ integrity sha512-qhaefZVZatJ6UuK8Wb6WSFNOLWc2mxcv/xgsfKi5HJCIr4bPF/ecIeN+7fRcEaycxj4XykY6Z4A7zDVulfFH4w==
+ dependencies:
+ "@ledgerhq/devices" "^5.26.0"
+ "@ledgerhq/errors" "^5.26.0"
+ "@ledgerhq/hw-transport" "^5.26.0"
+ "@ledgerhq/hw-transport-node-hid-noevents" "^5.26.0"
+ "@ledgerhq/logs" "^5.26.0"
+ lodash "^4.17.20"
+ node-hid "1.3.0"
+ usb "^1.6.3"
+
+"@ledgerhq/hw-transport-u2f@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.26.0.tgz#b7d9d13193eb82b051fd7a838cd652372f907ec5"
+ integrity sha512-QTxP1Rsh+WZ184LUOelYVLeaQl3++V3I2jFik+l9JZtakwEHjD0XqOT750xpYNL/vfHsy31Wlz+oicdxGzFk+w==
+ dependencies:
+ "@ledgerhq/errors" "^5.26.0"
+ "@ledgerhq/hw-transport" "^5.26.0"
+ "@ledgerhq/logs" "^5.26.0"
+ u2f-api "0.2.7"
+
+"@ledgerhq/hw-transport@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz#bfedc3d48400ad2fe48278d9444344b72aa9d0fe"
+ integrity sha512-NFeJOJmyEfAX8uuIBTpocWHcz630sqPcXbu864Q+OCBm4EK5UOKV1h/pX7e0xgNIKY8zhJ/O4p4cIZp9tnXLHQ==
+ dependencies:
+ "@ledgerhq/devices" "^5.26.0"
+ "@ledgerhq/errors" "^5.26.0"
+ events "^3.2.0"
+
+"@ledgerhq/hw-transport@^5.26.0", "@ledgerhq/hw-transport@^5.51.1":
+ version "5.51.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578"
+ integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==
+ dependencies:
+ "@ledgerhq/devices" "^5.51.1"
+ "@ledgerhq/errors" "^5.50.0"
+ events "^3.3.0"
+
+"@ledgerhq/logs@^5.26.0", "@ledgerhq/logs@^5.50.0":
+ version "5.50.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186"
+ integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==
+
+"@nomiclabs/ethereumjs-vm@^4.1.1":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz#2f8817113ca0fb6c44c1b870d0a809f0e026a6cc"
+ integrity sha512-8WmX94mMcJaZ7/m7yBbyuS6B+wuOul+eF+RY9fBpGhNaUpyMR/vFIcDojqcWQ4Yafe1tMKY5LDu2yfT4NZgV4Q==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.0"
+ fake-merkle-patricia-tree "^1.0.1"
+ functional-red-black-tree "^1.0.1"
+ merkle-patricia-tree "3.0.0"
+ rustbn.js "~0.2.0"
+ safe-buffer "^5.1.1"
+ util.promisify "^1.0.0"
+
+"@nomiclabs/hardhat-ethers@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
+ integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
+
+"@nomiclabs/hardhat-truffle5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.0.tgz#1363b7f4f90e3d5b049d22e5e6d3519ba1b91fdf"
+ integrity sha512-JLjyfeXTiSqa0oLHcN3i8kD4coJa4Gx6uAXybGv3aBiliEbHddLSzmBWx0EU69a1/Ad5YDdGSqVnjB8mkUCr/g==
+ dependencies:
+ "@nomiclabs/truffle-contract" "^4.2.23"
+ "@types/chai" "^4.2.0"
+ chai "^4.2.0"
+ ethereumjs-util "^6.1.0"
+ fs-extra "^7.0.1"
+
+"@nomiclabs/hardhat-waffle@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2"
+ integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==
+ dependencies:
+ "@types/sinon-chai" "^3.2.3"
+ "@types/web3" "1.0.19"
+
+"@nomiclabs/truffle-contract@^4.2.23":
+ version "4.2.23"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/truffle-contract/-/truffle-contract-4.2.23.tgz#3431d09d2400413d3a14650494abc0a6233c16d4"
+ integrity sha512-Khj/Ts9r0LqEpGYhISbc+8WTOd6qJ4aFnDR+Ew+neqcjGnhwrIvuihNwPFWU6hDepW3Xod6Y+rTo90N8sLRDjw==
+ dependencies:
+ "@truffle/blockchain-utils" "^0.0.25"
+ "@truffle/contract-schema" "^3.2.5"
+ "@truffle/debug-utils" "^4.2.9"
+ "@truffle/error" "^0.0.11"
+ "@truffle/interface-adapter" "^0.4.16"
+ bignumber.js "^7.2.1"
+ ethereum-ens "^0.8.0"
+ ethers "^4.0.0-beta.1"
+ source-map-support "^0.5.19"
+
+"@openzeppelin/contracts@^3.1.0", "@openzeppelin/contracts@^3.3.0":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1.tgz#03c891fec7f93be0ae44ed74e57a122a38732ce7"
+ integrity sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ==
+
+"@resolver-engine/core@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967"
+ integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==
+ dependencies:
+ debug "^3.1.0"
+ is-url "^1.2.4"
+ request "^2.85.0"
+
+"@resolver-engine/fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973"
+ integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports-fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b"
+ integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==
+ dependencies:
+ "@resolver-engine/fs" "^0.3.3"
+ "@resolver-engine/imports" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc"
+ integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+ hosted-git-info "^2.6.0"
+ path-browserify "^1.0.0"
+ url "^0.11.0"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/hub" "5.30.0"
+ "@sentry/tracing" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^7.1.0":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
+ integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@solidity-parser/parser@^0.7.1":
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.7.1.tgz#660210130e4237476cb55e2882064809f80f861e"
+ integrity sha512-5ma2uuwPAEX1TPl2rAPAAuGlBkKnn2oUKQvnhTFlDIB8U/KDWX77FpHtL6Rcz+OwqSCWx9IClxACgyIEJ/GhIw==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@tenderly/hardhat-tenderly@^1.0.12":
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.0.12.tgz#fa64da2bf2f6d35a1c131ac9ccaf2f7e8b189a50"
+ integrity sha512-zx2zVpbBxGWVp+aLgf59sZR5lxdqfq/PjqUhga6+iazukQNu/Y6pLfVnCcF1ggvLsf7gnMjwLe3YEx/GxCAykQ==
+ dependencies:
+ axios "^0.21.1"
+ fs-extra "^9.0.1"
+ js-yaml "^3.14.0"
+
+"@truffle/blockchain-utils@^0.0.25":
+ version "0.0.25"
+ resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.25.tgz#f4b320890113d282f25f1a1ecd65b94a8b763ac1"
+ integrity sha512-XA5m0BfAWtysy5ChHyiAf1fXbJxJXphKk+eZ9Rb9Twi6fn3Jg4gnHNwYXJacYFEydqT5vr2s4Ou812JHlautpw==
+ dependencies:
+ source-map-support "^0.5.19"
+
+"@truffle/codec@^0.7.1":
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.7.1.tgz#2ef0fa40109040796afbebb8812c872122100ae4"
+ integrity sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg==
+ dependencies:
+ big.js "^5.2.2"
+ bn.js "^4.11.8"
+ borc "^2.1.2"
+ debug "^4.1.0"
+ lodash.clonedeep "^4.5.0"
+ lodash.escaperegexp "^4.1.2"
+ lodash.partition "^4.6.0"
+ lodash.sum "^4.0.2"
+ semver "^6.3.0"
+ source-map-support "^0.5.19"
+ utf8 "^3.0.0"
+ web3-utils "1.2.9"
+
+"@truffle/contract-schema@^3.2.5":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.1.tgz#13b404383d438b48960862022a20102970323666"
+ integrity sha512-2gvu6gxJtbbI67H2Bwh2rBuej+1uCV3z4zKFzQZP00hjNoL+QfybrmBcOVB88PflBeEB+oUXuwQfDoKX3TXlnQ==
+ dependencies:
+ ajv "^6.10.0"
+ crypto-js "^3.1.9-1"
+ debug "^4.3.1"
+
+"@truffle/debug-utils@^4.2.9":
+ version "4.2.14"
+ resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-4.2.14.tgz#28431691bc3a96bad19e31733d957ac79059d4e7"
+ integrity sha512-g5UTX2DPTzrjRjBJkviGI2IrQRTTSvqjmNWCNZNXP+vgQKNxL9maLZhQ6oA3BuuByVW/kusgYeXt8+W1zynC8g==
+ dependencies:
+ "@truffle/codec" "^0.7.1"
+ "@trufflesuite/chromafi" "^2.2.1"
+ chalk "^2.4.2"
+ debug "^4.1.0"
+ highlight.js "^9.15.8"
+ highlightjs-solidity "^1.0.18"
+
+"@truffle/error@^0.0.11":
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.11.tgz#2789c0042d7e796dcbb840c7a9b5d2bcd8e0e2d8"
+ integrity sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw==
+
+"@truffle/interface-adapter@^0.4.16":
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.24.tgz#5d6d4f10c756e967f19ac2ad1620d11d25c034bb"
+ integrity sha512-2Zho4dJbm/XGwNleY7FdxcjXiAR3SzdGklgrAW4N/YVmltaJv6bT56ACIbPNN6AdzkTSTO65OlsB/63sfSa/VA==
+ dependencies:
+ bn.js "^5.1.3"
+ ethers "^4.0.32"
+ web3 "1.3.6"
+
+"@trufflesuite/chromafi@^2.2.1":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-2.2.2.tgz#d3fc507aa8504faffc50fb892cedcfe98ff57f77"
+ integrity sha512-mItQwVBsb8qP/vaYHQ1kDt2vJLhjoEXJptT6y6fJGvFophMFhOI/NsTVUa0nJL1nyMeFiS6hSYuNVdpQZzB1gA==
+ dependencies:
+ ansi-mark "^1.0.0"
+ ansi-regex "^3.0.0"
+ array-uniq "^1.0.3"
+ camelcase "^4.1.0"
+ chalk "^2.3.2"
+ cheerio "^1.0.0-rc.2"
+ detect-indent "^5.0.0"
+ he "^1.1.1"
+ highlight.js "^10.4.1"
+ lodash.merge "^4.6.2"
+ min-indent "^1.0.0"
+ strip-ansi "^4.0.0"
+ strip-indent "^2.0.0"
+ super-split "^1.1.0"
+
+"@typechain/ethers-v5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810"
+ integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==
+ dependencies:
+ ethers "^5.0.2"
+
+"@types/bn.js@*", "@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai@*", "@types/chai@^4.2.0":
+ version "4.2.19"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.19.tgz#80f286b515897413c7a35bdda069cc80f2344233"
+ integrity sha512-jRJgpRBuY+7izT7/WNXP/LsMO9YonsstuL+xuvycDyESpoDoIAsMd7suwpB4h9oEWB+ZlPTqJJ8EHomzNhwTPQ==
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
+ integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
+ integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03"
+ integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==
+
+"@types/mkdirp@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
+ integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node-fetch@^2.5.5":
+ version "2.5.10"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132"
+ integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "15.12.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.5.tgz#9a78318a45d75c9523d2396131bd3cca54b2d185"
+ integrity sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==
+
+"@types/node@^12.12.6":
+ version "12.20.15"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.15.tgz#10ee6a6a3f971966fddfa3f6e89ef7a73ec622df"
+ integrity sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.0.tgz#2e8332cc7363f887d32ec5496b207d26ba8052bb"
+ integrity sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==
+
+"@types/resolve@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d"
+ integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==
+ dependencies:
+ "@types/node" "*"
+
+"@types/sinon-chai@^3.2.3":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48"
+ integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==
+ dependencies:
+ "@types/chai" "*"
+ "@types/sinon" "*"
+
+"@types/sinon@*":
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.2.tgz#f360d2f189c0fd433d14aeb97b9d705d7e4cc0e4"
+ integrity sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==
+ dependencies:
+ "@sinonjs/fake-timers" "^7.1.0"
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff"
+ integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==
+
+"@types/underscore@*":
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.2.tgz#9441e0f6402bbcb72dbee771582fa57c5a1dedd3"
+ integrity sha512-Ls2ylbo7++ITrWk2Yc3G/jijwSq5V3GT0tlgVXEl2kKYXY3ImrtmTCoE2uyTWFRI5owMBriloZFWbE1SXOsE7w==
+
+"@types/web3@1.0.19":
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924"
+ integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==
+ dependencies:
+ "@types/bn.js" "*"
+ "@types/underscore" "*"
+
+"@types/yargs-parser@*":
+ version "20.2.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9"
+ integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==
+
+"@types/yargs@^15.0.0":
+ version "15.0.13"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc"
+ integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
+ integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
+ integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv@^6.10.0, ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
+ integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
+ansi-colors@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-mark@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/ansi-mark/-/ansi-mark-1.0.4.tgz#1cd4ba8d57f15f109d6aaf6ec9ca9786c8a4ee6c"
+ integrity sha1-HNS6jVfxXxCdaq9uycqXhsik7mw=
+ dependencies:
+ ansi-regex "^3.0.0"
+ array-uniq "^1.0.3"
+ chalk "^2.3.2"
+ strip-ansi "^4.0.0"
+ super-split "^1.1.0"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.1, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
+ integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
+ dependencies:
+ typical "^2.6.0"
+
+array-back@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022"
+ integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
+ dependencies:
+ typical "^2.6.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-uniq@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-eventemitter@^0.2.2:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381"
+ integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+ dependencies:
+ lodash "^4.17.11"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+available-typed-arrays@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9"
+ integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+axios@^0.21.1:
+ version "0.21.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
+ integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
+ dependencies:
+ follow-redirects "^1.10.0"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.14, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ 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"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
+ dependencies:
+ 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@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+ integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+ integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+ integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
+ dependencies:
+ 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@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
+ dependencies:
+ 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@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ 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@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
+ dependencies:
+ 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@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
+ dependencies:
+ 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@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ 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@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ 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@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babelify@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+ integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ 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"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+bignumber.js@^7.2.1:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f"
+ integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==
+
+bignumber.js@^9.0.0, bignumber.js@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bindings@^1.4.0, bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bip39@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
+ integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
+ dependencies:
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ unorm "^1.3.3"
+
+bl@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
+blakejs@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+ integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@4.11.8:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+borc@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19"
+ integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==
+ dependencies:
+ bignumber.js "^9.0.0"
+ buffer "^5.5.0"
+ commander "^2.15.0"
+ ieee754 "^1.1.13"
+ iso-url "~0.4.7"
+ json-text-sequence "~0.1.0"
+ readable-stream "^3.6.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer-xor@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289"
+ integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+bytewise-core@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42"
+ integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+ dependencies:
+ typewise-core "^1.2"
+
+bytewise@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e"
+ integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
+ dependencies:
+ bytewise-core "^1.2.2"
+ typewise "^1.0.3"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ 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"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+cachedown@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15"
+ integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+ dependencies:
+ abstract-leveldown "^2.4.1"
+ lru-cache "^3.2.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+ integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30001240"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz#ec15d125b590602c8731545c5351ff054ad2d52f"
+ integrity sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chai-as-promised@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0"
+ integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==
+ dependencies:
+ check-error "^1.0.2"
+
+chai@^4.2.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
+ integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.1"
+ type-detect "^4.0.5"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+cheerio-select@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823"
+ integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==
+ dependencies:
+ css-select "^4.1.3"
+ css-what "^5.0.1"
+ domelementtype "^2.2.0"
+ domhandler "^4.2.0"
+ domutils "^2.7.0"
+
+cheerio@^1.0.0-rc.2:
+ version "1.0.0-rc.10"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e"
+ integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==
+ dependencies:
+ cheerio-select "^1.5.0"
+ dom-serializer "^1.3.2"
+ domhandler "^4.2.0"
+ htmlparser2 "^6.1.0"
+ parse5 "^6.0.1"
+ parse5-htmlparser2-tree-adapter "^6.0.1"
+ tslib "^2.2.0"
+
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
+chokidar@^3.4.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@2.1.2, clone@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46"
+ integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
+ dependencies:
+ array-back "^2.0.0"
+ find-replace "^1.0.3"
+ typical "^2.6.1"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+commander@^2.15.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.5.1:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-pure@^3.0.1:
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.1.tgz#8356f6576fa2aa8e54ca6fe02620968ff010eed7"
+ integrity sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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@^3.1.9-1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b"
+ integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==
+
+css-select@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067"
+ integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^5.0.0"
+ domhandler "^4.2.0"
+ domutils "^2.6.0"
+ nth-check "^2.0.0"
+
+css-what@^5.0.0, css-what@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad"
+ integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.2.6:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+decompress-response@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
+ integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
+ dependencies:
+ mimic-response "^2.0.0"
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.0"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
+ integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+delimit-stream@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b"
+ integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+detect-indent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+ integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
+
+detect-libc@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+diff-sequences@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
+ integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-serializer@^1.0.1, dom-serializer@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
+ integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.2.0"
+ entities "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
+ integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
+
+domhandler@^4.0.0, domhandler@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059"
+ integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==
+ dependencies:
+ domelementtype "^2.2.0"
+
+domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442"
+ integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==
+ dependencies:
+ dom-serializer "^1.0.1"
+ domelementtype "^2.2.0"
+ domhandler "^4.2.0"
+
+dotenv@^8.2.0:
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
+ integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
+
+dotignore@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
+ integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
+ dependencies:
+ minimatch "^3.0.4"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.47:
+ version "1.3.760"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.760.tgz#cf19c9ae9ff23c0ac6bb289e3b71c09b7c3f8de1"
+ integrity sha512-XPKwjX6pHezJWB4FLVuSil9gGmU6XYl27ahUwEHODXF4KjCEB8RuIT05MkU1au2Tdye57o49yY0uCMK+bwUt+A==
+
+elliptic@6.5.3:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
+ integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
+ 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"
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@5.0.4, encoding-down@~5.0.0:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614"
+ integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
+ dependencies:
+ abstract-leveldown "^5.0.0"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+ xtend "^4.0.1"
+
+encoding@^0.1.11:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enquirer@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+ integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+ dependencies:
+ ansi-colors "^4.1.1"
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
+ integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
+ dependencies:
+ 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-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f"
+ integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==
+ dependencies:
+ cross-fetch "^2.1.1"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
+ integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==
+ dependencies:
+ 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"
+
+eth-lib@0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca"
+ integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-sig-util@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e"
+ integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==
+ dependencies:
+ 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-sig-util@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
+ integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
+ dependencies:
+ ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
+ ethereumjs-util "^5.1.1"
+
+eth-sig-util@^2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5"
+ integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==
+ dependencies:
+ ethereumjs-abi "0.6.8"
+ ethereumjs-util "^5.1.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.0"
+
+eth-tx-summary@^3.1.2:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
+ integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
+ dependencies:
+ 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"
+
+ethashjs@~0.0.7:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9"
+ integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==
+ dependencies:
+ async "^2.1.2"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.2"
+ miller-rabin "^4.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-ens@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57"
+ integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==
+ dependencies:
+ bluebird "^3.4.7"
+ eth-ens-namehash "^2.0.0"
+ js-sha3 "^0.5.7"
+ pako "^1.0.4"
+ underscore "^1.8.3"
+ web3 "^1.0.0-beta.34"
+
+ethereum-waffle@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720"
+ integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ==
+ dependencies:
+ "@ethereum-waffle/chai" "^3.4.0"
+ "@ethereum-waffle/compiler" "^3.4.0"
+ "@ethereum-waffle/mock-contract" "^3.3.0"
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.1"
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.8"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9"
+ integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
+ dependencies:
+ ethereumjs-util "^6.0.0"
+ rlp "^2.2.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@2.2.2, ethereumjs-block@^2.2.0, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-blockchain@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f"
+ integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==
+ dependencies:
+ async "^2.6.1"
+ ethashjs "~0.0.7"
+ ethereumjs-block "~2.2.2"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.1.0"
+ flow-stoplight "^1.0.0"
+ level-mem "^3.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.2"
+ semaphore "^1.1.0"
+
+ethereumjs-common@1.5.0, "ethjs-common-v1@npm:ethereumjs-common@1.5.0":
+ name ethjs-common-v1
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd"
+ integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==
+
+ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
+ integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
+
+ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, "ethjs-util-v6@npm:ethereumjs-util@6.2.1":
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0"
+ integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^7.0.2:
+ version "7.0.10"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
+ integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab"
+ integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.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"
+ util.promisify "^1.0.0"
+
+ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
+ integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474"
+ integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^6.0.0"
+ randombytes "^2.0.6"
+ safe-buffer "^5.1.2"
+ scryptsy "^1.2.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.0.tgz#76558a3020766f310a49f4e1a4c6c1e331761abd"
+ integrity sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==
+ dependencies:
+ "@ethersproject/abi" "^5.0.0"
+ "@ethersproject/abstract-provider" "^5.0.0"
+ "@ethersproject/abstract-signer" "^5.0.0"
+ "@ethersproject/address" "^5.0.0"
+ "@ethersproject/base64" "^5.0.0"
+ "@ethersproject/bignumber" "^5.0.0"
+ "@ethersproject/bytes" "^5.0.0"
+ "@ethersproject/constants" "^5.0.0"
+ "@ethersproject/contracts" "^5.0.0"
+ "@ethersproject/hash" "^5.0.0"
+ "@ethersproject/hdnode" "^5.0.0"
+ "@ethersproject/json-wallets" "^5.0.0"
+ "@ethersproject/keccak256" "^5.0.0"
+ "@ethersproject/logger" "^5.0.0"
+ "@ethersproject/networks" "^5.0.0"
+ "@ethersproject/pbkdf2" "^5.0.0"
+ "@ethersproject/properties" "^5.0.0"
+ "@ethersproject/providers" "^5.0.0"
+ "@ethersproject/random" "^5.0.0"
+ "@ethersproject/rlp" "^5.0.0"
+ "@ethersproject/sha2" "^5.0.0"
+ "@ethersproject/signing-key" "^5.0.0"
+ "@ethersproject/solidity" "^5.0.0"
+ "@ethersproject/strings" "^5.0.0"
+ "@ethersproject/transactions" "^5.0.0"
+ "@ethersproject/units" "^5.0.0"
+ "@ethersproject/wallet" "^5.0.0"
+ "@ethersproject/web" "^5.0.0"
+ "@ethersproject/wordlists" "^5.0.0"
+
+ethers@^4.0.0-beta.1, ethers@^4.0.32:
+ version "4.0.48"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.48.tgz#330c65b8133e112b0613156e57e92d9009d8fbbe"
+ integrity sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==
+ dependencies:
+ aes-js "3.0.0"
+ bn.js "^4.4.0"
+ elliptic "6.5.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"
+
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.14, ethers@^5.0.2, ethers@^5.1.4, ethers@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.0.tgz#e9fe4b39350bcce5edd410c70bd57ba328ecf474"
+ integrity sha512-hqN1x0CV8VMpQ25WnNEjaMqtB3nA4DRAb2FSmmNaUbD1dF6kWbHs8YaXbVvD37FCg3GTEyc4rV9Pxafk1ByHKw==
+ dependencies:
+ "@ethersproject/abi" "5.4.0"
+ "@ethersproject/abstract-provider" "5.4.0"
+ "@ethersproject/abstract-signer" "5.4.0"
+ "@ethersproject/address" "5.4.0"
+ "@ethersproject/base64" "5.4.0"
+ "@ethersproject/basex" "5.4.0"
+ "@ethersproject/bignumber" "5.4.0"
+ "@ethersproject/bytes" "5.4.0"
+ "@ethersproject/constants" "5.4.0"
+ "@ethersproject/contracts" "5.4.0"
+ "@ethersproject/hash" "5.4.0"
+ "@ethersproject/hdnode" "5.4.0"
+ "@ethersproject/json-wallets" "5.4.0"
+ "@ethersproject/keccak256" "5.4.0"
+ "@ethersproject/logger" "5.4.0"
+ "@ethersproject/networks" "5.4.0"
+ "@ethersproject/pbkdf2" "5.4.0"
+ "@ethersproject/properties" "5.4.0"
+ "@ethersproject/providers" "5.4.0"
+ "@ethersproject/random" "5.4.0"
+ "@ethersproject/rlp" "5.4.0"
+ "@ethersproject/sha2" "5.4.0"
+ "@ethersproject/signing-key" "5.4.0"
+ "@ethersproject/solidity" "5.4.0"
+ "@ethersproject/strings" "5.4.0"
+ "@ethersproject/transactions" "5.4.0"
+ "@ethersproject/units" "5.4.0"
+ "@ethersproject/wallet" "5.4.0"
+ "@ethersproject/web" "5.4.0"
+ "@ethersproject/wordlists" "5.4.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0, events@^3.2.0, events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ 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"
+
+expand-template@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+
+expect@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417"
+ integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ ansi-styles "^4.0.0"
+ jest-get-type "^26.3.0"
+ jest-matcher-utils "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-regex-util "^26.0.0"
+
+express@^4.14.0:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ 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"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-replace@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
+ integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flow-stoplight@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b"
+ integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+
+follow-redirects@^1.10.0, follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3, for-each@~0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+ integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2, fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.1:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1, function-bind@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+ganache-core@^2.12.1, ganache-core@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3"
+ integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==
+ dependencies:
+ abstract-leveldown "3.0.0"
+ async "2.6.2"
+ bip39 "2.5.0"
+ cachedown "1.0.0"
+ clone "2.1.2"
+ debug "3.2.6"
+ encoding-down "5.0.4"
+ eth-sig-util "3.0.0"
+ ethereumjs-abi "0.6.8"
+ ethereumjs-account "3.0.0"
+ ethereumjs-block "2.2.2"
+ ethereumjs-common "1.5.0"
+ ethereumjs-tx "2.1.2"
+ ethereumjs-util "6.2.1"
+ ethereumjs-vm "4.2.0"
+ heap "0.2.6"
+ keccak "3.0.1"
+ level-sublevel "6.6.4"
+ levelup "3.1.1"
+ lodash "4.17.20"
+ lru-cache "5.1.1"
+ merkle-patricia-tree "3.0.0"
+ patch-package "6.2.2"
+ seedrandom "3.0.1"
+ source-map-support "0.5.12"
+ tmp "0.1.0"
+ web3-provider-engine "14.2.1"
+ websocket "1.0.32"
+ optionalDependencies:
+ ethereumjs-wallet "0.6.5"
+ web3 "1.2.11"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ 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"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+ integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
+
+glob-parent@~5.1.0, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ 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@^7.1.2, glob@^7.1.3, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hardhat@2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.6.tgz#51f161e00b3c03f03fbf32027009d0ca50ad56db"
+ integrity sha512-wFTamcSUBMGwpgFxWu7ptg5o07FQyr8Ce8072rzE+QjpwM0uD3GRdhlqn+O1w+awQZ7AhK44njpAoRPUelOf/Q==
+ dependencies:
+ "@nomiclabs/ethereumjs-vm" "^4.1.1"
+ "@sentry/node" "^5.18.1"
+ "@solidity-parser/parser" "^0.7.1"
+ "@types/bn.js" "^4.11.5"
+ "@types/lru-cache" "^5.1.0"
+ abort-controller "^3.0.0"
+ adm-zip "^0.4.16"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ eth-sig-util "^2.5.2"
+ ethereum-cryptography "^0.1.2"
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.0"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^6.1.0"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "^7.1.3"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ lodash "^4.17.11"
+ merkle-patricia-tree "^3.0.0"
+ mocha "^7.1.2"
+ node-fetch "^2.6.0"
+ qs "^6.7.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ slash "^3.0.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ "true-case-path" "^2.2.1"
+ tsort "0.0.1"
+ uuid "^3.3.2"
+ ws "^7.2.1"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3, has@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+ integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0, he@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+highlight.js@^10.4.1:
+ version "10.7.3"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
+ integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
+
+highlight.js@^9.15.8:
+ version "9.18.5"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825"
+ integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==
+
+highlightjs-solidity@^1.0.18:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.1.1.tgz#ed0f246d0f8cba647291baff68fb131252067424"
+ integrity sha512-NNcuj6GC0OP8qIrXVaqUA33d/nQoGvwRPS3FR2juIT+I1LAcNkebLbEp1AxzH0TiQ9InPxG62P/FnON8Ns15sQ==
+
+hmac-drbg@^1.0.0, hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+htmlparser2@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
+ integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.0.0"
+ domutils "^2.5.2"
+ entities "^2.0.0"
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+immutable@^4.0.0-rc.12:
+ version "4.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
+ integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+invariant@2, invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-generator-function@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c"
+ integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-regex@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+ integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+ dependencies:
+ has "^1.0.3"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e"
+ integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==
+ dependencies:
+ available-typed-arrays "^1.0.2"
+ call-bind "^1.0.2"
+ es-abstract "^1.18.0-next.2"
+ foreach "^2.0.5"
+ has-symbols "^1.0.1"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+iso-url@~0.4.7:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385"
+ integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+jest-diff@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
+ integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-get-type@^26.3.0:
+ version "26.3.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
+ integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
+
+jest-matcher-utils@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a"
+ integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-message-util@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07"
+ integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@jest/types" "^26.6.2"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
+ micromatch "^4.0.2"
+ pretty-format "^26.6.2"
+ slash "^3.0.0"
+ stack-utils "^2.0.2"
+
+jest-regex-util@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
+ integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@^3.14.0:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9"
+ integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
+ dependencies:
+ 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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
+ integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
+ dependencies:
+ inherits "^2.0.1"
+
+json-rpc-random-id@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+ integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json-text-sequence@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2"
+ integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I=
+ dependencies:
+ delimit-stream "0.1.0"
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@3.0.1, keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
+ integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+
+level-errors@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
+ integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4"
+ integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.5"
+ xtend "^4.0.0"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
+ integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ xtend "^4.0.0"
+
+level-mem@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5"
+ integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
+ dependencies:
+ level-packager "~4.0.0"
+ memdown "~3.0.0"
+
+level-packager@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6"
+ integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
+ dependencies:
+ encoding-down "~5.0.0"
+ levelup "^3.0.0"
+
+level-post@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0"
+ integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
+ dependencies:
+ ltgt "^2.1.2"
+
+level-sublevel@6.6.4:
+ version "6.6.4"
+ resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba"
+ integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==
+ dependencies:
+ 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"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level-ws@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b"
+ integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.8"
+ xtend "^4.0.1"
+
+levelup@3.1.1, levelup@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
+ integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
+ dependencies:
+ deferred-leveldown "~4.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~3.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash.clonedeep@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+
+lodash.escaperegexp@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
+ integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.partition@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.partition/-/lodash.partition-4.6.0.tgz#a38e46b73469e0420b0da1212e66d414be364ba4"
+ integrity sha1-o45GtzRp4EILDaEhLmbUFL42S6Q=
+
+lodash.sum@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/lodash.sum/-/lodash.sum-4.0.2.tgz#ad90e397965d803d4f1ff7aa5b2d0197f3b4637b"
+ integrity sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s=
+
+lodash@4.17.20:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+looper@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec"
+ integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
+
+looper@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749"
+ integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@5.1.1, lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+ integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
+ dependencies:
+ pseudomap "^1.0.1"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
+ltgt@^2.1.2, ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+ltgt@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
+ integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memdown@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
+ integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.1.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merkle-patricia-tree@3.0.0, merkle-patricia-tree@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8"
+ integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==
+ dependencies:
+ async "^2.6.1"
+ ethereumjs-util "^5.2.0"
+ level-mem "^3.0.1"
+ level-ws "^1.0.0"
+ readable-stream "^3.0.6"
+ rlp "^2.0.0"
+ semaphore ">=1.0.1"
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
+ integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
+ dependencies:
+ 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"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mimic-response@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
+ integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@~1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mocha@^7.1.2:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+ dependencies:
+ ansi-colors "3.2.3"
+ browser-stdout "1.3.1"
+ chokidar "3.3.0"
+ debug "3.2.6"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ find-up "3.0.0"
+ glob "7.1.3"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ mkdirp "0.5.5"
+ ms "2.1.1"
+ node-environment-flags "1.0.6"
+ object.assign "4.1.0"
+ strip-json-comments "2.0.1"
+ supports-color "6.0.0"
+ which "1.3.1"
+ wide-align "1.1.3"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+nan@^2.14.0:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ 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"
+
+napi-build-utils@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
+ integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-abi@^2.18.0, node-abi@^2.21.0, node-abi@^2.7.0:
+ version "2.30.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b"
+ integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==
+ dependencies:
+ semver "^5.4.1"
+
+node-addon-api@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681"
+ integrity sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-addon-api@^3.0.2:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
+ integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
+
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
+ dependencies:
+ object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+node-hid@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-1.3.0.tgz#346a468505cee13d69ccd760052cbaf749f66a41"
+ integrity sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.14.0"
+ node-abi "^2.18.0"
+ prebuild-install "^5.3.4"
+
+node-hid@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.1.1.tgz#f83c8aa0bb4e6758b5f7383542477da93f67359d"
+ integrity sha512-Skzhqow7hyLZU93eIPthM9yjot9lszg9xrKxESleEs05V2NcbUptZc5HFqzjOkSmL0sFlZFr3kmvaYebx06wrw==
+ dependencies:
+ bindings "^1.5.0"
+ node-addon-api "^3.0.2"
+ prebuild-install "^6.0.0"
+
+noop-logger@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
+ integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+npmlog@^4.0.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125"
+ integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==
+ dependencies:
+ boolbase "^1.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-inspect@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+oboe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6"
+ integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
+ dependencies:
+ http-https "^1.0.0"
+
+oboe@2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd"
+ integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@^1.0.4:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parse5-htmlparser2-tree-adapter@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
+ integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
+ dependencies:
+ parse5 "^6.0.1"
+
+parse5@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+patch-package@6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+patch-package@^6.2.2, patch-package@^6.4.7:
+ version "6.4.7"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
+ integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+path-browserify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
+prebuild-install@^5.3.3, prebuild-install@^5.3.4:
+ version "5.3.6"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291"
+ integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==
+ dependencies:
+ detect-libc "^1.0.3"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp-classic "^0.5.3"
+ napi-build-utils "^1.0.1"
+ node-abi "^2.7.0"
+ noop-logger "^0.1.1"
+ npmlog "^4.0.1"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^3.0.3"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+ which-pm-runs "^1.0.0"
+
+prebuild-install@^6.0.0:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.3.tgz#8ea1f9d7386a0b30f7ef20247e36f8b2b82825a2"
+ integrity sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==
+ dependencies:
+ detect-libc "^1.0.3"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp-classic "^0.5.3"
+ napi-build-utils "^1.0.1"
+ node-abi "^2.21.0"
+ npmlog "^4.0.1"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^3.0.3"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.1.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d"
+ integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==
+
+pretty-format@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
+ integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^17.0.1"
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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@^1.1.9:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b"
+ integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
+
+pull-defer@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113"
+ integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
+
+pull-level@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac"
+ integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==
+ dependencies:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5"
+ integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
+ dependencies:
+ pull-cat "^1.1.9"
+ pull-stream "^3.4.0"
+
+pull-pushable@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
+ integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
+
+pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
+ version "3.6.14"
+ resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee"
+ integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
+
+pull-window@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0"
+ integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
+ dependencies:
+ looper "^2.0.0"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.7.0:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+ramda@^0.27.1:
+ version "0.27.1"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9"
+ integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-body@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerate@^1.2.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+ integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
+
+require-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@1.17.0, resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.10.0, resolve@^1.8.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+resumer@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+ integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
+ dependencies:
+ through "~2.3.4"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.2.8, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.6:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+rxjs@6:
+ version "6.6.7"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
+ integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+ dependencies:
+ tslib "^1.9.0"
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16"
+ integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+scryptsy@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
+ integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
+ dependencies:
+ pbkdf2 "^3.0.3"
+
+secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
+ integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+
+semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.5:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f"
+ integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+simple-get@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
+ integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
+ dependencies:
+ decompress-response "^4.2.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ 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"
+
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@^0.4.20:
+ version "0.4.26"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5"
+ integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
+
+solc@^0.6.3:
+ version "0.6.12"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e"
+ integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.12:
+ version "0.5.12"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
+ integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.13, source-map-support@^0.5.19:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+stack-utils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277"
+ integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-to-pull-stream@^1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece"
+ integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
+ dependencies:
+ looper "^3.0.0"
+ pull-stream "^3.2.3"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string.prototype.trim@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
+ integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-indent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+ integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
+
+strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+super-split@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/super-split/-/super-split-1.1.0.tgz#43b3ba719155f4d43891a32729d59b213d9155fc"
+ integrity sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ==
+
+supports-color@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
+ integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tape@^4.6.3:
+ version "4.13.3"
+ resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278"
+ integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==
+ dependencies:
+ deep-equal "~1.1.1"
+ defined "~1.0.0"
+ dotignore "~0.1.2"
+ for-each "~0.3.3"
+ function-bind "~1.1.1"
+ glob "~7.1.6"
+ has "~1.0.3"
+ inherits "~2.0.4"
+ is-regex "~1.0.5"
+ minimist "~1.2.5"
+ object-inspect "~1.7.0"
+ resolve "~1.17.0"
+ resumer "~0.0.0"
+ string.prototype.trim "~1.2.1"
+ through "~2.3.8"
+
+tar-fs@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
+ integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.1.4"
+
+tar-stream@^2.1.4:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
+tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
+ integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+testrpc@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed"
+ integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==
+
+through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@~2.3.4, through@~2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+"true-case-path@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf"
+ integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==
+
+ts-essentials@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
+ integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
+
+ts-essentials@^6.0.3:
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6"
+ integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
+
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
+ dependencies:
+ "@types/mkdirp" "^0.5.2"
+ "@types/prettier" "^2.1.1"
+ "@types/resolve" "^0.0.8"
+ chalk "^2.4.1"
+ glob "^7.1.2"
+ mkdirp "^0.5.1"
+ prettier "^2.1.2"
+ resolve "^1.8.1"
+ ts-essentials "^1.0.0"
+
+tslib@^1.9.0, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
+ integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.0:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+tweetnacl@^1.0.0, tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typechain@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e"
+ integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==
+ dependencies:
+ command-line-args "^4.0.7"
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ ts-essentials "^6.0.3"
+ ts-generator "^0.1.1"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typewise-core@^1.2, typewise-core@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
+ integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+
+typewise@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651"
+ integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+ dependencies:
+ typewise-core "^1.2.0"
+
+typewiselite@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e"
+ integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+
+typical@^2.6.0, typical@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
+ integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
+
+u2f-api@0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720"
+ integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg==
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+underscore@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+underscore@^1.8.3:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1"
+ integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unorm@^1.3.3:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+usb@^1.6.3:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/usb/-/usb-1.7.1.tgz#d723223ec517b802c4d2082e31a4649c65c491c5"
+ integrity sha512-HTCfx6NnNRhv5y98t04Y8j2+A8dmQnEGxCMY2/zN/0gkiioLYfTZ5w/PEKlWRVUY+3qLe9xwRv9pHLkjQYNw/g==
+ dependencies:
+ bindings "^1.4.0"
+ node-addon-api "3.0.2"
+ prebuild-install "^5.3.3"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+util@^0.12.0:
+ version "0.12.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253"
+ integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ safe-buffer "^5.1.2"
+ which-typed-array "^1.1.2"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac"
+ integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.3.0:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f"
+ integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.9.1"
+
+web3-bzz@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.6.tgz#95f370aecc3ff6ad07f057e6c0c916ef09b04dde"
+ integrity sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.12.1"
+
+web3-core-helpers@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99"
+ integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==
+ dependencies:
+ underscore "1.9.1"
+ web3-eth-iban "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-helpers@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz#c478246a9abe4e5456acf42657dac2f7c330be74"
+ integrity sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==
+ dependencies:
+ underscore "1.12.1"
+ web3-eth-iban "1.3.6"
+ web3-utils "1.3.6"
+
+web3-core-method@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6"
+ integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-method@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.6.tgz#4b0334edd94b03dfec729d113c69a4eb6ebc68ae"
+ integrity sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+ web3-core-promievent "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-utils "1.3.6"
+
+web3-core-promievent@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf"
+ integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-promievent@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz#6c27dc79de8f71b74f5d17acaf9aaf593d3cb0c9"
+ integrity sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a"
+ integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==
+ dependencies:
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-providers-http "1.2.11"
+ web3-providers-ipc "1.2.11"
+ web3-providers-ws "1.2.11"
+
+web3-core-requestmanager@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz#4fea269fe913fd4fca464b4f7c65cb94857b5b2a"
+ integrity sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==
+ dependencies:
+ underscore "1.12.1"
+ util "^0.12.0"
+ web3-core-helpers "1.3.6"
+ web3-providers-http "1.3.6"
+ web3-providers-ipc "1.3.6"
+ web3-providers-ws "1.3.6"
+
+web3-core-subscriptions@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd"
+ integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-core-subscriptions@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz#ee24e7974d1d72ff6c992c599deba4ef9b308415"
+ integrity sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+
+web3-core@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7"
+ integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-requestmanager "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.6.tgz#a6a761d1ff2f3ee462b8dab679229d2f8e267504"
+ integrity sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-requestmanager "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-abi@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0"
+ integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==
+ dependencies:
+ "@ethersproject/abi" "5.0.0-beta.153"
+ underscore "1.9.1"
+ web3-utils "1.2.11"
+
+web3-eth-abi@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz#4272ca48d817aa651bbf97b269f5ff10abc2b8a9"
+ integrity sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==
+ dependencies:
+ "@ethersproject/abi" "5.0.7"
+ underscore "1.12.1"
+ web3-utils "1.3.6"
+
+web3-eth-accounts@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520"
+ integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.9.1"
+ uuid "3.3.2"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-accounts@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz#f9fcb50b28ee58090ab292a10d996155caa2b474"
+ integrity sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.12.1"
+ uuid "3.3.2"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-contract@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90"
+ integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-contract@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz#cccf4d32dc56917fb6923e778498a9ba2a5ba866"
+ integrity sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.12.1"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-promievent "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-eth-abi "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-ens@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532"
+ integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-ens@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz#0d28c5d4ea7b4462ef6c077545a77956a6cdf175"
+ integrity sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.12.1"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-promievent "1.3.6"
+ web3-eth-abi "1.3.6"
+ web3-eth-contract "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-iban@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef"
+ integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.2.11"
+
+web3-eth-iban@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz#0d6ba21fe78f190af8919e9cd5453882457209e0"
+ integrity sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.3.6"
+
+web3-eth-personal@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70"
+ integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-personal@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz#226137916754c498f0284f22c55924c87a2efcf0"
+ integrity sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-net "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793"
+ integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==
+ dependencies:
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-accounts "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-eth-ens "1.2.11"
+ web3-eth-iban "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.6.tgz#2c650893d540a7a0eb1365dd5b2dca24ac919b7c"
+ integrity sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==
+ dependencies:
+ underscore "1.12.1"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-eth-abi "1.3.6"
+ web3-eth-accounts "1.3.6"
+ web3-eth-contract "1.3.6"
+ web3-eth-ens "1.3.6"
+ web3-eth-iban "1.3.6"
+ web3-eth-personal "1.3.6"
+ web3-net "1.3.6"
+ web3-utils "1.3.6"
+
+web3-net@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b"
+ integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-net@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.6.tgz#a56492e2227475e38db29394f8bac305a2446e41"
+ integrity sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==
+ dependencies:
+ web3-core "1.3.6"
+ web3-core-method "1.3.6"
+ web3-utils "1.3.6"
+
+web3-provider-engine@14.2.1:
+ version "14.2.1"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95"
+ integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==
+ dependencies:
+ 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"
+
+web3-providers-http@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6"
+ integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==
+ dependencies:
+ web3-core-helpers "1.2.11"
+ xhr2-cookies "1.1.0"
+
+web3-providers-http@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.6.tgz#36e8724a7424d52827819d53fd75dbf31f5422c2"
+ integrity sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==
+ dependencies:
+ web3-core-helpers "1.3.6"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21"
+ integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==
+ dependencies:
+ oboe "2.1.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-providers-ipc@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz#cef8d12c1ebb47adce5ebf597f553c623362cb4a"
+ integrity sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==
+ dependencies:
+ oboe "2.1.5"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+
+web3-providers-ws@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb"
+ integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ websocket "^1.0.31"
+
+web3-providers-ws@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz#e1df617bc89d66165abdf2191da0014c505bfaac"
+ integrity sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+ websocket "^1.0.32"
+
+web3-shh@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f"
+ integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-net "1.2.11"
+
+web3-shh@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.6.tgz#4e3486c7eca5cbdb87f88910948223a5b7ea6c20"
+ integrity sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==
+ dependencies:
+ web3-core "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-net "1.3.6"
+
+web3-utils@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82"
+ integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@1.2.9:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.9.tgz#abe11735221627da943971ef1a630868fb9c61f3"
+ integrity sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==
+ dependencies:
+ bn.js "4.11.8"
+ eth-lib "0.2.7"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@1.3.6, web3-utils@^1.0.0-beta.31:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10"
+ integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975"
+ integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==
+ dependencies:
+ web3-bzz "1.2.11"
+ web3-core "1.2.11"
+ web3-eth "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-shh "1.2.11"
+ web3-utils "1.2.11"
+
+web3@1.3.6, web3@^1.0.0-beta.34:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.6.tgz#599425461c3f9a8cbbefa70616438995f4a064cc"
+ integrity sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==
+ dependencies:
+ web3-bzz "1.3.6"
+ web3-core "1.3.6"
+ web3-eth "1.3.6"
+ web3-eth-personal "1.3.6"
+ web3-net "1.3.6"
+ web3-shh "1.3.6"
+ web3-utils "1.3.6"
+
+websocket@1.0.32:
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+websocket@^1.0.31, websocket@^1.0.32:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which-pm-runs@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
+ integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
+
+which-typed-array@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff"
+ integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==
+ dependencies:
+ available-typed-arrays "^1.0.2"
+ call-bind "^1.0.0"
+ es-abstract "^1.18.0-next.1"
+ foreach "^2.0.5"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.1"
+ is-typed-array "^1.1.3"
+
+which@1.3.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3, wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
+ integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^7.2.1:
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691"
+ integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xmlhttprequest@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
+ integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
+
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@^4.7.1:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
+ integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA=
+ dependencies:
+ 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"
diff --git a/omgx_examples/truffle/1_deploy_ERC20_contract.js b/omgx_examples/truffle/1_deploy_ERC20_contract.js
new file mode 100644
index 000000000000..2e40ef2fb8de
--- /dev/null
+++ b/omgx_examples/truffle/1_deploy_ERC20_contract.js
@@ -0,0 +1,17 @@
+const ERC20 = artifacts.require('ERC20')
+
+module.exports = function (deployer, accounts) {
+ const tokenName = 'My Optimistic Coin'
+ const tokenSymbol = 'OPT'
+ const tokenDecimals = 1
+
+ // deployment steps
+ deployer.deploy(
+ ERC20,
+ 10000,
+ tokenName,
+ tokenDecimals,
+ tokenSymbol,
+ { gasPrice: 0 }
+ )
+}
\ No newline at end of file
diff --git a/omgx_examples/truffle/LICENSE b/omgx_examples/truffle/LICENSE
new file mode 100644
index 000000000000..6a7da5218bb2
--- /dev/null
+++ b/omgx_examples/truffle/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright 2020-2021 Optimism
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/omgx_examples/truffle/README.md b/omgx_examples/truffle/README.md
new file mode 100644
index 000000000000..4bc33b6d5e59
--- /dev/null
+++ b/omgx_examples/truffle/README.md
@@ -0,0 +1,192 @@
+# Getting Started with Optimistic Ethereum: Simple ERC20 Token Truffle Tutorial
+
+Hi there! Welcome to our Optimistic Ethereum ERC20 Truffle example! If you're interested in writing your first L2-compatible smart contract using Truffle as your smart contract testing framework, then you've come to the right place! This repo serves as an example for how go through and compile/test/deploy your contracts on both Ethereum, Optimistic Ethereum, and OMGX.
+
+Let's begin!
+
+## Prerequisites
+
+First, spin up a local L1/L2. Install needed modules:
+
+```bash
+$ cd optimism
+$ yarn clean
+$ yarn
+$ yarn build
+```
+
+Then, navigate to the `/ops` folder and start the system. Make sure you have the docker app running!
+
+```bash
+$ cd ops
+$ docker-compose down #only needed if you are currently running a local system
+$ docker-compose build
+$ docker-compose up -V
+```
+
+## Step 1: Compile your contracts for Optimistic Ethereum
+
+Compiling a contract for Optimistic Ethereum is pretty easy! First we'll need to install the [`@eth-optimism/solc`](https://www.npmjs.com/package/@eth-optimism/solc). Since we currently only support `solc` versions `0.5.16`, `0.6.12`, and `0.7.6` for Optimistic Ethereum contracts, we'll be using version `0.7.6` in this example.
+Let's add this package:
+
+```sh
+yarn add @eth-optimism/solc@0.7.6-alpha.1
+```
+
+Next, we just need to add a new `truffle-config-ovm.js` file to compile our contracts. Create `truffle-config-ovm.js` and add the following to it:
+
+```js
+const mnemonicPhrase = "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat"
+const HDWalletProvider = require('@truffle/hdwallet-provider')
+
+module.exports = {
+ contracts_build_directory: './build-ovm',
+ networks: {
+ optimism: {
+ provider: function () {
+ return new HDWalletProvider({
+ mnemonic: {
+ phrase: mnemonicPhrase
+ },
+ providerOrUrl: 'http://127.0.0.1:8545'
+ })
+ },
+ network_id: 420,
+ host: '127.0.0.1',
+ port: 8545,
+ gasPrice: 0,
+ },
+ omgx_rinkeby: {
+ provider: function () {
+ return new HDWalletProvider({
+ mnemonic: {
+ phrase: mnemonicPhrase
+ },
+ providerOrUrl: 'http://rinkeby.omgx.network'
+ })
+ },
+ network_id: 28,
+ host: 'http://rinkeby.omgx.network',
+ port: 8545,
+ gasPrice: 0,
+ }
+ },
+ compilers: {
+ solc: {
+ // Add path to the optimism solc fork
+ version: "node_modules/@eth-optimism/solc",
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 1
+ },
+ }
+ }
+ }
+}
+```
+
+Here, we specify the new custom Optimistic Ethereum compiler we just installed and the new build path for our optimistically compiled contracts. We also specify the network parameters of a local Optimistic Ethereum instance. This local instance will be set up soon, but we'll set this up in our config now so that it's easy for us later when we compile and deploy our Optimistic Ethereum contracts.
+
+And we're ready to compile! All you have to do is specify the `truffle-config-ovm.js` config in your `truffle` command, like so:
+
+```sh
+yarn truffle compile --config truffle-config-ovm.js
+```
+
+Our `truffle-config-ovm.js` config file tells Truffle that we want to use the Optimistic Ethereum solidity compiler.
+
+Yep, it's that easy. You can verify that everything went well by looking for the `build-ovm` directory that contains your new JSON files.
+
+Here, `build-ovm` signifies that the contracts contained in this directory have been compiled for the OVM, the **O**ptimistic **V**irtual **M**achine, as opposed to the Ethereum Virtual Machine. Now let's move on to testing!
+
+## Step 2: Testing your Optimistic Ethereum contracts
+
+Woot! It's finally time to test our contract on top of Optimistic Ethereum. Since the two JSON RPC provider URLs (one for your local instance Ethereum and Optimistic Ethereum) have already been specified in your Truffle config files, all we need to do next is run the test command.To do that, run:
+
+```sh
+yarn truffle test ./test/erc20.spec.js --network optimism --config truffle-config-ovm.js
+```
+
+Notice that we are using `truffle-config-ovm.js` to let `truffle` know that we want to use the `build-ovm` folder as our path to our JSON files. (Remember that these JSON files were compiled using the Optimistic Ethereum solidity compiler!)
+
+Additionally, we also specify the network we are testing on.
+In this case, we're testing our contract on `optimistic_ethereum`.
+
+You should see a set of passing tests for your ERC20 contract. If so, congrats!
+You're ready to deploy an application to Optimistic Ethereum.
+It really is that easy.
+
+## Step 3: Deploying your Optimistic Ethereum contracts
+
+Now we're going to deploy an Optimisic Ethereum contract using `truffle`. For Truffle based deployments, we're going to use Truffle's `migrate` command to run a migrations file for us that will deploy the contract we specify.
+
+First, let's create that migrations file. Create a new directory called `migrations` in the topmost path of your project and create a file within it called `1_deploy_ERC20_contract.js`.
+
+Next, within `1_deploy_ERC20_contract.js`, we're going to add the following logic:
+
+```js
+const ERC20 = artifacts.require('ERC20')
+
+module.exports = function (deployer, accounts) {
+ const tokenName = 'My Optimistic Coin'
+ const tokenSymbol = 'OPT'
+ const tokenDecimals = 1
+
+ // deployment steps
+ deployer.deploy(
+ ERC20,
+ 10000,
+ tokenName,
+ tokenDecimals,
+ tokenSymbol,
+ { gasPrice: 0 }
+ )
+}
+```
+
+To quickly explain this file, first we import our artifact for our ERC20 contract.
+Since we specified the build directory in our Truffle configs, Truffle knows whether we want to use either an Ethereum or Optimistic Ethereum contract artifact.
+
+Now we're ready to run our migrations file!
+Let's go ahead and deploy this contract:
+
+```sh
+yarn truffle migrate --network optimism --config truffle-config-ovm.js #deploy on your local L2
+
+or...
+
+yarn truffle migrate --network omgx_rinkeby --config truffle-config-ovm.js #deploy on omgx Rinkeby
+```
+
+After a few seconds your contract should be deployed! Now you'll see this in your terminal:
+
+
+
+And uh... yeah.
+That's pretty much it.
+Contracts deployed!
+Tutorial complete. Hopefully now you know the basics of working with Optimistic Ethereum! 🅾ï¸
+
+------
+
+## Further Reading
+
+### OVM vs. EVM Incompatibilities
+
+Our goal is to bring the OVM as close to 100% compatibility with all existing Ethereum projects, but our software is still in an early stage. [Our community hub docs](https://community.optimism.io/docs/protocol/evm-comparison.html) will maintain the most up to date list of known incompatibilities between the OVM and EVM, along with our plans to fix them.
+
+### Wasn't that easy?
+
+The OVM provides a fresh new take on layer 2 development: it's _mostly_ identical to layer 1 development.
+However, there are a few differences that are worth noting, which you can read more about in our [EVM comparison documentation](https://community.optimism.io/docs/protocol/evm-comparison.html).
+No hoops, no tricks--the Ethereum you know and love, ready to scale up with L2.
+For more info on our progress and what's going on behind the scenes, you can follow us on [Twitter](https://twitter.com/optimismPBC).
+
+Want to try deploying contracts to the Optimistic Ethereum testnet next? [Check out the full integration guide](https://community.optimism.io/docs/developers/integration.html) on the Optimism community hub.
+
+------
+
+## Troubleshooting
+
+Example project not working? [Create a Github Issue](https://github.com/ethereum-optimism/Truffle-ERC20-Example/issues), or hop in our [Discord](https://discordapp.com/invite/jrnFEvq) channel and ask away.
\ No newline at end of file
diff --git a/omgx_examples/truffle/build-ovm/ERC20.json b/omgx_examples/truffle/build-ovm/ERC20.json
new file mode 100644
index 000000000000..43c5b3aef584
--- /dev/null
+++ b/omgx_examples/truffle/build-ovm/ERC20.json
@@ -0,0 +1,6727 @@
+{
+ "contractName": "ERC20",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "_initialAmount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "_tokenName",
+ "type": "string"
+ },
+ {
+ "internalType": "uint8",
+ "name": "_decimalUnits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "_tokenSymbol",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowed",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "remaining",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.6.12-develop.2020.12.9+commit.9b8c5857\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_initialAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimalUnits\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"_tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"The address of the account owning tokens\",\"_spender\":\"The address of the account able to transfer the tokens\"},\"returns\":{\"remaining\":\"Amount of remaining tokens allowed to spent\"}},\"approve(address,uint256)\":{\"params\":{\"_spender\":\"The address of the account able to transfer the tokens\",\"_value\":\"The amount of tokens to be approved for transfer\"},\"returns\":{\"success\":\"Whether the approval was successful or not\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"The address from which the balance will be retrieved\"},\"returns\":{\"balance\":\"The balance\"}},\"transfer(address,uint256)\":{\"params\":{\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_from\":\"The address of the sender\",\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"`msg.sender` approves `_spender` to spend `_value` tokens\"},\"transfer(address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `msg.sender`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1},\"remappings\":[]},\"sources\":{\"/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/ERC20.sol\":{\"keccak256\":\"0xab3ddbf0ed5301daf347a3bf9aa2715201ded691df9cbc8935dfc7568162e6d7\",\"license\":\"MIT LICENSE\",\"urls\":[\"bzz-raw://ded66c3d69e53880ad0fd8dfd597c5b4d2bfd6af81efbb6422d65f5ce0dcac5a\",\"dweb:/ipfs/QmRqLDL2B3Yva3EQXMoi8HnGxf4LMuRgPzjvg9YevkMUoL\"]},\"/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol\":{\"keccak256\":\"0x64a6e4d4bb82d69c9ff02b073fc5057612374eed338e1c5a0cdb14994c051477\",\"license\":\"MIT LICENSE\",\"urls\":[\"bzz-raw://79a7752367c0f3df1ac388fc7af067e9d7db81346336917549c72fced3abe419\",\"dweb:/ipfs/QmXAkeog3ZARpJoK2bGKuH6Yy8RYTtaLi3VnAUtbHq8Uvn\"]}},\"version\":1}",
+ "bytecode": "0x60806040523480156200001c5760008062000019620002b8565b50505b5060405162000f0838038062000f08833981810160405260808110156200004d576000806200004a620002b8565b50505b8101908080519291906020018051604051939291908464010000000082111562000081576000806200007e620002b8565b50505b908301906020820185811115620000a2576000806200009f620002b8565b50505b8251640100000000811182820188101715620000c857600080620000c5620002b8565b50505b825250602001908051906020019080838360005b83811015620000f6578082015183820152602001620000dc565b50505050905090810190601f168015620001245780820380516001836020036101000a031916815260200191505b506040526020018051929190602001805160405193929190846401000000008211156200015b5760008062000158620002b8565b50505b9083019060208201858111156200017c5760008062000179620002b8565b50505b8251640100000000811182820188101715620001a2576000806200019f620002b8565b50505b825250602001908051906020019080838360005b83811015620001d0578082015183820152602001620001b6565b50505050905090810190601f168015620001fe5780820380516001836020036101000a031916815260200191505b50604052505050836000805a6200021462000325565b6001600160a01b03166001600160a01b0316815260200190815260200160002081906200024062000381565b50505083600581906200025262000381565b5050508260029080516200026b929160200190620003d0565b508160036001816200027c6200047f565b8160ff021916908360ff160217906200029462000381565b505050806004908051620002ad929160200190620003d0565b5050505050620004ef565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015620002f2578086015182820160400152602001620002d5565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156200037c5760008282015260200162000363565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60008152602062000363565b8280620003dc6200047f565b600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200042757805160ff191683800117856200041f62000381565b50506200046d565b828001600101856200043862000381565b505082156200046d579182015b828111156200046d578251826200045b62000381565b50509160200191906001019062000445565b506200047b929150620004cc565b5090565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051600082529350602062000363565b808211156200047b5760008082620004e362000381565b505050600101620004cc565b610a0980620004ff6000396000f3fe608060405234801561001957600080610016610889565b50505b50600436106100a25760003560e01c806306fdde03146100b0578063095ea7b31461012f57806318160ddd1461017857806323b872dd1461019257806327e235e3146101d1578063313ce567146102005780635c6581651461021e57806370a082311461025557806395d89b4114610284578063a9059cbb1461028c578063dd62ed3e146102c1575b6000806100ad610889565b50505b6100b86102f8565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100f45780820151838201526020016100dc565b50505050905090810190601f1680156101215780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101646004803603604081101561014e5760008061014b610889565b50505b506001600160a01b0381351690602001356103b1565b604051901515815260200160405180910390f35b61018061045f565b60405190815260200160405180910390f35b610164600480360360608110156101b1576000806101ae610889565b50505b506001600160a01b0381358116916020810135909116906040013561046c565b610180600480360360208110156101f0576000806101ed610889565b50505b50356001600160a01b0316610618565b610208610630565b60405160ff909116815260200160405180910390f35b6101806004803603604081101561023d5760008061023a610889565b50505b506001600160a01b0381358116916020013516610649565b6101806004803603602081101561027457600080610271610889565b50505b50356001600160a01b031661066f565b6100b8610695565b610164600480360360408110156102ab576000806102a8610889565b50505b506001600160a01b038135169060200135610737565b610180600480360360408110156102e0576000806102dd610889565b50505b506001600160a01b0381358116916020013516610849565b6002806103036108f4565b600181600116156101000203166002900480601f01602080910402602001604051908101604052818152919060208301828061033d6108f4565b600181600116156101000203166002900480156103a95780601f106103775761010080836103696108f4565b0402835291602001916103a9565b820191906000526020600020905b8161038e6108f4565b8152906001019060200180831161038557829003601f168201915b505050505081565b600081600160005a6103c1610954565b6001600160a01b03166001600160a01b031681526020019081526020016000206001600160a01b038516600090815260209190915260409020819061040461099a565b505050826001600160a01b03165a61041a610954565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a350600192915050565b60056104696108f4565b81565b6001600160a01b03831660009081526001602052806040812060005a610490610954565b6001600160a01b03166001600160a01b031681526020019081526020016000206104b86108f4565b6001600160a01b038616600090815260208190529091508390604090206104dd6108f4565b101580156104eb5750828110155b6104fd576000806104fa610889565b50505b6001600160a01b03841660009081526020819052839060409020600082826105236108f4565b01925050819061053161099a565b5050506001600160a01b038516600090815260208190528390604090206000828261055a6108f4565b03925050819061056861099a565b5050506000198110156105d8576001600160a01b0385166000908152600160205283906040902060005a61059a610954565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082826105c66108f4565b0392505081906105d461099a565b5050505b836001600160a01b0316856001600160a01b03166000805160206109e98339815191528560405190815260200160405180910390a3506001949350505050565b600060205280600052604060002090506104696108f4565b6000600361063c6108f4565b906101000a900460ff1681565b6001602052816000526040600020602052806000526040600020915061046990506108f4565b6001600160a01b038116600090815260208190526040812061068f6108f4565b92915050565b6004806106a06108f4565b600181600116156101000203166002900480601f0160208091040260200160405190810160405281815291906020830182806106da6108f4565b600181600116156101000203166002900480156103a95780601f106107065761010080836103696108f4565b820191906000526020600020905b8161071d6108f4565b815290600101906020018083116107145750859350505050565b6000816000805a610746610954565b6001600160a01b03166001600160a01b0316815260200190815260200160002061076e6108f4565b10156107825760008061077f610889565b50505b816000805a61078f610954565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082826107bb6108f4565b0392505081906107c961099a565b5050506001600160a01b03831660009081526020819052829060409020600082826107f26108f4565b01925050819061080061099a565b505050826001600160a01b03165a610816610954565b6001600160a01b03166000805160206109e98339815191528460405190815260200160405180910390a350600192915050565b6001600160a01b03821660009081526001602052604081206001600160a01b0383166000908152602091909152604090206108826108f4565b9392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b868110156108c15780860151828201604001526020016108a6565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b604081101561094f57600082820152602001610938565b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020610938565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60008152602061093856feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
+ "deployedBytecode": "0x608060405234801561001957600080610016610889565b50505b50600436106100a25760003560e01c806306fdde03146100b0578063095ea7b31461012f57806318160ddd1461017857806323b872dd1461019257806327e235e3146101d1578063313ce567146102005780635c6581651461021e57806370a082311461025557806395d89b4114610284578063a9059cbb1461028c578063dd62ed3e146102c1575b6000806100ad610889565b50505b6100b86102f8565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100f45780820151838201526020016100dc565b50505050905090810190601f1680156101215780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101646004803603604081101561014e5760008061014b610889565b50505b506001600160a01b0381351690602001356103b1565b604051901515815260200160405180910390f35b61018061045f565b60405190815260200160405180910390f35b610164600480360360608110156101b1576000806101ae610889565b50505b506001600160a01b0381358116916020810135909116906040013561046c565b610180600480360360208110156101f0576000806101ed610889565b50505b50356001600160a01b0316610618565b610208610630565b60405160ff909116815260200160405180910390f35b6101806004803603604081101561023d5760008061023a610889565b50505b506001600160a01b0381358116916020013516610649565b6101806004803603602081101561027457600080610271610889565b50505b50356001600160a01b031661066f565b6100b8610695565b610164600480360360408110156102ab576000806102a8610889565b50505b506001600160a01b038135169060200135610737565b610180600480360360408110156102e0576000806102dd610889565b50505b506001600160a01b0381358116916020013516610849565b6002806103036108f4565b600181600116156101000203166002900480601f01602080910402602001604051908101604052818152919060208301828061033d6108f4565b600181600116156101000203166002900480156103a95780601f106103775761010080836103696108f4565b0402835291602001916103a9565b820191906000526020600020905b8161038e6108f4565b8152906001019060200180831161038557829003601f168201915b505050505081565b600081600160005a6103c1610954565b6001600160a01b03166001600160a01b031681526020019081526020016000206001600160a01b038516600090815260209190915260409020819061040461099a565b505050826001600160a01b03165a61041a610954565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a350600192915050565b60056104696108f4565b81565b6001600160a01b03831660009081526001602052806040812060005a610490610954565b6001600160a01b03166001600160a01b031681526020019081526020016000206104b86108f4565b6001600160a01b038616600090815260208190529091508390604090206104dd6108f4565b101580156104eb5750828110155b6104fd576000806104fa610889565b50505b6001600160a01b03841660009081526020819052839060409020600082826105236108f4565b01925050819061053161099a565b5050506001600160a01b038516600090815260208190528390604090206000828261055a6108f4565b03925050819061056861099a565b5050506000198110156105d8576001600160a01b0385166000908152600160205283906040902060005a61059a610954565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082826105c66108f4565b0392505081906105d461099a565b5050505b836001600160a01b0316856001600160a01b03166000805160206109e98339815191528560405190815260200160405180910390a3506001949350505050565b600060205280600052604060002090506104696108f4565b6000600361063c6108f4565b906101000a900460ff1681565b6001602052816000526040600020602052806000526040600020915061046990506108f4565b6001600160a01b038116600090815260208190526040812061068f6108f4565b92915050565b6004806106a06108f4565b600181600116156101000203166002900480601f0160208091040260200160405190810160405281815291906020830182806106da6108f4565b600181600116156101000203166002900480156103a95780601f106107065761010080836103696108f4565b820191906000526020600020905b8161071d6108f4565b815290600101906020018083116107145750859350505050565b6000816000805a610746610954565b6001600160a01b03166001600160a01b0316815260200190815260200160002061076e6108f4565b10156107825760008061077f610889565b50505b816000805a61078f610954565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082826107bb6108f4565b0392505081906107c961099a565b5050506001600160a01b03831660009081526020819052829060409020600082826107f26108f4565b01925050819061080061099a565b505050826001600160a01b03165a610816610954565b6001600160a01b03166000805160206109e98339815191528460405190815260200160405180910390a350600192915050565b6001600160a01b03821660009081526001602052604081206001600160a01b0383166000908152602091909152604090206108826108f4565b9392505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b868110156108c15780860151828201604001526020016108a6565b506020828760640184336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52505050565b6303daa959598160e01b8152836004820152602081602483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c528051935060005b604081101561094f57600082820152602001610938565b505050565b6373509064598160e01b8152602081600483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c5280516000825293506020610938565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c5260008152602061093856feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
+ "immutableReferences": {},
+ "sourceMap": "189:2694:0:-:0;;;789:521;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;789:521:0;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;789:521:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;789:521:0;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;789:521:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;978:14;955:8;:20;964:10;;;:::i;:::-;-1:-1:-1;;;;;955:20:0;-1:-1:-1;;;;;955:20:0;;;;;;;;;;;;:37;;;;:::i;:::-;;;;1055:14;1041:11;:28;;;;:::i;:::-;;;;1109:10;1102:4;:17;;;;;;;;;;:::i;:::-;-1:-1:-1;1177:13:0;1166:8;:24;:8;:24;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;1252:12;1243:6;:21;;;;;;;;;;:::i;:::-;;789:521;;;;189:2694;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;189:2694:0;;;-1:-1:-1;189:2694:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;189:2694:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;",
+ "deployedSourceMap": "189:2694:0:-:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;679:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2395:293;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;2395:293:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;756:26;;;:::i;:::-;;;;;;;;;;;;;;;1680:545;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;1680:545:0;;;;;;;;;;;;;;;;;:::i;275:43::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;275:43:0;-1:-1:-1;;;;;275:43:0;;:::i;703:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;324:62;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;324:62:0;;;;;;;;;;:::i;2231:158::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;2231:158:0;-1:-1:-1;;;;;2231:158:0;;:::i;730:20::-;;;:::i;1316:358::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;1316:358:0;;;;;;;;:::i;2694:187::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;2694:187:0;;;;;;;;;;:::i;679:18::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2395:293::-;2495:12;2555:6;2523:7;:19;2531:10;;;:::i;:::-;-1:-1:-1;;;;;2523:19:0;-1:-1:-1;;;;;2523:19:0;;;;;;;;;;;;-1:-1:-1;;;;;2523:29:0;;;;;;;;;;;;;;:38;;;;:::i;:::-;;;;2597:8;-1:-1:-1;;;;;2576:38:0;2585:10;;;:::i;:::-;-1:-1:-1;;;;;2576:38:0;;2607:6;2576:38;;;;;;;;;;;;;;-1:-1:-1;2677:4:0;2395:293;;;;:::o;756:26::-;;;;:::i;:::-;;:::o;1680:545::-;-1:-1:-1;;;;;1846:14:0;;1801:12;1846:14;;;:7;:14;;1801:12;1846:14;1801:12;1846:14;:26;1861:10;;;:::i;:::-;-1:-1:-1;;;;;1846:26:0;-1:-1:-1;;;;;1846:26:0;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1890:15:0;;:8;:15;;;;;;;1825:47;;-1:-1:-1;1909:6:0;;1890:15;;;;;:::i;:::-;:25;;:49;;;;;1933:6;1919:10;:20;;1890:49;1882:58;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1950:13:0;;:8;:13;;;;;;;1967:6;;1950:13;;;;:23;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;1983:15:0;;:8;:15;;;;;;;2002:6;;1983:15;;;;:25;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2022:10:0;:24;2018:91;;;-1:-1:-1;;;;;2062:14:0;;;;;;:7;:14;;2092:6;;2062:14;;;:26;2077:10;;;:::i;:::-;-1:-1:-1;;;;;2062:26:0;-1:-1:-1;;;;;2062:26:0;;;;;;;;;;;;;:36;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;2018:91;2139:3;-1:-1:-1;;;;;2123:28:0;2132:5;-1:-1:-1;;;;;2123:28:0;-1:-1:-1;;;;;;;;;;;2144:6:0;2123:28;;;;;;;;;;;;;;-1:-1:-1;2214:4:0;;1680:545;-1:-1:-1;;;;1680:545:0:o;275:43::-;;;;;;;;;;;-1:-1:-1;275:43:0;;:::i;703:21::-;;;;;:::i;:::-;;;;;;;;;:::o;324:62::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;324:62:0;;-1:-1:-1;324:62:0;:::i;2231:158::-;-1:-1:-1;;;;;2366:16:0;;2328:15;2366:16;;;;;;;;2328:15;2366:16;;;:::i;:::-;2359:23;2231:158;-1:-1:-1;;2231:158:0:o;730:20::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;730:20:0;;-1:-1:-1;;;;730:20:0:o;1316:358::-;1412:12;1472:6;1448:8;:20;1457:10;;;:::i;:::-;-1:-1:-1;;;;;1448:20:0;-1:-1:-1;;;;;1448:20:0;;;;;;;;;;;;;;:::i;:::-;:30;;1440:39;;;;;;:::i;:::-;;;;1513:6;1489:8;:20;1498:10;;;:::i;:::-;-1:-1:-1;;;;;1489:20:0;-1:-1:-1;;;;;1489:20:0;;;;;;;;;;;;;:30;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;1529:13:0;;:8;:13;;;;;;;1546:6;;1529:13;;;;:23;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;1588:3;-1:-1:-1;;;;;1567:33:0;1576:10;;;:::i;:::-;-1:-1:-1;;;;;1567:33:0;-1:-1:-1;;;;;;;;;;;1593:6:0;1567:33;;;;;;;;;;;;;;-1:-1:-1;1663:4:0;1316:358;;;;:::o;2694:187::-;-1:-1:-1;;;;;2849:15:0;;2809:17;2849:15;;;:7;:15;;;2809:17;2849:15;-1:-1:-1;;;;;2849:25:0;;;;;;;;;;;;;;;;:::i;:::-;2842:32;2694:187;-1:-1:-1;;;2694:187:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
+ "source": "// SPDX-License-Identifier: MIT LICENSE\n/* Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md */\npragma solidity ^0.6.12;\n\nimport \"./IERC20.sol\";\n\ncontract ERC20 is IERC20 {\n uint256 private constant MAX_UINT256 = 2**256 - 1;\n mapping(address => uint256) public balances;\n mapping(address => mapping(address => uint256)) public allowed;\n /*\n NOTE:\n The following variables are OPTIONAL vanities. One does not have to include them.\n They allow one to customise the token contract & in no way influences the core functionality.\n Some wallets/interfaces might not even bother to look at this information.\n */\n string public name;\n uint8 public decimals;\n string public symbol;\n uint256 public totalSupply;\n\n constructor(\n uint256 _initialAmount,\n string memory _tokenName,\n uint8 _decimalUnits,\n string memory _tokenSymbol\n ) public {\n balances[msg.sender] = _initialAmount; // Give the creator all initial tokens\n totalSupply = _initialAmount; // Update total supply\n name = _tokenName; // Set the name for display purposes\n decimals = _decimalUnits; // Amount of decimals for display purposes\n symbol = _tokenSymbol; // Set the symbol for display purposes\n }\n\n function transfer(address _to, uint256 _value)\n public\n override\n returns (bool success)\n {\n require(balances[msg.sender] >= _value);\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars\n return true;\n }\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n ) public override returns (bool success) {\n uint256 allowance_ = allowed[_from][msg.sender];\n require(balances[_from] >= _value && allowance_ >= _value);\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance_ < MAX_UINT256) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars\n return true;\n }\n\n function balanceOf(address _owner)\n public\n view\n override\n returns (uint256 balance)\n {\n return balances[_owner];\n }\n\n function approve(address _spender, uint256 _value)\n public\n override\n returns (bool success)\n {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars\n return true;\n }\n\n function allowance(address _owner, address _spender)\n public\n view\n override\n returns (uint256 remaining)\n {\n return allowed[_owner][_spender];\n }\n}\n",
+ "sourcePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/ERC20.sol",
+ "ast": {
+ "absolutePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/ERC20.sol",
+ "exportedSymbols": {
+ "ERC20": [
+ 234
+ ]
+ },
+ "id": 235,
+ "license": "MIT LICENSE",
+ "nodeType": "SourceUnit",
+ "nodes": [
+ {
+ "id": 1,
+ "literals": [
+ "solidity",
+ "^",
+ "0.6",
+ ".12"
+ ],
+ "nodeType": "PragmaDirective",
+ "src": "139:24:0"
+ },
+ {
+ "absolutePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "file": "./IERC20.sol",
+ "id": 2,
+ "nodeType": "ImportDirective",
+ "scope": 235,
+ "sourceUnit": 304,
+ "src": "165:22:0",
+ "symbolAliases": [],
+ "unitAlias": ""
+ },
+ {
+ "abstract": false,
+ "baseContracts": [
+ {
+ "arguments": null,
+ "baseName": {
+ "contractScope": null,
+ "id": 3,
+ "name": "IERC20",
+ "nodeType": "UserDefinedTypeName",
+ "referencedDeclaration": 303,
+ "src": "207:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_contract$_IERC20_$303",
+ "typeString": "contract IERC20"
+ }
+ },
+ "id": 4,
+ "nodeType": "InheritanceSpecifier",
+ "src": "207:6:0"
+ }
+ ],
+ "contractDependencies": [
+ 303
+ ],
+ "contractKind": "contract",
+ "documentation": null,
+ "fullyImplemented": true,
+ "id": 234,
+ "linearizedBaseContracts": [
+ 234,
+ 303
+ ],
+ "name": "ERC20",
+ "nodeType": "ContractDefinition",
+ "nodes": [
+ {
+ "constant": true,
+ "id": 11,
+ "mutability": "constant",
+ "name": "MAX_UINT256",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "220:49:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 5,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "220:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9935"
+ },
+ "id": 10,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9936"
+ },
+ "id": 8,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "hexValue": "32",
+ "id": 6,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "number",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "259:1:0",
+ "subdenomination": null,
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_2_by_1",
+ "typeString": "int_const 2"
+ },
+ "value": "2"
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "**",
+ "rightExpression": {
+ "argumentTypes": null,
+ "hexValue": "323536",
+ "id": 7,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "number",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "262:3:0",
+ "subdenomination": null,
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_256_by_1",
+ "typeString": "int_const 256"
+ },
+ "value": "256"
+ },
+ "src": "259:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9936"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "-",
+ "rightExpression": {
+ "argumentTypes": null,
+ "hexValue": "31",
+ "id": 9,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "number",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "268:1:0",
+ "subdenomination": null,
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_1_by_1",
+ "typeString": "int_const 1"
+ },
+ "value": "1"
+ },
+ "src": "259:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9935"
+ }
+ },
+ "visibility": "private"
+ },
+ {
+ "constant": false,
+ "functionSelector": "27e235e3",
+ "id": 15,
+ "mutability": "mutable",
+ "name": "balances",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "275:43:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ },
+ "typeName": {
+ "id": 14,
+ "keyType": {
+ "id": 12,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "283:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "nodeType": "Mapping",
+ "src": "275:27:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ },
+ "valueType": {
+ "id": 13,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "294:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ },
+ "value": null,
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "5c658165",
+ "id": 21,
+ "mutability": "mutable",
+ "name": "allowed",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "324:62:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ },
+ "typeName": {
+ "id": 20,
+ "keyType": {
+ "id": 16,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "332:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "nodeType": "Mapping",
+ "src": "324:47:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ },
+ "valueType": {
+ "id": 19,
+ "keyType": {
+ "id": 17,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "351:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "nodeType": "Mapping",
+ "src": "343:27:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ },
+ "valueType": {
+ "id": 18,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "362:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ }
+ },
+ "value": null,
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "06fdde03",
+ "id": 23,
+ "mutability": "mutable",
+ "name": "name",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "679:18:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 22,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "679:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "value": null,
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "313ce567",
+ "id": 25,
+ "mutability": "mutable",
+ "name": "decimals",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "703:21:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ },
+ "typeName": {
+ "id": 24,
+ "name": "uint8",
+ "nodeType": "ElementaryTypeName",
+ "src": "703:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "value": null,
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "95d89b41",
+ "id": 27,
+ "mutability": "mutable",
+ "name": "symbol",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "730:20:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 26,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "730:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "value": null,
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "18160ddd",
+ "id": 29,
+ "mutability": "mutable",
+ "name": "totalSupply",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 234,
+ "src": "756:26:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 28,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "756:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "public"
+ },
+ {
+ "body": {
+ "id": 63,
+ "nodeType": "Block",
+ "src": "945:365:0",
+ "statements": [
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 45,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 40,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "955:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 43,
+ "indexExpression": {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 41,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "964:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 42,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "964:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "955:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 44,
+ "name": "_initialAmount",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 31,
+ "src": "978:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "955:37:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 46,
+ "nodeType": "ExpressionStatement",
+ "src": "955:37:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 49,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "id": 47,
+ "name": "totalSupply",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 29,
+ "src": "1041:11:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 48,
+ "name": "_initialAmount",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 31,
+ "src": "1055:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1041:28:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 50,
+ "nodeType": "ExpressionStatement",
+ "src": "1041:28:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 53,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "id": 51,
+ "name": "name",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 23,
+ "src": "1102:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 52,
+ "name": "_tokenName",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 33,
+ "src": "1109:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string memory"
+ }
+ },
+ "src": "1102:17:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "id": 54,
+ "nodeType": "ExpressionStatement",
+ "src": "1102:17:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 57,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "id": 55,
+ "name": "decimals",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 25,
+ "src": "1166:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 56,
+ "name": "_decimalUnits",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 35,
+ "src": "1177:13:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "src": "1166:24:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "id": 58,
+ "nodeType": "ExpressionStatement",
+ "src": "1166:24:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 61,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "id": 59,
+ "name": "symbol",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 27,
+ "src": "1243:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 60,
+ "name": "_tokenSymbol",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 37,
+ "src": "1252:12:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string memory"
+ }
+ },
+ "src": "1243:21:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "id": 62,
+ "nodeType": "ExpressionStatement",
+ "src": "1243:21:0"
+ }
+ ]
+ },
+ "documentation": null,
+ "id": 64,
+ "implemented": true,
+ "kind": "constructor",
+ "modifiers": [],
+ "name": "",
+ "nodeType": "FunctionDefinition",
+ "overrides": null,
+ "parameters": {
+ "id": 38,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 31,
+ "mutability": "mutable",
+ "name": "_initialAmount",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 64,
+ "src": "810:22:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 30,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "810:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 33,
+ "mutability": "mutable",
+ "name": "_tokenName",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 64,
+ "src": "842:24:0",
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 32,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "842:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 35,
+ "mutability": "mutable",
+ "name": "_decimalUnits",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 64,
+ "src": "876:19:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ },
+ "typeName": {
+ "id": 34,
+ "name": "uint8",
+ "nodeType": "ElementaryTypeName",
+ "src": "876:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 37,
+ "mutability": "mutable",
+ "name": "_tokenSymbol",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 64,
+ "src": "905:26:0",
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 36,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "905:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "800:137:0"
+ },
+ "returnParameters": {
+ "id": 39,
+ "nodeType": "ParameterList",
+ "parameters": [],
+ "src": "945:0:0"
+ },
+ "scope": 234,
+ "src": "789:521:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 254
+ ],
+ "body": {
+ "id": 105,
+ "nodeType": "Block",
+ "src": "1430:244:0",
+ "statements": [
+ {
+ "expression": {
+ "argumentTypes": null,
+ "arguments": [
+ {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 80,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 75,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1448:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 78,
+ "indexExpression": {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 76,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "1457:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 77,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "1457:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1448:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": ">=",
+ "rightExpression": {
+ "argumentTypes": null,
+ "id": 79,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1472:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1448:30:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "id": 74,
+ "name": "require",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [
+ -18,
+ -18
+ ],
+ "referencedDeclaration": -18,
+ "src": "1440:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
+ "typeString": "function (bool) pure"
+ }
+ },
+ "id": 81,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "1440:39:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 82,
+ "nodeType": "ExpressionStatement",
+ "src": "1440:39:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 88,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 83,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1489:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 86,
+ "indexExpression": {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 84,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "1498:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 85,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "1498:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1489:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "-=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 87,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1513:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1489:30:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 89,
+ "nodeType": "ExpressionStatement",
+ "src": "1489:30:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 94,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 90,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1529:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 92,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 91,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 66,
+ "src": "1538:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1529:13:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "+=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 93,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1546:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1529:23:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 95,
+ "nodeType": "ExpressionStatement",
+ "src": "1529:23:0"
+ },
+ {
+ "eventCall": {
+ "argumentTypes": null,
+ "arguments": [
+ {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 97,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "1576:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 98,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "1576:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ {
+ "argumentTypes": null,
+ "id": 99,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 66,
+ "src": "1588:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "argumentTypes": null,
+ "id": 100,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1593:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "id": 96,
+ "name": "Transfer",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 294,
+ "src": "1567:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
+ "typeString": "function (address,address,uint256)"
+ }
+ },
+ "id": 101,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "1567:33:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 102,
+ "nodeType": "EmitStatement",
+ "src": "1562:38:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "hexValue": "74727565",
+ "id": 103,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "bool",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "1663:4:0",
+ "subdenomination": null,
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "value": "true"
+ },
+ "functionReturnParameters": 73,
+ "id": 104,
+ "nodeType": "Return",
+ "src": "1656:11:0"
+ }
+ ]
+ },
+ "documentation": null,
+ "functionSelector": "a9059cbb",
+ "id": 106,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transfer",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 70,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "1386:8:0"
+ },
+ "parameters": {
+ "id": 69,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 66,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 106,
+ "src": "1334:11:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 65,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1334:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 68,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 106,
+ "src": "1347:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 67,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1347:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1333:29:0"
+ },
+ "returnParameters": {
+ "id": 73,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 72,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 106,
+ "src": "1412:12:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 71,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1412:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1411:14:0"
+ },
+ "scope": 234,
+ "src": "1316:358:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 266
+ ],
+ "body": {
+ "id": 173,
+ "nodeType": "Block",
+ "src": "1815:410:0",
+ "statements": [
+ {
+ "assignments": [
+ 119
+ ],
+ "declarations": [
+ {
+ "constant": false,
+ "id": 119,
+ "mutability": "mutable",
+ "name": "allowance_",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 173,
+ "src": "1825:18:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 118,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1825:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "id": 126,
+ "initialValue": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 120,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "1846:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 122,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 121,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "1854:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1846:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 125,
+ "indexExpression": {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 123,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "1861:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 124,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "1861:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1846:26:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "VariableDeclarationStatement",
+ "src": "1825:47:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "arguments": [
+ {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "id": 136,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 132,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 128,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1890:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 130,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 129,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "1899:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1890:15:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": ">=",
+ "rightExpression": {
+ "argumentTypes": null,
+ "id": 131,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1909:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1890:25:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "&&",
+ "rightExpression": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 135,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "id": 133,
+ "name": "allowance_",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 119,
+ "src": "1919:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": ">=",
+ "rightExpression": {
+ "argumentTypes": null,
+ "id": 134,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1933:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1919:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "src": "1890:49:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "id": 127,
+ "name": "require",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [
+ -18,
+ -18
+ ],
+ "referencedDeclaration": -18,
+ "src": "1882:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
+ "typeString": "function (bool) pure"
+ }
+ },
+ "id": 137,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "1882:58:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 138,
+ "nodeType": "ExpressionStatement",
+ "src": "1882:58:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 143,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 139,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1950:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 141,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 140,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 110,
+ "src": "1959:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1950:13:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "+=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 142,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1967:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1950:23:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 144,
+ "nodeType": "ExpressionStatement",
+ "src": "1950:23:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 149,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 145,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1983:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 147,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 146,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "1992:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1983:15:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "-=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 148,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "2002:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1983:25:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 150,
+ "nodeType": "ExpressionStatement",
+ "src": "1983:25:0"
+ },
+ {
+ "condition": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 153,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "argumentTypes": null,
+ "id": 151,
+ "name": "allowance_",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 119,
+ "src": "2022:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "<",
+ "rightExpression": {
+ "argumentTypes": null,
+ "id": 152,
+ "name": "MAX_UINT256",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 11,
+ "src": "2035:11:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "2022:24:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "falseBody": null,
+ "id": 164,
+ "nodeType": "IfStatement",
+ "src": "2018:91:0",
+ "trueBody": {
+ "id": 163,
+ "nodeType": "Block",
+ "src": "2048:61:0",
+ "statements": [
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 161,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 154,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "2062:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 158,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 155,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "2070:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2062:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 159,
+ "indexExpression": {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 156,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "2077:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 157,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "2077:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "2062:26:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "-=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 160,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "2092:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "2062:36:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 162,
+ "nodeType": "ExpressionStatement",
+ "src": "2062:36:0"
+ }
+ ]
+ }
+ },
+ {
+ "eventCall": {
+ "argumentTypes": null,
+ "arguments": [
+ {
+ "argumentTypes": null,
+ "id": 166,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "2132:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "argumentTypes": null,
+ "id": 167,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 110,
+ "src": "2139:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "argumentTypes": null,
+ "id": 168,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "2144:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "id": 165,
+ "name": "Transfer",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 294,
+ "src": "2123:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
+ "typeString": "function (address,address,uint256)"
+ }
+ },
+ "id": 169,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "2123:28:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 170,
+ "nodeType": "EmitStatement",
+ "src": "2118:33:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "hexValue": "74727565",
+ "id": 171,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "bool",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "2214:4:0",
+ "subdenomination": null,
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "value": "true"
+ },
+ "functionReturnParameters": 117,
+ "id": 172,
+ "nodeType": "Return",
+ "src": "2207:11:0"
+ }
+ ]
+ },
+ "documentation": null,
+ "functionSelector": "23b872dd",
+ "id": 174,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transferFrom",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 114,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "1783:8:0"
+ },
+ "parameters": {
+ "id": 113,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 108,
+ "mutability": "mutable",
+ "name": "_from",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 174,
+ "src": "1711:13:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 107,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1711:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 110,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 174,
+ "src": "1734:11:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 109,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1734:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 112,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 174,
+ "src": "1755:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 111,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1755:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1701:74:0"
+ },
+ "returnParameters": {
+ "id": 117,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 116,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 174,
+ "src": "1801:12:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 115,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1801:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1800:14:0"
+ },
+ "scope": 234,
+ "src": "1680:545:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 244
+ ],
+ "body": {
+ "id": 186,
+ "nodeType": "Block",
+ "src": "2349:40:0",
+ "statements": [
+ {
+ "expression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 182,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "2366:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 184,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 183,
+ "name": "_owner",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 176,
+ "src": "2375:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2366:16:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "functionReturnParameters": 181,
+ "id": 185,
+ "nodeType": "Return",
+ "src": "2359:23:0"
+ }
+ ]
+ },
+ "documentation": null,
+ "functionSelector": "70a08231",
+ "id": 187,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "balanceOf",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 178,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "2302:8:0"
+ },
+ "parameters": {
+ "id": 177,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 176,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 187,
+ "src": "2250:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 175,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2250:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2249:16:0"
+ },
+ "returnParameters": {
+ "id": 181,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 180,
+ "mutability": "mutable",
+ "name": "balance",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 187,
+ "src": "2328:15:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 179,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2328:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2327:17:0"
+ },
+ "scope": 234,
+ "src": "2231:158:0",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 276
+ ],
+ "body": {
+ "id": 215,
+ "nodeType": "Block",
+ "src": "2513:175:0",
+ "statements": [
+ {
+ "expression": {
+ "argumentTypes": null,
+ "id": 204,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 197,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "2523:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 201,
+ "indexExpression": {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 198,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "2531:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 199,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "2531:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2523:19:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 202,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 200,
+ "name": "_spender",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 189,
+ "src": "2543:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "2523:29:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "argumentTypes": null,
+ "id": 203,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 191,
+ "src": "2555:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "2523:38:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 205,
+ "nodeType": "ExpressionStatement",
+ "src": "2523:38:0"
+ },
+ {
+ "eventCall": {
+ "argumentTypes": null,
+ "arguments": [
+ {
+ "argumentTypes": null,
+ "expression": {
+ "argumentTypes": null,
+ "id": 207,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": -15,
+ "src": "2585:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 208,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "referencedDeclaration": null,
+ "src": "2585:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ {
+ "argumentTypes": null,
+ "id": 209,
+ "name": "_spender",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 189,
+ "src": "2597:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "argumentTypes": null,
+ "id": 210,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 191,
+ "src": "2607:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "id": 206,
+ "name": "Approval",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 302,
+ "src": "2576:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
+ "typeString": "function (address,address,uint256)"
+ }
+ },
+ "id": 211,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "2576:38:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 212,
+ "nodeType": "EmitStatement",
+ "src": "2571:43:0"
+ },
+ {
+ "expression": {
+ "argumentTypes": null,
+ "hexValue": "74727565",
+ "id": 213,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "bool",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "2677:4:0",
+ "subdenomination": null,
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "value": "true"
+ },
+ "functionReturnParameters": 196,
+ "id": 214,
+ "nodeType": "Return",
+ "src": "2670:11:0"
+ }
+ ]
+ },
+ "documentation": null,
+ "functionSelector": "095ea7b3",
+ "id": 216,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "approve",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 193,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "2469:8:0"
+ },
+ "parameters": {
+ "id": 192,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 189,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 216,
+ "src": "2412:16:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 188,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2412:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 191,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 216,
+ "src": "2430:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 190,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2430:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2411:34:0"
+ },
+ "returnParameters": {
+ "id": 196,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 195,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 216,
+ "src": "2495:12:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 194,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "2495:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2494:14:0"
+ },
+ "scope": 234,
+ "src": "2395:293:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 286
+ ],
+ "body": {
+ "id": 232,
+ "nodeType": "Block",
+ "src": "2832:49:0",
+ "statements": [
+ {
+ "expression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "baseExpression": {
+ "argumentTypes": null,
+ "id": 226,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "2849:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 228,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 227,
+ "name": "_owner",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 218,
+ "src": "2857:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2849:15:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 230,
+ "indexExpression": {
+ "argumentTypes": null,
+ "id": 229,
+ "name": "_spender",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 220,
+ "src": "2865:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2849:25:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "functionReturnParameters": 225,
+ "id": 231,
+ "nodeType": "Return",
+ "src": "2842:32:0"
+ }
+ ]
+ },
+ "documentation": null,
+ "functionSelector": "dd62ed3e",
+ "id": 233,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "allowance",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 222,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "2783:8:0"
+ },
+ "parameters": {
+ "id": 221,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 218,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 233,
+ "src": "2713:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 217,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2713:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 220,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 233,
+ "src": "2729:16:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 219,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2729:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2712:34:0"
+ },
+ "returnParameters": {
+ "id": 225,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 224,
+ "mutability": "mutable",
+ "name": "remaining",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 233,
+ "src": "2809:17:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 223,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2809:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2808:19:0"
+ },
+ "scope": 234,
+ "src": "2694:187:0",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ }
+ ],
+ "scope": 235,
+ "src": "189:2694:0"
+ }
+ ],
+ "src": "139:2745:0"
+ },
+ "legacyAST": {
+ "attributes": {
+ "absolutePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/ERC20.sol",
+ "exportedSymbols": {
+ "ERC20": [
+ 234
+ ]
+ },
+ "license": "MIT LICENSE"
+ },
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.6",
+ ".12"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "139:24:0"
+ },
+ {
+ "attributes": {
+ "SourceUnit": 304,
+ "absolutePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "file": "./IERC20.sol",
+ "scope": 235,
+ "symbolAliases": [
+ null
+ ],
+ "unitAlias": ""
+ },
+ "id": 2,
+ "name": "ImportDirective",
+ "src": "165:22:0"
+ },
+ {
+ "attributes": {
+ "abstract": false,
+ "contractDependencies": [
+ 303
+ ],
+ "contractKind": "contract",
+ "documentation": null,
+ "fullyImplemented": true,
+ "linearizedBaseContracts": [
+ 234,
+ 303
+ ],
+ "name": "ERC20",
+ "scope": 235
+ },
+ "children": [
+ {
+ "attributes": {
+ "arguments": null
+ },
+ "children": [
+ {
+ "attributes": {
+ "contractScope": null,
+ "name": "IERC20",
+ "referencedDeclaration": 303,
+ "type": "contract IERC20"
+ },
+ "id": 3,
+ "name": "UserDefinedTypeName",
+ "src": "207:6:0"
+ }
+ ],
+ "id": 4,
+ "name": "InheritanceSpecifier",
+ "src": "207:6:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "mutability": "constant",
+ "name": "MAX_UINT256",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "private"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 5,
+ "name": "ElementaryTypeName",
+ "src": "220:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9935"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "operator": "-",
+ "type": "int_const 1157...(70 digits omitted)...9935"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9936"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "operator": "**",
+ "type": "int_const 1157...(70 digits omitted)...9936"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "hexvalue": "32",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "subdenomination": null,
+ "token": "number",
+ "type": "int_const 2",
+ "value": "2"
+ },
+ "id": 6,
+ "name": "Literal",
+ "src": "259:1:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "hexvalue": "323536",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "subdenomination": null,
+ "token": "number",
+ "type": "int_const 256",
+ "value": "256"
+ },
+ "id": 7,
+ "name": "Literal",
+ "src": "262:3:0"
+ }
+ ],
+ "id": 8,
+ "name": "BinaryOperation",
+ "src": "259:6:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "hexvalue": "31",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "subdenomination": null,
+ "token": "number",
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 9,
+ "name": "Literal",
+ "src": "268:1:0"
+ }
+ ],
+ "id": 10,
+ "name": "BinaryOperation",
+ "src": "259:10:0"
+ }
+ ],
+ "id": 11,
+ "name": "VariableDeclaration",
+ "src": "220:49:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "27e235e3",
+ "mutability": "mutable",
+ "name": "balances",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "mapping(address => uint256)",
+ "value": null,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "type": "address"
+ },
+ "id": 12,
+ "name": "ElementaryTypeName",
+ "src": "283:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 13,
+ "name": "ElementaryTypeName",
+ "src": "294:7:0"
+ }
+ ],
+ "id": 14,
+ "name": "Mapping",
+ "src": "275:27:0"
+ }
+ ],
+ "id": 15,
+ "name": "VariableDeclaration",
+ "src": "275:43:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "5c658165",
+ "mutability": "mutable",
+ "name": "allowed",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": null,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "type": "address"
+ },
+ "id": 16,
+ "name": "ElementaryTypeName",
+ "src": "332:7:0"
+ },
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "type": "address"
+ },
+ "id": 17,
+ "name": "ElementaryTypeName",
+ "src": "351:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 18,
+ "name": "ElementaryTypeName",
+ "src": "362:7:0"
+ }
+ ],
+ "id": 19,
+ "name": "Mapping",
+ "src": "343:27:0"
+ }
+ ],
+ "id": 20,
+ "name": "Mapping",
+ "src": "324:47:0"
+ }
+ ],
+ "id": 21,
+ "name": "VariableDeclaration",
+ "src": "324:62:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "06fdde03",
+ "mutability": "mutable",
+ "name": "name",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "string",
+ "value": null,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 22,
+ "name": "ElementaryTypeName",
+ "src": "679:6:0"
+ }
+ ],
+ "id": 23,
+ "name": "VariableDeclaration",
+ "src": "679:18:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "313ce567",
+ "mutability": "mutable",
+ "name": "decimals",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "uint8",
+ "value": null,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8",
+ "type": "uint8"
+ },
+ "id": 24,
+ "name": "ElementaryTypeName",
+ "src": "703:5:0"
+ }
+ ],
+ "id": 25,
+ "name": "VariableDeclaration",
+ "src": "703:21:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "95d89b41",
+ "mutability": "mutable",
+ "name": "symbol",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "string",
+ "value": null,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 26,
+ "name": "ElementaryTypeName",
+ "src": "730:6:0"
+ }
+ ],
+ "id": 27,
+ "name": "VariableDeclaration",
+ "src": "730:20:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "18160ddd",
+ "mutability": "mutable",
+ "name": "totalSupply",
+ "overrides": null,
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 28,
+ "name": "ElementaryTypeName",
+ "src": "756:7:0"
+ }
+ ],
+ "id": 29,
+ "name": "VariableDeclaration",
+ "src": "756:26:0"
+ },
+ {
+ "attributes": {
+ "documentation": null,
+ "implemented": true,
+ "isConstructor": true,
+ "kind": "constructor",
+ "modifiers": [
+ null
+ ],
+ "name": "",
+ "overrides": null,
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_initialAmount",
+ "overrides": null,
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 30,
+ "name": "ElementaryTypeName",
+ "src": "810:7:0"
+ }
+ ],
+ "id": 31,
+ "name": "VariableDeclaration",
+ "src": "810:22:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_tokenName",
+ "overrides": null,
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "type": "string",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 32,
+ "name": "ElementaryTypeName",
+ "src": "842:6:0"
+ }
+ ],
+ "id": 33,
+ "name": "VariableDeclaration",
+ "src": "842:24:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_decimalUnits",
+ "overrides": null,
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint8",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8",
+ "type": "uint8"
+ },
+ "id": 34,
+ "name": "ElementaryTypeName",
+ "src": "876:5:0"
+ }
+ ],
+ "id": 35,
+ "name": "VariableDeclaration",
+ "src": "876:19:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_tokenSymbol",
+ "overrides": null,
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "type": "string",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 36,
+ "name": "ElementaryTypeName",
+ "src": "905:6:0"
+ }
+ ],
+ "id": 37,
+ "name": "VariableDeclaration",
+ "src": "905:26:0"
+ }
+ ],
+ "id": 38,
+ "name": "ParameterList",
+ "src": "800:137:0"
+ },
+ {
+ "attributes": {
+ "parameters": [
+ null
+ ]
+ },
+ "children": [],
+ "id": 39,
+ "name": "ParameterList",
+ "src": "945:0:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 40,
+ "name": "Identifier",
+ "src": "955:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 41,
+ "name": "Identifier",
+ "src": "964:3:0"
+ }
+ ],
+ "id": 42,
+ "name": "MemberAccess",
+ "src": "964:10:0"
+ }
+ ],
+ "id": 43,
+ "name": "IndexAccess",
+ "src": "955:20:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 31,
+ "type": "uint256",
+ "value": "_initialAmount"
+ },
+ "id": 44,
+ "name": "Identifier",
+ "src": "978:14:0"
+ }
+ ],
+ "id": 45,
+ "name": "Assignment",
+ "src": "955:37:0"
+ }
+ ],
+ "id": 46,
+ "name": "ExpressionStatement",
+ "src": "955:37:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 29,
+ "type": "uint256",
+ "value": "totalSupply"
+ },
+ "id": 47,
+ "name": "Identifier",
+ "src": "1041:11:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 31,
+ "type": "uint256",
+ "value": "_initialAmount"
+ },
+ "id": 48,
+ "name": "Identifier",
+ "src": "1055:14:0"
+ }
+ ],
+ "id": 49,
+ "name": "Assignment",
+ "src": "1041:28:0"
+ }
+ ],
+ "id": 50,
+ "name": "ExpressionStatement",
+ "src": "1041:28:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "string storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 23,
+ "type": "string storage ref",
+ "value": "name"
+ },
+ "id": 51,
+ "name": "Identifier",
+ "src": "1102:4:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 33,
+ "type": "string memory",
+ "value": "_tokenName"
+ },
+ "id": 52,
+ "name": "Identifier",
+ "src": "1109:10:0"
+ }
+ ],
+ "id": 53,
+ "name": "Assignment",
+ "src": "1102:17:0"
+ }
+ ],
+ "id": 54,
+ "name": "ExpressionStatement",
+ "src": "1102:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint8"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 25,
+ "type": "uint8",
+ "value": "decimals"
+ },
+ "id": 55,
+ "name": "Identifier",
+ "src": "1166:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 35,
+ "type": "uint8",
+ "value": "_decimalUnits"
+ },
+ "id": 56,
+ "name": "Identifier",
+ "src": "1177:13:0"
+ }
+ ],
+ "id": 57,
+ "name": "Assignment",
+ "src": "1166:24:0"
+ }
+ ],
+ "id": 58,
+ "name": "ExpressionStatement",
+ "src": "1166:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "string storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 27,
+ "type": "string storage ref",
+ "value": "symbol"
+ },
+ "id": 59,
+ "name": "Identifier",
+ "src": "1243:6:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 37,
+ "type": "string memory",
+ "value": "_tokenSymbol"
+ },
+ "id": 60,
+ "name": "Identifier",
+ "src": "1252:12:0"
+ }
+ ],
+ "id": 61,
+ "name": "Assignment",
+ "src": "1243:21:0"
+ }
+ ],
+ "id": 62,
+ "name": "ExpressionStatement",
+ "src": "1243:21:0"
+ }
+ ],
+ "id": 63,
+ "name": "Block",
+ "src": "945:365:0"
+ }
+ ],
+ "id": 64,
+ "name": "FunctionDefinition",
+ "src": "789:521:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 254
+ ],
+ "documentation": null,
+ "functionSelector": "a9059cbb",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transfer",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 70,
+ "name": "OverrideSpecifier",
+ "src": "1386:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "overrides": null,
+ "scope": 106,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 65,
+ "name": "ElementaryTypeName",
+ "src": "1334:7:0"
+ }
+ ],
+ "id": 66,
+ "name": "VariableDeclaration",
+ "src": "1334:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 106,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 67,
+ "name": "ElementaryTypeName",
+ "src": "1347:7:0"
+ }
+ ],
+ "id": 68,
+ "name": "VariableDeclaration",
+ "src": "1347:14:0"
+ }
+ ],
+ "id": 69,
+ "name": "ParameterList",
+ "src": "1333:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "overrides": null,
+ "scope": 106,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 71,
+ "name": "ElementaryTypeName",
+ "src": "1412:4:0"
+ }
+ ],
+ "id": 72,
+ "name": "VariableDeclaration",
+ "src": "1412:12:0"
+ }
+ ],
+ "id": 73,
+ "name": "ParameterList",
+ "src": "1411:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "overloadedDeclarations": [
+ -18,
+ -18
+ ],
+ "referencedDeclaration": -18,
+ "type": "function (bool) pure",
+ "value": "require"
+ },
+ "id": 74,
+ "name": "Identifier",
+ "src": "1440:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 75,
+ "name": "Identifier",
+ "src": "1448:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "1457:3:0"
+ }
+ ],
+ "id": 77,
+ "name": "MemberAccess",
+ "src": "1457:10:0"
+ }
+ ],
+ "id": 78,
+ "name": "IndexAccess",
+ "src": "1448:20:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 79,
+ "name": "Identifier",
+ "src": "1472:6:0"
+ }
+ ],
+ "id": 80,
+ "name": "BinaryOperation",
+ "src": "1448:30:0"
+ }
+ ],
+ "id": 81,
+ "name": "FunctionCall",
+ "src": "1440:39:0"
+ }
+ ],
+ "id": 82,
+ "name": "ExpressionStatement",
+ "src": "1440:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 83,
+ "name": "Identifier",
+ "src": "1489:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 84,
+ "name": "Identifier",
+ "src": "1498:3:0"
+ }
+ ],
+ "id": 85,
+ "name": "MemberAccess",
+ "src": "1498:10:0"
+ }
+ ],
+ "id": 86,
+ "name": "IndexAccess",
+ "src": "1489:20:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 87,
+ "name": "Identifier",
+ "src": "1513:6:0"
+ }
+ ],
+ "id": 88,
+ "name": "Assignment",
+ "src": "1489:30:0"
+ }
+ ],
+ "id": 89,
+ "name": "ExpressionStatement",
+ "src": "1489:30:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 90,
+ "name": "Identifier",
+ "src": "1529:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 66,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 91,
+ "name": "Identifier",
+ "src": "1538:3:0"
+ }
+ ],
+ "id": 92,
+ "name": "IndexAccess",
+ "src": "1529:13:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 93,
+ "name": "Identifier",
+ "src": "1546:6:0"
+ }
+ ],
+ "id": 94,
+ "name": "Assignment",
+ "src": "1529:23:0"
+ }
+ ],
+ "id": 95,
+ "name": "ExpressionStatement",
+ "src": "1529:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 294,
+ "type": "function (address,address,uint256)",
+ "value": "Transfer"
+ },
+ "id": 96,
+ "name": "Identifier",
+ "src": "1567:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 97,
+ "name": "Identifier",
+ "src": "1576:3:0"
+ }
+ ],
+ "id": 98,
+ "name": "MemberAccess",
+ "src": "1576:10:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 66,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 99,
+ "name": "Identifier",
+ "src": "1588:3:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 100,
+ "name": "Identifier",
+ "src": "1593:6:0"
+ }
+ ],
+ "id": 101,
+ "name": "FunctionCall",
+ "src": "1567:33:0"
+ }
+ ],
+ "id": 102,
+ "name": "EmitStatement",
+ "src": "1562:38:0"
+ },
+ {
+ "attributes": {
+ "functionReturnParameters": 73
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "hexvalue": "74727565",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "subdenomination": null,
+ "token": "bool",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 103,
+ "name": "Literal",
+ "src": "1663:4:0"
+ }
+ ],
+ "id": 104,
+ "name": "Return",
+ "src": "1656:11:0"
+ }
+ ],
+ "id": 105,
+ "name": "Block",
+ "src": "1430:244:0"
+ }
+ ],
+ "id": 106,
+ "name": "FunctionDefinition",
+ "src": "1316:358:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 266
+ ],
+ "documentation": null,
+ "functionSelector": "23b872dd",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transferFrom",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 114,
+ "name": "OverrideSpecifier",
+ "src": "1783:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_from",
+ "overrides": null,
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 107,
+ "name": "ElementaryTypeName",
+ "src": "1711:7:0"
+ }
+ ],
+ "id": 108,
+ "name": "VariableDeclaration",
+ "src": "1711:13:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "overrides": null,
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 109,
+ "name": "ElementaryTypeName",
+ "src": "1734:7:0"
+ }
+ ],
+ "id": 110,
+ "name": "VariableDeclaration",
+ "src": "1734:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 111,
+ "name": "ElementaryTypeName",
+ "src": "1755:7:0"
+ }
+ ],
+ "id": 112,
+ "name": "VariableDeclaration",
+ "src": "1755:14:0"
+ }
+ ],
+ "id": 113,
+ "name": "ParameterList",
+ "src": "1701:74:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "overrides": null,
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 115,
+ "name": "ElementaryTypeName",
+ "src": "1801:4:0"
+ }
+ ],
+ "id": 116,
+ "name": "VariableDeclaration",
+ "src": "1801:12:0"
+ }
+ ],
+ "id": 117,
+ "name": "ParameterList",
+ "src": "1800:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "assignments": [
+ 119
+ ]
+ },
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "allowance_",
+ "overrides": null,
+ "scope": 173,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 118,
+ "name": "ElementaryTypeName",
+ "src": "1825:7:0"
+ }
+ ],
+ "id": 119,
+ "name": "VariableDeclaration",
+ "src": "1825:18:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 120,
+ "name": "Identifier",
+ "src": "1846:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 121,
+ "name": "Identifier",
+ "src": "1854:5:0"
+ }
+ ],
+ "id": 122,
+ "name": "IndexAccess",
+ "src": "1846:14:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 123,
+ "name": "Identifier",
+ "src": "1861:3:0"
+ }
+ ],
+ "id": 124,
+ "name": "MemberAccess",
+ "src": "1861:10:0"
+ }
+ ],
+ "id": 125,
+ "name": "IndexAccess",
+ "src": "1846:26:0"
+ }
+ ],
+ "id": 126,
+ "name": "VariableDeclarationStatement",
+ "src": "1825:47:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "overloadedDeclarations": [
+ -18,
+ -18
+ ],
+ "referencedDeclaration": -18,
+ "type": "function (bool) pure",
+ "value": "require"
+ },
+ "id": 127,
+ "name": "Identifier",
+ "src": "1882:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 128,
+ "name": "Identifier",
+ "src": "1890:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 129,
+ "name": "Identifier",
+ "src": "1899:5:0"
+ }
+ ],
+ "id": 130,
+ "name": "IndexAccess",
+ "src": "1890:15:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 131,
+ "name": "Identifier",
+ "src": "1909:6:0"
+ }
+ ],
+ "id": 132,
+ "name": "BinaryOperation",
+ "src": "1890:25:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 119,
+ "type": "uint256",
+ "value": "allowance_"
+ },
+ "id": 133,
+ "name": "Identifier",
+ "src": "1919:10:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 134,
+ "name": "Identifier",
+ "src": "1933:6:0"
+ }
+ ],
+ "id": 135,
+ "name": "BinaryOperation",
+ "src": "1919:20:0"
+ }
+ ],
+ "id": 136,
+ "name": "BinaryOperation",
+ "src": "1890:49:0"
+ }
+ ],
+ "id": 137,
+ "name": "FunctionCall",
+ "src": "1882:58:0"
+ }
+ ],
+ "id": 138,
+ "name": "ExpressionStatement",
+ "src": "1882:58:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 139,
+ "name": "Identifier",
+ "src": "1950:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 110,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 140,
+ "name": "Identifier",
+ "src": "1959:3:0"
+ }
+ ],
+ "id": 141,
+ "name": "IndexAccess",
+ "src": "1950:13:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 142,
+ "name": "Identifier",
+ "src": "1967:6:0"
+ }
+ ],
+ "id": 143,
+ "name": "Assignment",
+ "src": "1950:23:0"
+ }
+ ],
+ "id": 144,
+ "name": "ExpressionStatement",
+ "src": "1950:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 145,
+ "name": "Identifier",
+ "src": "1983:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "1992:5:0"
+ }
+ ],
+ "id": 147,
+ "name": "IndexAccess",
+ "src": "1983:15:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 148,
+ "name": "Identifier",
+ "src": "2002:6:0"
+ }
+ ],
+ "id": 149,
+ "name": "Assignment",
+ "src": "1983:25:0"
+ }
+ ],
+ "id": 150,
+ "name": "ExpressionStatement",
+ "src": "1983:25:0"
+ },
+ {
+ "attributes": {
+ "falseBody": null
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 119,
+ "type": "uint256",
+ "value": "allowance_"
+ },
+ "id": 151,
+ "name": "Identifier",
+ "src": "2022:10:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 11,
+ "type": "uint256",
+ "value": "MAX_UINT256"
+ },
+ "id": 152,
+ "name": "Identifier",
+ "src": "2035:11:0"
+ }
+ ],
+ "id": 153,
+ "name": "BinaryOperation",
+ "src": "2022:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 154,
+ "name": "Identifier",
+ "src": "2062:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 155,
+ "name": "Identifier",
+ "src": "2070:5:0"
+ }
+ ],
+ "id": 158,
+ "name": "IndexAccess",
+ "src": "2062:14:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "2077:3:0"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "2077:10:0"
+ }
+ ],
+ "id": 159,
+ "name": "IndexAccess",
+ "src": "2062:26:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 160,
+ "name": "Identifier",
+ "src": "2092:6:0"
+ }
+ ],
+ "id": 161,
+ "name": "Assignment",
+ "src": "2062:36:0"
+ }
+ ],
+ "id": 162,
+ "name": "ExpressionStatement",
+ "src": "2062:36:0"
+ }
+ ],
+ "id": 163,
+ "name": "Block",
+ "src": "2048:61:0"
+ }
+ ],
+ "id": 164,
+ "name": "IfStatement",
+ "src": "2018:91:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 294,
+ "type": "function (address,address,uint256)",
+ "value": "Transfer"
+ },
+ "id": 165,
+ "name": "Identifier",
+ "src": "2123:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 166,
+ "name": "Identifier",
+ "src": "2132:5:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 110,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 167,
+ "name": "Identifier",
+ "src": "2139:3:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 168,
+ "name": "Identifier",
+ "src": "2144:6:0"
+ }
+ ],
+ "id": 169,
+ "name": "FunctionCall",
+ "src": "2123:28:0"
+ }
+ ],
+ "id": 170,
+ "name": "EmitStatement",
+ "src": "2118:33:0"
+ },
+ {
+ "attributes": {
+ "functionReturnParameters": 117
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "hexvalue": "74727565",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "subdenomination": null,
+ "token": "bool",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 171,
+ "name": "Literal",
+ "src": "2214:4:0"
+ }
+ ],
+ "id": 172,
+ "name": "Return",
+ "src": "2207:11:0"
+ }
+ ],
+ "id": 173,
+ "name": "Block",
+ "src": "1815:410:0"
+ }
+ ],
+ "id": 174,
+ "name": "FunctionDefinition",
+ "src": "1680:545:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 244
+ ],
+ "documentation": null,
+ "functionSelector": "70a08231",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "balanceOf",
+ "scope": 234,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 178,
+ "name": "OverrideSpecifier",
+ "src": "2302:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "overrides": null,
+ "scope": 187,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 175,
+ "name": "ElementaryTypeName",
+ "src": "2250:7:0"
+ }
+ ],
+ "id": 176,
+ "name": "VariableDeclaration",
+ "src": "2250:14:0"
+ }
+ ],
+ "id": 177,
+ "name": "ParameterList",
+ "src": "2249:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "balance",
+ "overrides": null,
+ "scope": 187,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 179,
+ "name": "ElementaryTypeName",
+ "src": "2328:7:0"
+ }
+ ],
+ "id": 180,
+ "name": "VariableDeclaration",
+ "src": "2328:15:0"
+ }
+ ],
+ "id": 181,
+ "name": "ParameterList",
+ "src": "2327:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "functionReturnParameters": 181
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 182,
+ "name": "Identifier",
+ "src": "2366:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 176,
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 183,
+ "name": "Identifier",
+ "src": "2375:6:0"
+ }
+ ],
+ "id": 184,
+ "name": "IndexAccess",
+ "src": "2366:16:0"
+ }
+ ],
+ "id": 185,
+ "name": "Return",
+ "src": "2359:23:0"
+ }
+ ],
+ "id": 186,
+ "name": "Block",
+ "src": "2349:40:0"
+ }
+ ],
+ "id": 187,
+ "name": "FunctionDefinition",
+ "src": "2231:158:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 276
+ ],
+ "documentation": null,
+ "functionSelector": "095ea7b3",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "approve",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 193,
+ "name": "OverrideSpecifier",
+ "src": "2469:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "overrides": null,
+ "scope": 216,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 188,
+ "name": "ElementaryTypeName",
+ "src": "2412:7:0"
+ }
+ ],
+ "id": 189,
+ "name": "VariableDeclaration",
+ "src": "2412:16:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 216,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 190,
+ "name": "ElementaryTypeName",
+ "src": "2430:7:0"
+ }
+ ],
+ "id": 191,
+ "name": "VariableDeclaration",
+ "src": "2430:14:0"
+ }
+ ],
+ "id": 192,
+ "name": "ParameterList",
+ "src": "2411:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "overrides": null,
+ "scope": 216,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 194,
+ "name": "ElementaryTypeName",
+ "src": "2495:4:0"
+ }
+ ],
+ "id": 195,
+ "name": "VariableDeclaration",
+ "src": "2495:12:0"
+ }
+ ],
+ "id": 196,
+ "name": "ParameterList",
+ "src": "2494:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 197,
+ "name": "Identifier",
+ "src": "2523:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 198,
+ "name": "Identifier",
+ "src": "2531:3:0"
+ }
+ ],
+ "id": 199,
+ "name": "MemberAccess",
+ "src": "2531:10:0"
+ }
+ ],
+ "id": 201,
+ "name": "IndexAccess",
+ "src": "2523:19:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 189,
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 200,
+ "name": "Identifier",
+ "src": "2543:8:0"
+ }
+ ],
+ "id": 202,
+ "name": "IndexAccess",
+ "src": "2523:29:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 191,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 203,
+ "name": "Identifier",
+ "src": "2555:6:0"
+ }
+ ],
+ "id": 204,
+ "name": "Assignment",
+ "src": "2523:38:0"
+ }
+ ],
+ "id": 205,
+ "name": "ExpressionStatement",
+ "src": "2523:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 302,
+ "type": "function (address,address,uint256)",
+ "value": "Approval"
+ },
+ "id": 206,
+ "name": "Identifier",
+ "src": "2576:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "referencedDeclaration": null,
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": -15,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 207,
+ "name": "Identifier",
+ "src": "2585:3:0"
+ }
+ ],
+ "id": 208,
+ "name": "MemberAccess",
+ "src": "2585:10:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 189,
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 209,
+ "name": "Identifier",
+ "src": "2597:8:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 191,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 210,
+ "name": "Identifier",
+ "src": "2607:6:0"
+ }
+ ],
+ "id": 211,
+ "name": "FunctionCall",
+ "src": "2576:38:0"
+ }
+ ],
+ "id": 212,
+ "name": "EmitStatement",
+ "src": "2571:43:0"
+ },
+ {
+ "attributes": {
+ "functionReturnParameters": 196
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "hexvalue": "74727565",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "subdenomination": null,
+ "token": "bool",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 213,
+ "name": "Literal",
+ "src": "2677:4:0"
+ }
+ ],
+ "id": 214,
+ "name": "Return",
+ "src": "2670:11:0"
+ }
+ ],
+ "id": 215,
+ "name": "Block",
+ "src": "2513:175:0"
+ }
+ ],
+ "id": 216,
+ "name": "FunctionDefinition",
+ "src": "2395:293:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 286
+ ],
+ "documentation": null,
+ "functionSelector": "dd62ed3e",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "allowance",
+ "scope": 234,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 222,
+ "name": "OverrideSpecifier",
+ "src": "2783:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "overrides": null,
+ "scope": 233,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 217,
+ "name": "ElementaryTypeName",
+ "src": "2713:7:0"
+ }
+ ],
+ "id": 218,
+ "name": "VariableDeclaration",
+ "src": "2713:14:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "overrides": null,
+ "scope": 233,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 219,
+ "name": "ElementaryTypeName",
+ "src": "2729:7:0"
+ }
+ ],
+ "id": 220,
+ "name": "VariableDeclaration",
+ "src": "2729:16:0"
+ }
+ ],
+ "id": 221,
+ "name": "ParameterList",
+ "src": "2712:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "remaining",
+ "overrides": null,
+ "scope": 233,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 223,
+ "name": "ElementaryTypeName",
+ "src": "2809:7:0"
+ }
+ ],
+ "id": 224,
+ "name": "VariableDeclaration",
+ "src": "2809:17:0"
+ }
+ ],
+ "id": 225,
+ "name": "ParameterList",
+ "src": "2808:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "functionReturnParameters": 225
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 226,
+ "name": "Identifier",
+ "src": "2849:7:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 218,
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "2857:6:0"
+ }
+ ],
+ "id": 228,
+ "name": "IndexAccess",
+ "src": "2849:15:0"
+ },
+ {
+ "attributes": {
+ "argumentTypes": null,
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 220,
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 229,
+ "name": "Identifier",
+ "src": "2865:8:0"
+ }
+ ],
+ "id": 230,
+ "name": "IndexAccess",
+ "src": "2849:25:0"
+ }
+ ],
+ "id": 231,
+ "name": "Return",
+ "src": "2842:32:0"
+ }
+ ],
+ "id": 232,
+ "name": "Block",
+ "src": "2832:49:0"
+ }
+ ],
+ "id": 233,
+ "name": "FunctionDefinition",
+ "src": "2694:187:0"
+ }
+ ],
+ "id": 234,
+ "name": "ContractDefinition",
+ "src": "189:2694:0"
+ }
+ ],
+ "id": 235,
+ "name": "SourceUnit",
+ "src": "139:2745:0"
+ },
+ "compiler": {
+ "name": "solc",
+ "version": "0.6.12"
+ },
+ "networks": {
+ "28": {
+ "events": {
+ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925": {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef": {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ }
+ },
+ "links": {},
+ "address": "0xCd57a950c523724292C2341047A27a0723Fe47c9",
+ "transactionHash": "0x09f4bc99422468f5f0f251f6ca823090ba919390c49cc4dcfbead04bef5813b3"
+ }
+ },
+ "schemaVersion": "3.4.1",
+ "updatedAt": "2021-06-29T00:51:47.973Z",
+ "networkType": "ethereum",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "The address of the account owning tokens",
+ "_spender": "The address of the account able to transfer the tokens"
+ },
+ "returns": {
+ "remaining": "Amount of remaining tokens allowed to spent"
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_spender": "The address of the account able to transfer the tokens",
+ "_value": "The amount of tokens to be approved for transfer"
+ },
+ "returns": {
+ "success": "Whether the approval was successful or not"
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "The address from which the balance will be retrieved"
+ },
+ "returns": {
+ "balance": "The balance"
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_from": "The address of the sender",
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ }
+ },
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "approve(address,uint256)": {
+ "notice": "`msg.sender` approves `_spender` to spend `_value` tokens"
+ },
+ "transfer(address,uint256)": {
+ "notice": "send `_value` token to `_to` from `msg.sender`"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "send `_value` token to `_to` from `_from` on the condition it is approved by `_from`"
+ }
+ },
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/truffle/build-ovm/IERC20.json b/omgx_examples/truffle/build-ovm/IERC20.json
new file mode 100644
index 000000000000..3a61c6bf6ee2
--- /dev/null
+++ b/omgx_examples/truffle/build-ovm/IERC20.json
@@ -0,0 +1,2035 @@
+{
+ "contractName": "IERC20",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "remaining",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.6.12-develop.2020.12.9+commit.9b8c5857\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"The address of the account owning tokens\",\"_spender\":\"The address of the account able to transfer the tokens\"},\"returns\":{\"remaining\":\"Amount of remaining tokens allowed to spent\"}},\"approve(address,uint256)\":{\"params\":{\"_spender\":\"The address of the account able to transfer the tokens\",\"_value\":\"The amount of tokens to be approved for transfer\"},\"returns\":{\"success\":\"Whether the approval was successful or not\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"The address from which the balance will be retrieved\"},\"returns\":{\"balance\":\"The balance\"}},\"transfer(address,uint256)\":{\"params\":{\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_from\":\"The address of the sender\",\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"`msg.sender` approves `_spender` to spend `_value` tokens\"},\"transfer(address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `msg.sender`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1},\"remappings\":[]},\"sources\":{\"/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol\":{\"keccak256\":\"0x64a6e4d4bb82d69c9ff02b073fc5057612374eed338e1c5a0cdb14994c051477\",\"license\":\"MIT LICENSE\",\"urls\":[\"bzz-raw://79a7752367c0f3df1ac388fc7af067e9d7db81346336917549c72fced3abe419\",\"dweb:/ipfs/QmXAkeog3ZARpJoK2bGKuH6Yy8RYTtaLi3VnAUtbHq8Uvn\"]}},\"version\":1}",
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "immutableReferences": {},
+ "sourceMap": "",
+ "deployedSourceMap": "",
+ "source": "// SPDX-License-Identifier: MIT LICENSE\n// Abstract contract for the full ERC20 Token standard\n// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\npragma solidity ^0.6.12;\n\ninterface IERC20 {\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n external\n returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n ) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n external\n returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
+ "sourcePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "ast": {
+ "absolutePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "exportedSymbols": {
+ "IERC20": [
+ 303
+ ]
+ },
+ "id": 304,
+ "license": "MIT LICENSE",
+ "nodeType": "SourceUnit",
+ "nodes": [
+ {
+ "id": 236,
+ "literals": [
+ "solidity",
+ "^",
+ "0.6",
+ ".12"
+ ],
+ "nodeType": "PragmaDirective",
+ "src": "158:24:1"
+ },
+ {
+ "abstract": false,
+ "baseContracts": [],
+ "contractDependencies": [],
+ "contractKind": "interface",
+ "documentation": null,
+ "fullyImplemented": false,
+ "id": 303,
+ "linearizedBaseContracts": [
+ 303
+ ],
+ "name": "IERC20",
+ "nodeType": "ContractDefinition",
+ "nodes": [
+ {
+ "body": null,
+ "documentation": {
+ "id": 237,
+ "nodeType": "StructuredDocumentation",
+ "src": "207:106:1",
+ "text": "@param _owner The address from which the balance will be retrieved\n @return balance The balance"
+ },
+ "functionSelector": "70a08231",
+ "id": 244,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "balanceOf",
+ "nodeType": "FunctionDefinition",
+ "overrides": null,
+ "parameters": {
+ "id": 240,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 239,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 244,
+ "src": "337:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 238,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "337:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "336:16:1"
+ },
+ "returnParameters": {
+ "id": 243,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 242,
+ "mutability": "mutable",
+ "name": "balance",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 244,
+ "src": "376:15:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 241,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "376:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "375:17:1"
+ },
+ "scope": 303,
+ "src": "318:75:1",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "body": null,
+ "documentation": {
+ "id": 245,
+ "nodeType": "StructuredDocumentation",
+ "src": "399:233:1",
+ "text": "@notice send `_value` token to `_to` from `msg.sender`\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "functionSelector": "a9059cbb",
+ "id": 254,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transfer",
+ "nodeType": "FunctionDefinition",
+ "overrides": null,
+ "parameters": {
+ "id": 250,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 247,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 254,
+ "src": "655:11:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 246,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "655:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 249,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 254,
+ "src": "668:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 248,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "668:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "654:29:1"
+ },
+ "returnParameters": {
+ "id": 253,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 252,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 254,
+ "src": "718:12:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 251,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "718:4:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "717:14:1"
+ },
+ "scope": 303,
+ "src": "637:95:1",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "body": null,
+ "documentation": {
+ "id": 255,
+ "nodeType": "StructuredDocumentation",
+ "src": "738:318:1",
+ "text": "@notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n @param _from The address of the sender\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "functionSelector": "23b872dd",
+ "id": 266,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transferFrom",
+ "nodeType": "FunctionDefinition",
+ "overrides": null,
+ "parameters": {
+ "id": 262,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 257,
+ "mutability": "mutable",
+ "name": "_from",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 266,
+ "src": "1092:13:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 256,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1092:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 259,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 266,
+ "src": "1115:11:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 258,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1115:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 261,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 266,
+ "src": "1136:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 260,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1136:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1082:74:1"
+ },
+ "returnParameters": {
+ "id": 265,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 264,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 266,
+ "src": "1175:12:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 263,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1175:4:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1174:14:1"
+ },
+ "scope": 303,
+ "src": "1061:128:1",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "body": null,
+ "documentation": {
+ "id": 267,
+ "nodeType": "StructuredDocumentation",
+ "src": "1195:286:1",
+ "text": "@notice `msg.sender` approves `_spender` to spend `_value` tokens\n @param _spender The address of the account able to transfer the tokens\n @param _value The amount of tokens to be approved for transfer\n @return success Whether the approval was successful or not"
+ },
+ "functionSelector": "095ea7b3",
+ "id": 276,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "approve",
+ "nodeType": "FunctionDefinition",
+ "overrides": null,
+ "parameters": {
+ "id": 272,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 269,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 276,
+ "src": "1503:16:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 268,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1503:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 271,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 276,
+ "src": "1521:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 270,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1521:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1502:34:1"
+ },
+ "returnParameters": {
+ "id": 275,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 274,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 276,
+ "src": "1571:12:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 273,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1571:4:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1570:14:1"
+ },
+ "scope": 303,
+ "src": "1486:99:1",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "body": null,
+ "documentation": {
+ "id": 277,
+ "nodeType": "StructuredDocumentation",
+ "src": "1591:207:1",
+ "text": "@param _owner The address of the account owning tokens\n @param _spender The address of the account able to transfer the tokens\n @return remaining Amount of remaining tokens allowed to spent"
+ },
+ "functionSelector": "dd62ed3e",
+ "id": 286,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "allowance",
+ "nodeType": "FunctionDefinition",
+ "overrides": null,
+ "parameters": {
+ "id": 282,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 279,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 286,
+ "src": "1822:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 278,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1822:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 281,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 286,
+ "src": "1838:16:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 280,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1838:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1821:34:1"
+ },
+ "returnParameters": {
+ "id": 285,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 284,
+ "mutability": "mutable",
+ "name": "remaining",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 286,
+ "src": "1903:17:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 283,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1903:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "1902:19:1"
+ },
+ "scope": 303,
+ "src": "1803:119:1",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "anonymous": false,
+ "documentation": null,
+ "id": 294,
+ "name": "Transfer",
+ "nodeType": "EventDefinition",
+ "parameters": {
+ "id": 293,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 288,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_from",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 294,
+ "src": "2002:21:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 287,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2002:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 290,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 294,
+ "src": "2025:19:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 289,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2025:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 292,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 294,
+ "src": "2046:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 291,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2046:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2001:60:1"
+ },
+ "src": "1987:75:1"
+ },
+ {
+ "anonymous": false,
+ "documentation": null,
+ "id": 302,
+ "name": "Approval",
+ "nodeType": "EventDefinition",
+ "parameters": {
+ "id": 301,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 296,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 302,
+ "src": "2091:22:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 295,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2091:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 298,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 302,
+ "src": "2123:24:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 297,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2123:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 300,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "overrides": null,
+ "scope": 302,
+ "src": "2157:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 299,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2157:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": null,
+ "visibility": "internal"
+ }
+ ],
+ "src": "2081:96:1"
+ },
+ "src": "2067:111:1"
+ }
+ ],
+ "scope": 304,
+ "src": "184:1996:1"
+ }
+ ],
+ "src": "158:2023:1"
+ },
+ "legacyAST": {
+ "attributes": {
+ "absolutePath": "/Users/janliphardt/Documents/GitHub/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "exportedSymbols": {
+ "IERC20": [
+ 303
+ ]
+ },
+ "license": "MIT LICENSE"
+ },
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.6",
+ ".12"
+ ]
+ },
+ "id": 236,
+ "name": "PragmaDirective",
+ "src": "158:24:1"
+ },
+ {
+ "attributes": {
+ "abstract": false,
+ "baseContracts": [
+ null
+ ],
+ "contractDependencies": [
+ null
+ ],
+ "contractKind": "interface",
+ "documentation": null,
+ "fullyImplemented": false,
+ "linearizedBaseContracts": [
+ 303
+ ],
+ "name": "IERC20",
+ "scope": 304
+ },
+ "children": [
+ {
+ "attributes": {
+ "body": null,
+ "functionSelector": "70a08231",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "balanceOf",
+ "overrides": null,
+ "scope": 303,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@param _owner The address from which the balance will be retrieved\n @return balance The balance"
+ },
+ "id": 237,
+ "name": "StructuredDocumentation",
+ "src": "207:106:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "overrides": null,
+ "scope": 244,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 238,
+ "name": "ElementaryTypeName",
+ "src": "337:7:1"
+ }
+ ],
+ "id": 239,
+ "name": "VariableDeclaration",
+ "src": "337:14:1"
+ }
+ ],
+ "id": 240,
+ "name": "ParameterList",
+ "src": "336:16:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "balance",
+ "overrides": null,
+ "scope": 244,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 241,
+ "name": "ElementaryTypeName",
+ "src": "376:7:1"
+ }
+ ],
+ "id": 242,
+ "name": "VariableDeclaration",
+ "src": "376:15:1"
+ }
+ ],
+ "id": 243,
+ "name": "ParameterList",
+ "src": "375:17:1"
+ }
+ ],
+ "id": 244,
+ "name": "FunctionDefinition",
+ "src": "318:75:1"
+ },
+ {
+ "attributes": {
+ "body": null,
+ "functionSelector": "a9059cbb",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transfer",
+ "overrides": null,
+ "scope": 303,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@notice send `_value` token to `_to` from `msg.sender`\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "id": 245,
+ "name": "StructuredDocumentation",
+ "src": "399:233:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "overrides": null,
+ "scope": 254,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 246,
+ "name": "ElementaryTypeName",
+ "src": "655:7:1"
+ }
+ ],
+ "id": 247,
+ "name": "VariableDeclaration",
+ "src": "655:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 254,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 248,
+ "name": "ElementaryTypeName",
+ "src": "668:7:1"
+ }
+ ],
+ "id": 249,
+ "name": "VariableDeclaration",
+ "src": "668:14:1"
+ }
+ ],
+ "id": 250,
+ "name": "ParameterList",
+ "src": "654:29:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "overrides": null,
+ "scope": 254,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 251,
+ "name": "ElementaryTypeName",
+ "src": "718:4:1"
+ }
+ ],
+ "id": 252,
+ "name": "VariableDeclaration",
+ "src": "718:12:1"
+ }
+ ],
+ "id": 253,
+ "name": "ParameterList",
+ "src": "717:14:1"
+ }
+ ],
+ "id": 254,
+ "name": "FunctionDefinition",
+ "src": "637:95:1"
+ },
+ {
+ "attributes": {
+ "body": null,
+ "functionSelector": "23b872dd",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transferFrom",
+ "overrides": null,
+ "scope": 303,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n @param _from The address of the sender\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "id": 255,
+ "name": "StructuredDocumentation",
+ "src": "738:318:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_from",
+ "overrides": null,
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 256,
+ "name": "ElementaryTypeName",
+ "src": "1092:7:1"
+ }
+ ],
+ "id": 257,
+ "name": "VariableDeclaration",
+ "src": "1092:13:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "overrides": null,
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 258,
+ "name": "ElementaryTypeName",
+ "src": "1115:7:1"
+ }
+ ],
+ "id": 259,
+ "name": "VariableDeclaration",
+ "src": "1115:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 260,
+ "name": "ElementaryTypeName",
+ "src": "1136:7:1"
+ }
+ ],
+ "id": 261,
+ "name": "VariableDeclaration",
+ "src": "1136:14:1"
+ }
+ ],
+ "id": 262,
+ "name": "ParameterList",
+ "src": "1082:74:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "overrides": null,
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 263,
+ "name": "ElementaryTypeName",
+ "src": "1175:4:1"
+ }
+ ],
+ "id": 264,
+ "name": "VariableDeclaration",
+ "src": "1175:12:1"
+ }
+ ],
+ "id": 265,
+ "name": "ParameterList",
+ "src": "1174:14:1"
+ }
+ ],
+ "id": 266,
+ "name": "FunctionDefinition",
+ "src": "1061:128:1"
+ },
+ {
+ "attributes": {
+ "body": null,
+ "functionSelector": "095ea7b3",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "approve",
+ "overrides": null,
+ "scope": 303,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@notice `msg.sender` approves `_spender` to spend `_value` tokens\n @param _spender The address of the account able to transfer the tokens\n @param _value The amount of tokens to be approved for transfer\n @return success Whether the approval was successful or not"
+ },
+ "id": 267,
+ "name": "StructuredDocumentation",
+ "src": "1195:286:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "overrides": null,
+ "scope": 276,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 268,
+ "name": "ElementaryTypeName",
+ "src": "1503:7:1"
+ }
+ ],
+ "id": 269,
+ "name": "VariableDeclaration",
+ "src": "1503:16:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 276,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 270,
+ "name": "ElementaryTypeName",
+ "src": "1521:7:1"
+ }
+ ],
+ "id": 271,
+ "name": "VariableDeclaration",
+ "src": "1521:14:1"
+ }
+ ],
+ "id": 272,
+ "name": "ParameterList",
+ "src": "1502:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "overrides": null,
+ "scope": 276,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 273,
+ "name": "ElementaryTypeName",
+ "src": "1571:4:1"
+ }
+ ],
+ "id": 274,
+ "name": "VariableDeclaration",
+ "src": "1571:12:1"
+ }
+ ],
+ "id": 275,
+ "name": "ParameterList",
+ "src": "1570:14:1"
+ }
+ ],
+ "id": 276,
+ "name": "FunctionDefinition",
+ "src": "1486:99:1"
+ },
+ {
+ "attributes": {
+ "body": null,
+ "functionSelector": "dd62ed3e",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "allowance",
+ "overrides": null,
+ "scope": 303,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@param _owner The address of the account owning tokens\n @param _spender The address of the account able to transfer the tokens\n @return remaining Amount of remaining tokens allowed to spent"
+ },
+ "id": 277,
+ "name": "StructuredDocumentation",
+ "src": "1591:207:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "overrides": null,
+ "scope": 286,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 278,
+ "name": "ElementaryTypeName",
+ "src": "1822:7:1"
+ }
+ ],
+ "id": 279,
+ "name": "VariableDeclaration",
+ "src": "1822:14:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "overrides": null,
+ "scope": 286,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 280,
+ "name": "ElementaryTypeName",
+ "src": "1838:7:1"
+ }
+ ],
+ "id": 281,
+ "name": "VariableDeclaration",
+ "src": "1838:16:1"
+ }
+ ],
+ "id": 282,
+ "name": "ParameterList",
+ "src": "1821:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "remaining",
+ "overrides": null,
+ "scope": 286,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 283,
+ "name": "ElementaryTypeName",
+ "src": "1903:7:1"
+ }
+ ],
+ "id": 284,
+ "name": "VariableDeclaration",
+ "src": "1903:17:1"
+ }
+ ],
+ "id": 285,
+ "name": "ParameterList",
+ "src": "1902:19:1"
+ }
+ ],
+ "id": 286,
+ "name": "FunctionDefinition",
+ "src": "1803:119:1"
+ },
+ {
+ "attributes": {
+ "anonymous": false,
+ "documentation": null,
+ "name": "Transfer"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_from",
+ "overrides": null,
+ "scope": 294,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 287,
+ "name": "ElementaryTypeName",
+ "src": "2002:7:1"
+ }
+ ],
+ "id": 288,
+ "name": "VariableDeclaration",
+ "src": "2002:21:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_to",
+ "overrides": null,
+ "scope": 294,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 289,
+ "name": "ElementaryTypeName",
+ "src": "2025:7:1"
+ }
+ ],
+ "id": 290,
+ "name": "VariableDeclaration",
+ "src": "2025:19:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 294,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 291,
+ "name": "ElementaryTypeName",
+ "src": "2046:7:1"
+ }
+ ],
+ "id": 292,
+ "name": "VariableDeclaration",
+ "src": "2046:14:1"
+ }
+ ],
+ "id": 293,
+ "name": "ParameterList",
+ "src": "2001:60:1"
+ }
+ ],
+ "id": 294,
+ "name": "EventDefinition",
+ "src": "1987:75:1"
+ },
+ {
+ "attributes": {
+ "anonymous": false,
+ "documentation": null,
+ "name": "Approval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_owner",
+ "overrides": null,
+ "scope": 302,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 295,
+ "name": "ElementaryTypeName",
+ "src": "2091:7:1"
+ }
+ ],
+ "id": 296,
+ "name": "VariableDeclaration",
+ "src": "2091:22:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_spender",
+ "overrides": null,
+ "scope": 302,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 297,
+ "name": "ElementaryTypeName",
+ "src": "2123:7:1"
+ }
+ ],
+ "id": 298,
+ "name": "VariableDeclaration",
+ "src": "2123:24:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "overrides": null,
+ "scope": 302,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "value": null,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 299,
+ "name": "ElementaryTypeName",
+ "src": "2157:7:1"
+ }
+ ],
+ "id": 300,
+ "name": "VariableDeclaration",
+ "src": "2157:14:1"
+ }
+ ],
+ "id": 301,
+ "name": "ParameterList",
+ "src": "2081:96:1"
+ }
+ ],
+ "id": 302,
+ "name": "EventDefinition",
+ "src": "2067:111:1"
+ }
+ ],
+ "id": 303,
+ "name": "ContractDefinition",
+ "src": "184:1996:1"
+ }
+ ],
+ "id": 304,
+ "name": "SourceUnit",
+ "src": "158:2023:1"
+ },
+ "compiler": {
+ "name": "solc",
+ "version": "0.6.12"
+ },
+ "networks": {},
+ "schemaVersion": "3.4.1",
+ "updatedAt": "2021-06-29T00:48:09.745Z",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "The address of the account owning tokens",
+ "_spender": "The address of the account able to transfer the tokens"
+ },
+ "returns": {
+ "remaining": "Amount of remaining tokens allowed to spent"
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_spender": "The address of the account able to transfer the tokens",
+ "_value": "The amount of tokens to be approved for transfer"
+ },
+ "returns": {
+ "success": "Whether the approval was successful or not"
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "The address from which the balance will be retrieved"
+ },
+ "returns": {
+ "balance": "The balance"
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_from": "The address of the sender",
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ }
+ },
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "approve(address,uint256)": {
+ "notice": "`msg.sender` approves `_spender` to spend `_value` tokens"
+ },
+ "transfer(address,uint256)": {
+ "notice": "send `_value` token to `_to` from `msg.sender`"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "send `_value` token to `_to` from `_from` on the condition it is approved by `_from`"
+ }
+ },
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/truffle/build/ERC20.json b/omgx_examples/truffle/build/ERC20.json
new file mode 100644
index 000000000000..3b2a702ca249
--- /dev/null
+++ b/omgx_examples/truffle/build/ERC20.json
@@ -0,0 +1,6304 @@
+{
+ "contractName": "ERC20",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "_initialAmount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "_tokenName",
+ "type": "string"
+ },
+ {
+ "internalType": "uint8",
+ "name": "_decimalUnits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "string",
+ "name": "_tokenSymbol",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowed",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balances",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "remaining",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "constant": true
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_initialAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimalUnits\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"_tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"The address of the account owning tokens\",\"_spender\":\"The address of the account able to transfer the tokens\"},\"returns\":{\"remaining\":\"Amount of remaining tokens allowed to spent\"}},\"approve(address,uint256)\":{\"params\":{\"_spender\":\"The address of the account able to transfer the tokens\",\"_value\":\"The amount of tokens to be approved for transfer\"},\"returns\":{\"success\":\"Whether the approval was successful or not\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"The address from which the balance will be retrieved\"},\"returns\":{\"balance\":\"The balance\"}},\"transfer(address,uint256)\":{\"params\":{\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_from\":\"The address of the sender\",\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"`msg.sender` approves `_spender` to spend `_value` tokens\"},\"transfer(address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `msg.sender`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/ERC20.sol\":{\"keccak256\":\"0x5007795ad805bf6351a439bc82030638b85226dad2b31d900b277e5c1467a64d\",\"license\":\"MIT LICENSE\",\"urls\":[\"bzz-raw://f8ceab6b5786d46812b8ecdfc2441364f0e58fcc302102e370ace3547e4f6afc\",\"dweb:/ipfs/QmTXqENVTSdH8efxjoepvJZ5K1gYy2tkBAus14Mm8PE9nw\"]},\"/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol\":{\"keccak256\":\"0x8ef504530876907bd4a3726db7420664851e938a2a9dd32c89a16bd58305774d\",\"license\":\"MIT LICENSE\",\"urls\":[\"bzz-raw://3715c7af8b33b29f7794ea7246c17ce7345329288a70b3cbded6231bef76a3a1\",\"dweb:/ipfs/QmbbWeGZHMvAyxro9sSzJH6aSfEJ4eMarnHG9oxb38Yz5v\"]}},\"version\":1}",
+ "bytecode": "0x60806040523480156200001157600080fd5b5060405162000f8138038062000f81833981810160405260808110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660018202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019080838360005b83811015620000cd578082015181840152602081019050620000b0565b50505050905090810190601f168015620000fb5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805160405193929190846401000000008211156200012957600080fd5b838201915060208201858111156200014057600080fd5b82518660018202830111640100000000821117156200015e57600080fd5b8083526020830192505050908051906020019080838360005b838110156200019457808201518184015260208101905062000177565b50505050905090810190601f168015620001c25780820380516001836020036101000a031916815260200191505b50604052505050836000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360058190555082600290805190602001906200022b9291906200026a565b5081600360006101000a81548160ff021916908360ff16021790555080600490805190602001906200025f9291906200026a565b505050505062000320565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002a25760008555620002ee565b82601f10620002bd57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ed578251825591602001919060010190620002d0565b5b509050620002fd919062000301565b5090565b5b808211156200031c57600081600090555060010162000302565b5090565b610c5180620003306000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063313ce56711610071578063313ce5671461028f5780635c658165146102b057806370a082311461032857806395d89b4114610380578063a9059cbb14610403578063dd62ed3e14610467576100a9565b806306fdde03146100ae578063095ea7b31461013157806318160ddd1461019557806323b872dd146101b357806327e235e314610237575b600080fd5b6100b66104df565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f65780820151818401526020810190506100db565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017d6004803603604081101561014757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061057d565b60405180821515815260200191505060405180910390f35b61019d61066f565b6040518082815260200191505060405180910390f35b61021f600480360360608110156101c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610675565b60405180821515815260200191505060405180910390f35b6102796004803603602081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061090a565b6040518082815260200191505060405180910390f35b610297610922565b604051808260ff16815260200191505060405180910390f35b610312600480360360408110156102c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610935565b6040518082815260200191505060405180910390f35b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061095a565b6040518082815260200191505060405180910390f35b6103886109a2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c85780820151818401526020810190506103ad565b50505050905090810190601f1680156103f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61044f6004803603604081101561041957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a40565b60405180821515815260200191505060405180910390f35b6104c96004803603604081101561047d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b94565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105755780601f1061054a57610100808354040283529160200191610575565b820191906000526020600020905b81548152906001019060200180831161055857829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60055481565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156107455750828110155b61074e57600080fd5b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156108995782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b60006020528060005260406000206000915090505481565b600360009054906101000a900460ff1681565b6001602052816000526040600020602052806000526040600020600091509150505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b505050505081565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610a8d57600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509291505056fea26469706673582212200215417d1b93c45037db00fcbe9489d491cc2430fd5731faaa6e1b38e125f20864736f6c63430007060033",
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063313ce56711610071578063313ce5671461028f5780635c658165146102b057806370a082311461032857806395d89b4114610380578063a9059cbb14610403578063dd62ed3e14610467576100a9565b806306fdde03146100ae578063095ea7b31461013157806318160ddd1461019557806323b872dd146101b357806327e235e314610237575b600080fd5b6100b66104df565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f65780820151818401526020810190506100db565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017d6004803603604081101561014757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061057d565b60405180821515815260200191505060405180910390f35b61019d61066f565b6040518082815260200191505060405180910390f35b61021f600480360360608110156101c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610675565b60405180821515815260200191505060405180910390f35b6102796004803603602081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061090a565b6040518082815260200191505060405180910390f35b610297610922565b604051808260ff16815260200191505060405180910390f35b610312600480360360408110156102c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610935565b6040518082815260200191505060405180910390f35b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061095a565b6040518082815260200191505060405180910390f35b6103886109a2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c85780820151818401526020810190506103ad565b50505050905090810190601f1680156103f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61044f6004803603604081101561041957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a40565b60405180821515815260200191505060405180910390f35b6104c96004803603604081101561047d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b94565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105755780601f1061054a57610100808354040283529160200191610575565b820191906000526020600020905b81548152906001019060200180831161055857829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60055481565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156107455750828110155b61074e57600080fd5b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156108995782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b60006020528060005260406000206000915090505481565b600360009054906101000a900460ff1681565b6001602052816000526040600020602052806000526040600020600091509150505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b505050505081565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610a8d57600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509291505056fea26469706673582212200215417d1b93c45037db00fcbe9489d491cc2430fd5731faaa6e1b38e125f20864736f6c63430007060033",
+ "immutableReferences": {},
+ "generatedSources": [],
+ "deployedGeneratedSources": [],
+ "sourceMap": "188:2687:0:-:0;;;788:514;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;970:14;947:8;:20;956:10;947:20;;;;;;;;;;;;;;;:37;;;;1047:14;1033:11;:28;;;;1101:10;1094:4;:17;;;;;;;;;;;;:::i;:::-;;1169:13;1158:8;;:24;;;;;;;;;;;;;;;;;;1244:12;1235:6;:21;;;;;;;;;;;;:::i;:::-;;788:514;;;;188:2687;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;",
+ "deployedSourceMap": "188:2687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;678:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2387:293;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;755:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1672:545;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;274:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;702:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;323:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2223:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;729:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1308:358;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2686:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;678:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2387:293::-;2487:12;2547:6;2515:7;:19;2523:10;2515:19;;;;;;;;;;;;;;;:29;2535:8;2515:29;;;;;;;;;;;;;;;:38;;;;2589:8;2568:38;;2577:10;2568:38;;;2599:6;2568:38;;;;;;;;;;;;;;;;;;2669:4;2662:11;;2387:293;;;;:::o;755:26::-;;;;:::o;1672:545::-;1793:12;1817:18;1838:7;:14;1846:5;1838:14;;;;;;;;;;;;;;;:26;1853:10;1838:26;;;;;;;;;;;;;;;;1817:47;;1901:6;1882:8;:15;1891:5;1882:15;;;;;;;;;;;;;;;;:25;;:49;;;;;1925:6;1911:10;:20;;1882:49;1874:58;;;;;;1959:6;1942:8;:13;1951:3;1942:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;1994:6;1975:8;:15;1984:5;1975:15;;;;;;;;;;;;;;;;:25;;;;;;;;;;;258:10;2014;:24;2010:91;;;2084:6;2054:7;:14;2062:5;2054:14;;;;;;;;;;;;;;;:26;2069:10;2054:26;;;;;;;;;;;;;;;;:36;;;;;;;;;;;2010:91;2131:3;2115:28;;2124:5;2115:28;;;2136:6;2115:28;;;;;;;;;;;;;;;;;;2206:4;2199:11;;;1672:545;;;;;:::o;274:43::-;;;;;;;;;;;;;;;;;:::o;702:21::-;;;;;;;;;;;;;:::o;323:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2223:158::-;2320:15;2358:8;:16;2367:6;2358:16;;;;;;;;;;;;;;;;2351:23;;2223:158;;;:::o;729:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1308:358::-;1404:12;1464:6;1440:8;:20;1449:10;1440:20;;;;;;;;;;;;;;;;:30;;1432:39;;;;;;1505:6;1481:8;:20;1490:10;1481:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;1538:6;1521:8;:13;1530:3;1521:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;1580:3;1559:33;;1568:10;1559:33;;;1585:6;1559:33;;;;;;;;;;;;;;;;;;1655:4;1648:11;;1308:358;;;;:::o;2686:187::-;2801:17;2841:7;:15;2849:6;2841:15;;;;;;;;;;;;;;;:25;2857:8;2841:25;;;;;;;;;;;;;;;;2834:32;;2686:187;;;;:::o",
+ "source": "// SPDX-License-Identifier: MIT LICENSE\n/* Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md */\npragma solidity ^0.7.6;\n\nimport \"./IERC20.sol\";\n\ncontract ERC20 is IERC20 {\n uint256 private constant MAX_UINT256 = 2**256 - 1;\n mapping(address => uint256) public balances;\n mapping(address => mapping(address => uint256)) public allowed;\n /*\n NOTE:\n The following variables are OPTIONAL vanities. One does not have to include them.\n They allow one to customise the token contract & in no way influences the core functionality.\n Some wallets/interfaces might not even bother to look at this information.\n */\n string public name;\n uint8 public decimals;\n string public symbol;\n uint256 public totalSupply;\n\n constructor(\n uint256 _initialAmount,\n string memory _tokenName,\n uint8 _decimalUnits,\n string memory _tokenSymbol\n ) {\n balances[msg.sender] = _initialAmount; // Give the creator all initial tokens\n totalSupply = _initialAmount; // Update total supply\n name = _tokenName; // Set the name for display purposes\n decimals = _decimalUnits; // Amount of decimals for display purposes\n symbol = _tokenSymbol; // Set the symbol for display purposes\n }\n\n function transfer(address _to, uint256 _value)\n public\n override\n returns (bool success)\n {\n require(balances[msg.sender] >= _value);\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars\n return true;\n }\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n ) public override returns (bool success) {\n uint256 allowance_ = allowed[_from][msg.sender];\n require(balances[_from] >= _value && allowance_ >= _value);\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance_ < MAX_UINT256) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars\n return true;\n }\n\n function balanceOf(address _owner)\n public\n view\n override\n returns (uint256 balance)\n {\n return balances[_owner];\n }\n\n function approve(address _spender, uint256 _value)\n public\n override\n returns (bool success)\n {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars\n return true;\n }\n\n function allowance(address _owner, address _spender)\n public\n view\n override\n returns (uint256 remaining)\n {\n return allowed[_owner][_spender];\n }\n}\n",
+ "sourcePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/ERC20.sol",
+ "ast": {
+ "absolutePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/ERC20.sol",
+ "exportedSymbols": {
+ "ERC20": [
+ 234
+ ],
+ "IERC20": [
+ 303
+ ]
+ },
+ "id": 235,
+ "license": "MIT LICENSE",
+ "nodeType": "SourceUnit",
+ "nodes": [
+ {
+ "id": 1,
+ "literals": [
+ "solidity",
+ "^",
+ "0.7",
+ ".6"
+ ],
+ "nodeType": "PragmaDirective",
+ "src": "139:23:0"
+ },
+ {
+ "absolutePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "file": "./IERC20.sol",
+ "id": 2,
+ "nodeType": "ImportDirective",
+ "scope": 235,
+ "sourceUnit": 304,
+ "src": "164:22:0",
+ "symbolAliases": [],
+ "unitAlias": ""
+ },
+ {
+ "abstract": false,
+ "baseContracts": [
+ {
+ "baseName": {
+ "id": 3,
+ "name": "IERC20",
+ "nodeType": "UserDefinedTypeName",
+ "referencedDeclaration": 303,
+ "src": "206:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_contract$_IERC20_$303",
+ "typeString": "contract IERC20"
+ }
+ },
+ "id": 4,
+ "nodeType": "InheritanceSpecifier",
+ "src": "206:6:0"
+ }
+ ],
+ "contractDependencies": [
+ 303
+ ],
+ "contractKind": "contract",
+ "fullyImplemented": true,
+ "id": 234,
+ "linearizedBaseContracts": [
+ 234,
+ 303
+ ],
+ "name": "ERC20",
+ "nodeType": "ContractDefinition",
+ "nodes": [
+ {
+ "constant": true,
+ "id": 11,
+ "mutability": "constant",
+ "name": "MAX_UINT256",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "219:49:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 5,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "219:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "value": {
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9935"
+ },
+ "id": 10,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "leftExpression": {
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9936"
+ },
+ "id": 8,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "leftExpression": {
+ "hexValue": "32",
+ "id": 6,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "number",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "258:1:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_2_by_1",
+ "typeString": "int_const 2"
+ },
+ "value": "2"
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "**",
+ "rightExpression": {
+ "hexValue": "323536",
+ "id": 7,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "number",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "261:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_256_by_1",
+ "typeString": "int_const 256"
+ },
+ "value": "256"
+ },
+ "src": "258:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9936"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "-",
+ "rightExpression": {
+ "hexValue": "31",
+ "id": 9,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "number",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "267:1:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_1_by_1",
+ "typeString": "int_const 1"
+ },
+ "value": "1"
+ },
+ "src": "258:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9935"
+ }
+ },
+ "visibility": "private"
+ },
+ {
+ "constant": false,
+ "functionSelector": "27e235e3",
+ "id": 15,
+ "mutability": "mutable",
+ "name": "balances",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "274:43:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ },
+ "typeName": {
+ "id": 14,
+ "keyType": {
+ "id": 12,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "282:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "nodeType": "Mapping",
+ "src": "274:27:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ },
+ "valueType": {
+ "id": 13,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "293:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ },
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "5c658165",
+ "id": 21,
+ "mutability": "mutable",
+ "name": "allowed",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "323:62:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ },
+ "typeName": {
+ "id": 20,
+ "keyType": {
+ "id": 16,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "331:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "nodeType": "Mapping",
+ "src": "323:47:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ },
+ "valueType": {
+ "id": 19,
+ "keyType": {
+ "id": 17,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "350:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "nodeType": "Mapping",
+ "src": "342:27:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ },
+ "valueType": {
+ "id": 18,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "361:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ }
+ },
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "06fdde03",
+ "id": 23,
+ "mutability": "mutable",
+ "name": "name",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "678:18:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 22,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "678:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "313ce567",
+ "id": 25,
+ "mutability": "mutable",
+ "name": "decimals",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "702:21:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ },
+ "typeName": {
+ "id": 24,
+ "name": "uint8",
+ "nodeType": "ElementaryTypeName",
+ "src": "702:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "95d89b41",
+ "id": 27,
+ "mutability": "mutable",
+ "name": "symbol",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "729:20:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 26,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "729:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "visibility": "public"
+ },
+ {
+ "constant": false,
+ "functionSelector": "18160ddd",
+ "id": 29,
+ "mutability": "mutable",
+ "name": "totalSupply",
+ "nodeType": "VariableDeclaration",
+ "scope": 234,
+ "src": "755:26:0",
+ "stateVariable": true,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 28,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "755:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "public"
+ },
+ {
+ "body": {
+ "id": 63,
+ "nodeType": "Block",
+ "src": "937:365:0",
+ "statements": [
+ {
+ "expression": {
+ "id": 45,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "id": 40,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "947:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 43,
+ "indexExpression": {
+ "expression": {
+ "id": 41,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "956:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 42,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "956:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "947:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "id": 44,
+ "name": "_initialAmount",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 31,
+ "src": "970:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "947:37:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 46,
+ "nodeType": "ExpressionStatement",
+ "src": "947:37:0"
+ },
+ {
+ "expression": {
+ "id": 49,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "id": 47,
+ "name": "totalSupply",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 29,
+ "src": "1033:11:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "id": 48,
+ "name": "_initialAmount",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 31,
+ "src": "1047:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1033:28:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 50,
+ "nodeType": "ExpressionStatement",
+ "src": "1033:28:0"
+ },
+ {
+ "expression": {
+ "id": 53,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "id": 51,
+ "name": "name",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 23,
+ "src": "1094:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "id": 52,
+ "name": "_tokenName",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 33,
+ "src": "1101:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string memory"
+ }
+ },
+ "src": "1094:17:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "id": 54,
+ "nodeType": "ExpressionStatement",
+ "src": "1094:17:0"
+ },
+ {
+ "expression": {
+ "id": 57,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "id": 55,
+ "name": "decimals",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 25,
+ "src": "1158:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "id": 56,
+ "name": "_decimalUnits",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 35,
+ "src": "1169:13:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "src": "1158:24:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "id": 58,
+ "nodeType": "ExpressionStatement",
+ "src": "1158:24:0"
+ },
+ {
+ "expression": {
+ "id": 61,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "id": 59,
+ "name": "symbol",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 27,
+ "src": "1235:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "id": 60,
+ "name": "_tokenSymbol",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 37,
+ "src": "1244:12:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string memory"
+ }
+ },
+ "src": "1235:21:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage",
+ "typeString": "string storage ref"
+ }
+ },
+ "id": 62,
+ "nodeType": "ExpressionStatement",
+ "src": "1235:21:0"
+ }
+ ]
+ },
+ "id": 64,
+ "implemented": true,
+ "kind": "constructor",
+ "modifiers": [],
+ "name": "",
+ "nodeType": "FunctionDefinition",
+ "parameters": {
+ "id": 38,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 31,
+ "mutability": "mutable",
+ "name": "_initialAmount",
+ "nodeType": "VariableDeclaration",
+ "scope": 64,
+ "src": "809:22:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 30,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "809:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 33,
+ "mutability": "mutable",
+ "name": "_tokenName",
+ "nodeType": "VariableDeclaration",
+ "scope": 64,
+ "src": "841:24:0",
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 32,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "841:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 35,
+ "mutability": "mutable",
+ "name": "_decimalUnits",
+ "nodeType": "VariableDeclaration",
+ "scope": 64,
+ "src": "875:19:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ },
+ "typeName": {
+ "id": 34,
+ "name": "uint8",
+ "nodeType": "ElementaryTypeName",
+ "src": "875:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint8",
+ "typeString": "uint8"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 37,
+ "mutability": "mutable",
+ "name": "_tokenSymbol",
+ "nodeType": "VariableDeclaration",
+ "scope": 64,
+ "src": "904:26:0",
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_memory_ptr",
+ "typeString": "string"
+ },
+ "typeName": {
+ "id": 36,
+ "name": "string",
+ "nodeType": "ElementaryTypeName",
+ "src": "904:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_string_storage_ptr",
+ "typeString": "string"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "799:137:0"
+ },
+ "returnParameters": {
+ "id": 39,
+ "nodeType": "ParameterList",
+ "parameters": [],
+ "src": "937:0:0"
+ },
+ "scope": 234,
+ "src": "788:514:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 254
+ ],
+ "body": {
+ "id": 105,
+ "nodeType": "Block",
+ "src": "1422:244:0",
+ "statements": [
+ {
+ "expression": {
+ "arguments": [
+ {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 80,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "baseExpression": {
+ "id": 75,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1440:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 78,
+ "indexExpression": {
+ "expression": {
+ "id": 76,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "1449:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 77,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "1449:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1440:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": ">=",
+ "rightExpression": {
+ "id": 79,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1464:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1440:30:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "id": 74,
+ "name": "require",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [
+ 4294967278,
+ 4294967278
+ ],
+ "referencedDeclaration": 4294967278,
+ "src": "1432:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
+ "typeString": "function (bool) pure"
+ }
+ },
+ "id": 81,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "1432:39:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 82,
+ "nodeType": "ExpressionStatement",
+ "src": "1432:39:0"
+ },
+ {
+ "expression": {
+ "id": 88,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "id": 83,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1481:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 86,
+ "indexExpression": {
+ "expression": {
+ "id": 84,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "1490:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 85,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "1490:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1481:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "-=",
+ "rightHandSide": {
+ "id": 87,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1505:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1481:30:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 89,
+ "nodeType": "ExpressionStatement",
+ "src": "1481:30:0"
+ },
+ {
+ "expression": {
+ "id": 94,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "id": 90,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1521:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 92,
+ "indexExpression": {
+ "id": 91,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 66,
+ "src": "1530:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1521:13:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "+=",
+ "rightHandSide": {
+ "id": 93,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1538:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1521:23:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 95,
+ "nodeType": "ExpressionStatement",
+ "src": "1521:23:0"
+ },
+ {
+ "eventCall": {
+ "arguments": [
+ {
+ "expression": {
+ "id": 97,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "1568:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 98,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "1568:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ {
+ "id": 99,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 66,
+ "src": "1580:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "id": 100,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 68,
+ "src": "1585:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "id": 96,
+ "name": "Transfer",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 294,
+ "src": "1559:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
+ "typeString": "function (address,address,uint256)"
+ }
+ },
+ "id": 101,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "1559:33:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 102,
+ "nodeType": "EmitStatement",
+ "src": "1554:38:0"
+ },
+ {
+ "expression": {
+ "hexValue": "74727565",
+ "id": 103,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "bool",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "1655:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "value": "true"
+ },
+ "functionReturnParameters": 73,
+ "id": 104,
+ "nodeType": "Return",
+ "src": "1648:11:0"
+ }
+ ]
+ },
+ "functionSelector": "a9059cbb",
+ "id": 106,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transfer",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 70,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "1378:8:0"
+ },
+ "parameters": {
+ "id": 69,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 66,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "scope": 106,
+ "src": "1326:11:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 65,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1326:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 68,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 106,
+ "src": "1339:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 67,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1339:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1325:29:0"
+ },
+ "returnParameters": {
+ "id": 73,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 72,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "scope": 106,
+ "src": "1404:12:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 71,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1404:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1403:14:0"
+ },
+ "scope": 234,
+ "src": "1308:358:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 266
+ ],
+ "body": {
+ "id": 173,
+ "nodeType": "Block",
+ "src": "1807:410:0",
+ "statements": [
+ {
+ "assignments": [
+ 119
+ ],
+ "declarations": [
+ {
+ "constant": false,
+ "id": 119,
+ "mutability": "mutable",
+ "name": "allowance_",
+ "nodeType": "VariableDeclaration",
+ "scope": 173,
+ "src": "1817:18:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 118,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1817:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "id": 126,
+ "initialValue": {
+ "baseExpression": {
+ "baseExpression": {
+ "id": 120,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "1838:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 122,
+ "indexExpression": {
+ "id": 121,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "1846:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1838:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 125,
+ "indexExpression": {
+ "expression": {
+ "id": 123,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "1853:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 124,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "1853:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1838:26:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "VariableDeclarationStatement",
+ "src": "1817:47:0"
+ },
+ {
+ "expression": {
+ "arguments": [
+ {
+ "commonType": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "id": 136,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 132,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "baseExpression": {
+ "id": 128,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1882:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 130,
+ "indexExpression": {
+ "id": 129,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "1891:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "1882:15:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": ">=",
+ "rightExpression": {
+ "id": 131,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1901:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1882:25:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "&&",
+ "rightExpression": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 135,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "id": 133,
+ "name": "allowance_",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 119,
+ "src": "1911:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": ">=",
+ "rightExpression": {
+ "id": 134,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1925:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1911:20:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "src": "1882:49:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "id": 127,
+ "name": "require",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [
+ 4294967278,
+ 4294967278
+ ],
+ "referencedDeclaration": 4294967278,
+ "src": "1874:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
+ "typeString": "function (bool) pure"
+ }
+ },
+ "id": 137,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "1874:58:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 138,
+ "nodeType": "ExpressionStatement",
+ "src": "1874:58:0"
+ },
+ {
+ "expression": {
+ "id": 143,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "id": 139,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1942:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 141,
+ "indexExpression": {
+ "id": 140,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 110,
+ "src": "1951:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1942:13:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "+=",
+ "rightHandSide": {
+ "id": 142,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1959:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1942:23:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 144,
+ "nodeType": "ExpressionStatement",
+ "src": "1942:23:0"
+ },
+ {
+ "expression": {
+ "id": 149,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "id": 145,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "1975:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 147,
+ "indexExpression": {
+ "id": 146,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "1984:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "1975:15:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "-=",
+ "rightHandSide": {
+ "id": 148,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "1994:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "1975:25:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 150,
+ "nodeType": "ExpressionStatement",
+ "src": "1975:25:0"
+ },
+ {
+ "condition": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "id": 153,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftExpression": {
+ "id": 151,
+ "name": "allowance_",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 119,
+ "src": "2014:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "BinaryOperation",
+ "operator": "<",
+ "rightExpression": {
+ "id": 152,
+ "name": "MAX_UINT256",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 11,
+ "src": "2027:11:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "2014:24:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "id": 164,
+ "nodeType": "IfStatement",
+ "src": "2010:91:0",
+ "trueBody": {
+ "id": 163,
+ "nodeType": "Block",
+ "src": "2040:61:0",
+ "statements": [
+ {
+ "expression": {
+ "id": 161,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "baseExpression": {
+ "id": 154,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "2054:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 158,
+ "indexExpression": {
+ "id": 155,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "2062:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2054:14:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 159,
+ "indexExpression": {
+ "expression": {
+ "id": 156,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "2069:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 157,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "2069:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "2054:26:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "-=",
+ "rightHandSide": {
+ "id": 160,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "2084:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "2054:36:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 162,
+ "nodeType": "ExpressionStatement",
+ "src": "2054:36:0"
+ }
+ ]
+ }
+ },
+ {
+ "eventCall": {
+ "arguments": [
+ {
+ "id": 166,
+ "name": "_from",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 108,
+ "src": "2124:5:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "id": 167,
+ "name": "_to",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 110,
+ "src": "2131:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "id": 168,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 112,
+ "src": "2136:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "id": 165,
+ "name": "Transfer",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 294,
+ "src": "2115:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
+ "typeString": "function (address,address,uint256)"
+ }
+ },
+ "id": 169,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "2115:28:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 170,
+ "nodeType": "EmitStatement",
+ "src": "2110:33:0"
+ },
+ {
+ "expression": {
+ "hexValue": "74727565",
+ "id": 171,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "bool",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "2206:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "value": "true"
+ },
+ "functionReturnParameters": 117,
+ "id": 172,
+ "nodeType": "Return",
+ "src": "2199:11:0"
+ }
+ ]
+ },
+ "functionSelector": "23b872dd",
+ "id": 174,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transferFrom",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 114,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "1775:8:0"
+ },
+ "parameters": {
+ "id": 113,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 108,
+ "mutability": "mutable",
+ "name": "_from",
+ "nodeType": "VariableDeclaration",
+ "scope": 174,
+ "src": "1703:13:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 107,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1703:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 110,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "scope": 174,
+ "src": "1726:11:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 109,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1726:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 112,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 174,
+ "src": "1747:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 111,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1747:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1693:74:0"
+ },
+ "returnParameters": {
+ "id": 117,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 116,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "scope": 174,
+ "src": "1793:12:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 115,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1793:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1792:14:0"
+ },
+ "scope": 234,
+ "src": "1672:545:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 244
+ ],
+ "body": {
+ "id": 186,
+ "nodeType": "Block",
+ "src": "2341:40:0",
+ "statements": [
+ {
+ "expression": {
+ "baseExpression": {
+ "id": 182,
+ "name": "balances",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 15,
+ "src": "2358:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 184,
+ "indexExpression": {
+ "id": 183,
+ "name": "_owner",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 176,
+ "src": "2367:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2358:16:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "functionReturnParameters": 181,
+ "id": 185,
+ "nodeType": "Return",
+ "src": "2351:23:0"
+ }
+ ]
+ },
+ "functionSelector": "70a08231",
+ "id": 187,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "balanceOf",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 178,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "2294:8:0"
+ },
+ "parameters": {
+ "id": 177,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 176,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "scope": 187,
+ "src": "2242:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 175,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2242:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2241:16:0"
+ },
+ "returnParameters": {
+ "id": 181,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 180,
+ "mutability": "mutable",
+ "name": "balance",
+ "nodeType": "VariableDeclaration",
+ "scope": 187,
+ "src": "2320:15:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 179,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2320:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2319:17:0"
+ },
+ "scope": 234,
+ "src": "2223:158:0",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 276
+ ],
+ "body": {
+ "id": 215,
+ "nodeType": "Block",
+ "src": "2505:175:0",
+ "statements": [
+ {
+ "expression": {
+ "id": 204,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "leftHandSide": {
+ "baseExpression": {
+ "baseExpression": {
+ "id": 197,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "2515:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 201,
+ "indexExpression": {
+ "expression": {
+ "id": 198,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "2523:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 199,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "2523:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2515:19:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 202,
+ "indexExpression": {
+ "id": 200,
+ "name": "_spender",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 189,
+ "src": "2535:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "nodeType": "IndexAccess",
+ "src": "2515:29:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "nodeType": "Assignment",
+ "operator": "=",
+ "rightHandSide": {
+ "id": 203,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 191,
+ "src": "2547:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "src": "2515:38:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "id": 205,
+ "nodeType": "ExpressionStatement",
+ "src": "2515:38:0"
+ },
+ {
+ "eventCall": {
+ "arguments": [
+ {
+ "expression": {
+ "id": 207,
+ "name": "msg",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 4294967281,
+ "src": "2577:3:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_magic_message",
+ "typeString": "msg"
+ }
+ },
+ "id": 208,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "memberName": "sender",
+ "nodeType": "MemberAccess",
+ "src": "2577:10:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ }
+ },
+ {
+ "id": 209,
+ "name": "_spender",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 189,
+ "src": "2589:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ {
+ "id": 210,
+ "name": "_value",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 191,
+ "src": "2599:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ }
+ ],
+ "expression": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "id": 206,
+ "name": "Approval",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 302,
+ "src": "2568:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
+ "typeString": "function (address,address,uint256)"
+ }
+ },
+ "id": 211,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "kind": "functionCall",
+ "lValueRequested": false,
+ "names": [],
+ "nodeType": "FunctionCall",
+ "src": "2568:38:0",
+ "tryCall": false,
+ "typeDescriptions": {
+ "typeIdentifier": "t_tuple$__$",
+ "typeString": "tuple()"
+ }
+ },
+ "id": 212,
+ "nodeType": "EmitStatement",
+ "src": "2563:43:0"
+ },
+ {
+ "expression": {
+ "hexValue": "74727565",
+ "id": 213,
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "kind": "bool",
+ "lValueRequested": false,
+ "nodeType": "Literal",
+ "src": "2669:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "value": "true"
+ },
+ "functionReturnParameters": 196,
+ "id": 214,
+ "nodeType": "Return",
+ "src": "2662:11:0"
+ }
+ ]
+ },
+ "functionSelector": "095ea7b3",
+ "id": 216,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "approve",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 193,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "2461:8:0"
+ },
+ "parameters": {
+ "id": 192,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 189,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "scope": 216,
+ "src": "2404:16:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 188,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2404:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 191,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 216,
+ "src": "2422:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 190,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2422:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2403:34:0"
+ },
+ "returnParameters": {
+ "id": 196,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 195,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "scope": 216,
+ "src": "2487:12:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 194,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "2487:4:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2486:14:0"
+ },
+ "scope": 234,
+ "src": "2387:293:0",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ {
+ "baseFunctions": [
+ 286
+ ],
+ "body": {
+ "id": 232,
+ "nodeType": "Block",
+ "src": "2824:49:0",
+ "statements": [
+ {
+ "expression": {
+ "baseExpression": {
+ "baseExpression": {
+ "id": 226,
+ "name": "allowed",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 21,
+ "src": "2841:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
+ "typeString": "mapping(address => mapping(address => uint256))"
+ }
+ },
+ "id": 228,
+ "indexExpression": {
+ "id": 227,
+ "name": "_owner",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 218,
+ "src": "2849:6:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2841:15:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
+ "typeString": "mapping(address => uint256)"
+ }
+ },
+ "id": 230,
+ "indexExpression": {
+ "id": 229,
+ "name": "_spender",
+ "nodeType": "Identifier",
+ "overloadedDeclarations": [],
+ "referencedDeclaration": 220,
+ "src": "2857:8:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "nodeType": "IndexAccess",
+ "src": "2841:25:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "functionReturnParameters": 225,
+ "id": 231,
+ "nodeType": "Return",
+ "src": "2834:32:0"
+ }
+ ]
+ },
+ "functionSelector": "dd62ed3e",
+ "id": 233,
+ "implemented": true,
+ "kind": "function",
+ "modifiers": [],
+ "name": "allowance",
+ "nodeType": "FunctionDefinition",
+ "overrides": {
+ "id": 222,
+ "nodeType": "OverrideSpecifier",
+ "overrides": [],
+ "src": "2775:8:0"
+ },
+ "parameters": {
+ "id": 221,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 218,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "scope": 233,
+ "src": "2705:14:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 217,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2705:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 220,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "scope": 233,
+ "src": "2721:16:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 219,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2721:7:0",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2704:34:0"
+ },
+ "returnParameters": {
+ "id": 225,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 224,
+ "mutability": "mutable",
+ "name": "remaining",
+ "nodeType": "VariableDeclaration",
+ "scope": 233,
+ "src": "2801:17:0",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 223,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2801:7:0",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2800:19:0"
+ },
+ "scope": 234,
+ "src": "2686:187:0",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ }
+ ],
+ "scope": 235,
+ "src": "188:2687:0"
+ }
+ ],
+ "src": "139:2737:0"
+ },
+ "legacyAST": {
+ "attributes": {
+ "absolutePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/ERC20.sol",
+ "exportedSymbols": {
+ "ERC20": [
+ 234
+ ],
+ "IERC20": [
+ 303
+ ]
+ },
+ "license": "MIT LICENSE"
+ },
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.7",
+ ".6"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "139:23:0"
+ },
+ {
+ "attributes": {
+ "SourceUnit": 304,
+ "absolutePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "file": "./IERC20.sol",
+ "scope": 235,
+ "symbolAliases": [
+ null
+ ],
+ "unitAlias": ""
+ },
+ "id": 2,
+ "name": "ImportDirective",
+ "src": "164:22:0"
+ },
+ {
+ "attributes": {
+ "abstract": false,
+ "contractDependencies": [
+ 303
+ ],
+ "contractKind": "contract",
+ "fullyImplemented": true,
+ "linearizedBaseContracts": [
+ 234,
+ 303
+ ],
+ "name": "ERC20",
+ "scope": 235
+ },
+ "children": [
+ {
+ "attributes": {},
+ "children": [
+ {
+ "attributes": {
+ "name": "IERC20",
+ "referencedDeclaration": 303,
+ "type": "contract IERC20"
+ },
+ "id": 3,
+ "name": "UserDefinedTypeName",
+ "src": "206:6:0"
+ }
+ ],
+ "id": 4,
+ "name": "InheritanceSpecifier",
+ "src": "206:6:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "mutability": "constant",
+ "name": "MAX_UINT256",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "private"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 5,
+ "name": "ElementaryTypeName",
+ "src": "219:7:0"
+ },
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9935"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "operator": "-",
+ "type": "int_const 1157...(70 digits omitted)...9935"
+ },
+ "children": [
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
+ "typeString": "int_const 1157...(70 digits omitted)...9936"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "operator": "**",
+ "type": "int_const 1157...(70 digits omitted)...9936"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "32",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "token": "number",
+ "type": "int_const 2",
+ "value": "2"
+ },
+ "id": 6,
+ "name": "Literal",
+ "src": "258:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "323536",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "token": "number",
+ "type": "int_const 256",
+ "value": "256"
+ },
+ "id": 7,
+ "name": "Literal",
+ "src": "261:3:0"
+ }
+ ],
+ "id": 8,
+ "name": "BinaryOperation",
+ "src": "258:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "token": "number",
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 9,
+ "name": "Literal",
+ "src": "267:1:0"
+ }
+ ],
+ "id": 10,
+ "name": "BinaryOperation",
+ "src": "258:10:0"
+ }
+ ],
+ "id": 11,
+ "name": "VariableDeclaration",
+ "src": "219:49:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "27e235e3",
+ "mutability": "mutable",
+ "name": "balances",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "mapping(address => uint256)",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "type": "address"
+ },
+ "id": 12,
+ "name": "ElementaryTypeName",
+ "src": "282:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 13,
+ "name": "ElementaryTypeName",
+ "src": "293:7:0"
+ }
+ ],
+ "id": 14,
+ "name": "Mapping",
+ "src": "274:27:0"
+ }
+ ],
+ "id": 15,
+ "name": "VariableDeclaration",
+ "src": "274:43:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "5c658165",
+ "mutability": "mutable",
+ "name": "allowed",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "mapping(address => mapping(address => uint256))",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "type": "address"
+ },
+ "id": 16,
+ "name": "ElementaryTypeName",
+ "src": "331:7:0"
+ },
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "type": "address"
+ },
+ "id": 17,
+ "name": "ElementaryTypeName",
+ "src": "350:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 18,
+ "name": "ElementaryTypeName",
+ "src": "361:7:0"
+ }
+ ],
+ "id": 19,
+ "name": "Mapping",
+ "src": "342:27:0"
+ }
+ ],
+ "id": 20,
+ "name": "Mapping",
+ "src": "323:47:0"
+ }
+ ],
+ "id": 21,
+ "name": "VariableDeclaration",
+ "src": "323:62:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "06fdde03",
+ "mutability": "mutable",
+ "name": "name",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "string",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 22,
+ "name": "ElementaryTypeName",
+ "src": "678:6:0"
+ }
+ ],
+ "id": 23,
+ "name": "VariableDeclaration",
+ "src": "678:18:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "313ce567",
+ "mutability": "mutable",
+ "name": "decimals",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "uint8",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8",
+ "type": "uint8"
+ },
+ "id": 24,
+ "name": "ElementaryTypeName",
+ "src": "702:5:0"
+ }
+ ],
+ "id": 25,
+ "name": "VariableDeclaration",
+ "src": "702:21:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "95d89b41",
+ "mutability": "mutable",
+ "name": "symbol",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "string",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 26,
+ "name": "ElementaryTypeName",
+ "src": "729:6:0"
+ }
+ ],
+ "id": 27,
+ "name": "VariableDeclaration",
+ "src": "729:20:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "functionSelector": "18160ddd",
+ "mutability": "mutable",
+ "name": "totalSupply",
+ "scope": 234,
+ "stateVariable": true,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 28,
+ "name": "ElementaryTypeName",
+ "src": "755:7:0"
+ }
+ ],
+ "id": 29,
+ "name": "VariableDeclaration",
+ "src": "755:26:0"
+ },
+ {
+ "attributes": {
+ "implemented": true,
+ "isConstructor": true,
+ "kind": "constructor",
+ "modifiers": [
+ null
+ ],
+ "name": "",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_initialAmount",
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 30,
+ "name": "ElementaryTypeName",
+ "src": "809:7:0"
+ }
+ ],
+ "id": 31,
+ "name": "VariableDeclaration",
+ "src": "809:22:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_tokenName",
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "type": "string",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 32,
+ "name": "ElementaryTypeName",
+ "src": "841:6:0"
+ }
+ ],
+ "id": 33,
+ "name": "VariableDeclaration",
+ "src": "841:24:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_decimalUnits",
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint8",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8",
+ "type": "uint8"
+ },
+ "id": 34,
+ "name": "ElementaryTypeName",
+ "src": "875:5:0"
+ }
+ ],
+ "id": 35,
+ "name": "VariableDeclaration",
+ "src": "875:19:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_tokenSymbol",
+ "scope": 64,
+ "stateVariable": false,
+ "storageLocation": "memory",
+ "type": "string",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string",
+ "type": "string"
+ },
+ "id": 36,
+ "name": "ElementaryTypeName",
+ "src": "904:6:0"
+ }
+ ],
+ "id": 37,
+ "name": "VariableDeclaration",
+ "src": "904:26:0"
+ }
+ ],
+ "id": 38,
+ "name": "ParameterList",
+ "src": "799:137:0"
+ },
+ {
+ "attributes": {
+ "parameters": [
+ null
+ ]
+ },
+ "children": [],
+ "id": 39,
+ "name": "ParameterList",
+ "src": "937:0:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 40,
+ "name": "Identifier",
+ "src": "947:8:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 41,
+ "name": "Identifier",
+ "src": "956:3:0"
+ }
+ ],
+ "id": 42,
+ "name": "MemberAccess",
+ "src": "956:10:0"
+ }
+ ],
+ "id": 43,
+ "name": "IndexAccess",
+ "src": "947:20:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 31,
+ "type": "uint256",
+ "value": "_initialAmount"
+ },
+ "id": 44,
+ "name": "Identifier",
+ "src": "970:14:0"
+ }
+ ],
+ "id": 45,
+ "name": "Assignment",
+ "src": "947:37:0"
+ }
+ ],
+ "id": 46,
+ "name": "ExpressionStatement",
+ "src": "947:37:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 29,
+ "type": "uint256",
+ "value": "totalSupply"
+ },
+ "id": 47,
+ "name": "Identifier",
+ "src": "1033:11:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 31,
+ "type": "uint256",
+ "value": "_initialAmount"
+ },
+ "id": 48,
+ "name": "Identifier",
+ "src": "1047:14:0"
+ }
+ ],
+ "id": 49,
+ "name": "Assignment",
+ "src": "1033:28:0"
+ }
+ ],
+ "id": 50,
+ "name": "ExpressionStatement",
+ "src": "1033:28:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "string storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 23,
+ "type": "string storage ref",
+ "value": "name"
+ },
+ "id": 51,
+ "name": "Identifier",
+ "src": "1094:4:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 33,
+ "type": "string memory",
+ "value": "_tokenName"
+ },
+ "id": 52,
+ "name": "Identifier",
+ "src": "1101:10:0"
+ }
+ ],
+ "id": 53,
+ "name": "Assignment",
+ "src": "1094:17:0"
+ }
+ ],
+ "id": 54,
+ "name": "ExpressionStatement",
+ "src": "1094:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint8"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 25,
+ "type": "uint8",
+ "value": "decimals"
+ },
+ "id": 55,
+ "name": "Identifier",
+ "src": "1158:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 35,
+ "type": "uint8",
+ "value": "_decimalUnits"
+ },
+ "id": 56,
+ "name": "Identifier",
+ "src": "1169:13:0"
+ }
+ ],
+ "id": 57,
+ "name": "Assignment",
+ "src": "1158:24:0"
+ }
+ ],
+ "id": 58,
+ "name": "ExpressionStatement",
+ "src": "1158:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "string storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 27,
+ "type": "string storage ref",
+ "value": "symbol"
+ },
+ "id": 59,
+ "name": "Identifier",
+ "src": "1235:6:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 37,
+ "type": "string memory",
+ "value": "_tokenSymbol"
+ },
+ "id": 60,
+ "name": "Identifier",
+ "src": "1244:12:0"
+ }
+ ],
+ "id": 61,
+ "name": "Assignment",
+ "src": "1235:21:0"
+ }
+ ],
+ "id": 62,
+ "name": "ExpressionStatement",
+ "src": "1235:21:0"
+ }
+ ],
+ "id": 63,
+ "name": "Block",
+ "src": "937:365:0"
+ }
+ ],
+ "id": 64,
+ "name": "FunctionDefinition",
+ "src": "788:514:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 254
+ ],
+ "functionSelector": "a9059cbb",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transfer",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 70,
+ "name": "OverrideSpecifier",
+ "src": "1378:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "scope": 106,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 65,
+ "name": "ElementaryTypeName",
+ "src": "1326:7:0"
+ }
+ ],
+ "id": 66,
+ "name": "VariableDeclaration",
+ "src": "1326:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 106,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 67,
+ "name": "ElementaryTypeName",
+ "src": "1339:7:0"
+ }
+ ],
+ "id": 68,
+ "name": "VariableDeclaration",
+ "src": "1339:14:0"
+ }
+ ],
+ "id": 69,
+ "name": "ParameterList",
+ "src": "1325:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "scope": 106,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 71,
+ "name": "ElementaryTypeName",
+ "src": "1404:4:0"
+ }
+ ],
+ "id": 72,
+ "name": "VariableDeclaration",
+ "src": "1404:12:0"
+ }
+ ],
+ "id": 73,
+ "name": "ParameterList",
+ "src": "1403:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "overloadedDeclarations": [
+ 4294967278,
+ 4294967278
+ ],
+ "referencedDeclaration": 4294967278,
+ "type": "function (bool) pure",
+ "value": "require"
+ },
+ "id": 74,
+ "name": "Identifier",
+ "src": "1432:7:0"
+ },
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 75,
+ "name": "Identifier",
+ "src": "1440:8:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "1449:3:0"
+ }
+ ],
+ "id": 77,
+ "name": "MemberAccess",
+ "src": "1449:10:0"
+ }
+ ],
+ "id": 78,
+ "name": "IndexAccess",
+ "src": "1440:20:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 79,
+ "name": "Identifier",
+ "src": "1464:6:0"
+ }
+ ],
+ "id": 80,
+ "name": "BinaryOperation",
+ "src": "1440:30:0"
+ }
+ ],
+ "id": 81,
+ "name": "FunctionCall",
+ "src": "1432:39:0"
+ }
+ ],
+ "id": 82,
+ "name": "ExpressionStatement",
+ "src": "1432:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 83,
+ "name": "Identifier",
+ "src": "1481:8:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 84,
+ "name": "Identifier",
+ "src": "1490:3:0"
+ }
+ ],
+ "id": 85,
+ "name": "MemberAccess",
+ "src": "1490:10:0"
+ }
+ ],
+ "id": 86,
+ "name": "IndexAccess",
+ "src": "1481:20:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 87,
+ "name": "Identifier",
+ "src": "1505:6:0"
+ }
+ ],
+ "id": 88,
+ "name": "Assignment",
+ "src": "1481:30:0"
+ }
+ ],
+ "id": 89,
+ "name": "ExpressionStatement",
+ "src": "1481:30:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 90,
+ "name": "Identifier",
+ "src": "1521:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 66,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 91,
+ "name": "Identifier",
+ "src": "1530:3:0"
+ }
+ ],
+ "id": 92,
+ "name": "IndexAccess",
+ "src": "1521:13:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 93,
+ "name": "Identifier",
+ "src": "1538:6:0"
+ }
+ ],
+ "id": 94,
+ "name": "Assignment",
+ "src": "1521:23:0"
+ }
+ ],
+ "id": 95,
+ "name": "ExpressionStatement",
+ "src": "1521:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 294,
+ "type": "function (address,address,uint256)",
+ "value": "Transfer"
+ },
+ "id": 96,
+ "name": "Identifier",
+ "src": "1559:8:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 97,
+ "name": "Identifier",
+ "src": "1568:3:0"
+ }
+ ],
+ "id": 98,
+ "name": "MemberAccess",
+ "src": "1568:10:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 66,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 99,
+ "name": "Identifier",
+ "src": "1580:3:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 68,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 100,
+ "name": "Identifier",
+ "src": "1585:6:0"
+ }
+ ],
+ "id": 101,
+ "name": "FunctionCall",
+ "src": "1559:33:0"
+ }
+ ],
+ "id": 102,
+ "name": "EmitStatement",
+ "src": "1554:38:0"
+ },
+ {
+ "attributes": {
+ "functionReturnParameters": 73
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "token": "bool",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 103,
+ "name": "Literal",
+ "src": "1655:4:0"
+ }
+ ],
+ "id": 104,
+ "name": "Return",
+ "src": "1648:11:0"
+ }
+ ],
+ "id": 105,
+ "name": "Block",
+ "src": "1422:244:0"
+ }
+ ],
+ "id": 106,
+ "name": "FunctionDefinition",
+ "src": "1308:358:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 266
+ ],
+ "functionSelector": "23b872dd",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transferFrom",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 114,
+ "name": "OverrideSpecifier",
+ "src": "1775:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_from",
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 107,
+ "name": "ElementaryTypeName",
+ "src": "1703:7:0"
+ }
+ ],
+ "id": 108,
+ "name": "VariableDeclaration",
+ "src": "1703:13:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 109,
+ "name": "ElementaryTypeName",
+ "src": "1726:7:0"
+ }
+ ],
+ "id": 110,
+ "name": "VariableDeclaration",
+ "src": "1726:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 111,
+ "name": "ElementaryTypeName",
+ "src": "1747:7:0"
+ }
+ ],
+ "id": 112,
+ "name": "VariableDeclaration",
+ "src": "1747:14:0"
+ }
+ ],
+ "id": 113,
+ "name": "ParameterList",
+ "src": "1693:74:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "scope": 174,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 115,
+ "name": "ElementaryTypeName",
+ "src": "1793:4:0"
+ }
+ ],
+ "id": 116,
+ "name": "VariableDeclaration",
+ "src": "1793:12:0"
+ }
+ ],
+ "id": 117,
+ "name": "ParameterList",
+ "src": "1792:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "assignments": [
+ 119
+ ]
+ },
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "allowance_",
+ "scope": 173,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 118,
+ "name": "ElementaryTypeName",
+ "src": "1817:7:0"
+ }
+ ],
+ "id": 119,
+ "name": "VariableDeclaration",
+ "src": "1817:18:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 120,
+ "name": "Identifier",
+ "src": "1838:7:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 121,
+ "name": "Identifier",
+ "src": "1846:5:0"
+ }
+ ],
+ "id": 122,
+ "name": "IndexAccess",
+ "src": "1838:14:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 123,
+ "name": "Identifier",
+ "src": "1853:3:0"
+ }
+ ],
+ "id": 124,
+ "name": "MemberAccess",
+ "src": "1853:10:0"
+ }
+ ],
+ "id": 125,
+ "name": "IndexAccess",
+ "src": "1838:26:0"
+ }
+ ],
+ "id": 126,
+ "name": "VariableDeclarationStatement",
+ "src": "1817:47:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ ],
+ "overloadedDeclarations": [
+ 4294967278,
+ 4294967278
+ ],
+ "referencedDeclaration": 4294967278,
+ "type": "function (bool) pure",
+ "value": "require"
+ },
+ "id": 127,
+ "name": "Identifier",
+ "src": "1874:7:0"
+ },
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 128,
+ "name": "Identifier",
+ "src": "1882:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 129,
+ "name": "Identifier",
+ "src": "1891:5:0"
+ }
+ ],
+ "id": 130,
+ "name": "IndexAccess",
+ "src": "1882:15:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 131,
+ "name": "Identifier",
+ "src": "1901:6:0"
+ }
+ ],
+ "id": 132,
+ "name": "BinaryOperation",
+ "src": "1882:25:0"
+ },
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 119,
+ "type": "uint256",
+ "value": "allowance_"
+ },
+ "id": 133,
+ "name": "Identifier",
+ "src": "1911:10:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 134,
+ "name": "Identifier",
+ "src": "1925:6:0"
+ }
+ ],
+ "id": 135,
+ "name": "BinaryOperation",
+ "src": "1911:20:0"
+ }
+ ],
+ "id": 136,
+ "name": "BinaryOperation",
+ "src": "1882:49:0"
+ }
+ ],
+ "id": 137,
+ "name": "FunctionCall",
+ "src": "1874:58:0"
+ }
+ ],
+ "id": 138,
+ "name": "ExpressionStatement",
+ "src": "1874:58:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 139,
+ "name": "Identifier",
+ "src": "1942:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 110,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 140,
+ "name": "Identifier",
+ "src": "1951:3:0"
+ }
+ ],
+ "id": 141,
+ "name": "IndexAccess",
+ "src": "1942:13:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 142,
+ "name": "Identifier",
+ "src": "1959:6:0"
+ }
+ ],
+ "id": 143,
+ "name": "Assignment",
+ "src": "1942:23:0"
+ }
+ ],
+ "id": 144,
+ "name": "ExpressionStatement",
+ "src": "1942:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 145,
+ "name": "Identifier",
+ "src": "1975:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "1984:5:0"
+ }
+ ],
+ "id": 147,
+ "name": "IndexAccess",
+ "src": "1975:15:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 148,
+ "name": "Identifier",
+ "src": "1994:6:0"
+ }
+ ],
+ "id": 149,
+ "name": "Assignment",
+ "src": "1975:25:0"
+ }
+ ],
+ "id": 150,
+ "name": "ExpressionStatement",
+ "src": "1975:25:0"
+ },
+ {
+ "attributes": {},
+ "children": [
+ {
+ "attributes": {
+ "commonType": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 119,
+ "type": "uint256",
+ "value": "allowance_"
+ },
+ "id": 151,
+ "name": "Identifier",
+ "src": "2014:10:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 11,
+ "type": "uint256",
+ "value": "MAX_UINT256"
+ },
+ "id": 152,
+ "name": "Identifier",
+ "src": "2027:11:0"
+ }
+ ],
+ "id": 153,
+ "name": "BinaryOperation",
+ "src": "2014:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 154,
+ "name": "Identifier",
+ "src": "2054:7:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 155,
+ "name": "Identifier",
+ "src": "2062:5:0"
+ }
+ ],
+ "id": 158,
+ "name": "IndexAccess",
+ "src": "2054:14:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "2069:3:0"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "2069:10:0"
+ }
+ ],
+ "id": 159,
+ "name": "IndexAccess",
+ "src": "2054:26:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 160,
+ "name": "Identifier",
+ "src": "2084:6:0"
+ }
+ ],
+ "id": 161,
+ "name": "Assignment",
+ "src": "2054:36:0"
+ }
+ ],
+ "id": 162,
+ "name": "ExpressionStatement",
+ "src": "2054:36:0"
+ }
+ ],
+ "id": 163,
+ "name": "Block",
+ "src": "2040:61:0"
+ }
+ ],
+ "id": 164,
+ "name": "IfStatement",
+ "src": "2010:91:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 294,
+ "type": "function (address,address,uint256)",
+ "value": "Transfer"
+ },
+ "id": 165,
+ "name": "Identifier",
+ "src": "2115:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 108,
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 166,
+ "name": "Identifier",
+ "src": "2124:5:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 110,
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 167,
+ "name": "Identifier",
+ "src": "2131:3:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 112,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 168,
+ "name": "Identifier",
+ "src": "2136:6:0"
+ }
+ ],
+ "id": 169,
+ "name": "FunctionCall",
+ "src": "2115:28:0"
+ }
+ ],
+ "id": 170,
+ "name": "EmitStatement",
+ "src": "2110:33:0"
+ },
+ {
+ "attributes": {
+ "functionReturnParameters": 117
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "token": "bool",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 171,
+ "name": "Literal",
+ "src": "2206:4:0"
+ }
+ ],
+ "id": 172,
+ "name": "Return",
+ "src": "2199:11:0"
+ }
+ ],
+ "id": 173,
+ "name": "Block",
+ "src": "1807:410:0"
+ }
+ ],
+ "id": 174,
+ "name": "FunctionDefinition",
+ "src": "1672:545:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 244
+ ],
+ "functionSelector": "70a08231",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "balanceOf",
+ "scope": 234,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 178,
+ "name": "OverrideSpecifier",
+ "src": "2294:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "scope": 187,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 175,
+ "name": "ElementaryTypeName",
+ "src": "2242:7:0"
+ }
+ ],
+ "id": 176,
+ "name": "VariableDeclaration",
+ "src": "2242:14:0"
+ }
+ ],
+ "id": 177,
+ "name": "ParameterList",
+ "src": "2241:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "balance",
+ "scope": 187,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 179,
+ "name": "ElementaryTypeName",
+ "src": "2320:7:0"
+ }
+ ],
+ "id": 180,
+ "name": "VariableDeclaration",
+ "src": "2320:15:0"
+ }
+ ],
+ "id": 181,
+ "name": "ParameterList",
+ "src": "2319:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "functionReturnParameters": 181
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 15,
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 182,
+ "name": "Identifier",
+ "src": "2358:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 176,
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 183,
+ "name": "Identifier",
+ "src": "2367:6:0"
+ }
+ ],
+ "id": 184,
+ "name": "IndexAccess",
+ "src": "2358:16:0"
+ }
+ ],
+ "id": 185,
+ "name": "Return",
+ "src": "2351:23:0"
+ }
+ ],
+ "id": 186,
+ "name": "Block",
+ "src": "2341:40:0"
+ }
+ ],
+ "id": 187,
+ "name": "FunctionDefinition",
+ "src": "2223:158:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 276
+ ],
+ "functionSelector": "095ea7b3",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "approve",
+ "scope": 234,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 193,
+ "name": "OverrideSpecifier",
+ "src": "2461:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "scope": 216,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 188,
+ "name": "ElementaryTypeName",
+ "src": "2404:7:0"
+ }
+ ],
+ "id": 189,
+ "name": "VariableDeclaration",
+ "src": "2404:16:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 216,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 190,
+ "name": "ElementaryTypeName",
+ "src": "2422:7:0"
+ }
+ ],
+ "id": 191,
+ "name": "VariableDeclaration",
+ "src": "2422:14:0"
+ }
+ ],
+ "id": 192,
+ "name": "ParameterList",
+ "src": "2403:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "scope": 216,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 194,
+ "name": "ElementaryTypeName",
+ "src": "2487:4:0"
+ }
+ ],
+ "id": 195,
+ "name": "VariableDeclaration",
+ "src": "2487:12:0"
+ }
+ ],
+ "id": 196,
+ "name": "ParameterList",
+ "src": "2486:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": true,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 197,
+ "name": "Identifier",
+ "src": "2515:7:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 198,
+ "name": "Identifier",
+ "src": "2523:3:0"
+ }
+ ],
+ "id": 199,
+ "name": "MemberAccess",
+ "src": "2523:10:0"
+ }
+ ],
+ "id": 201,
+ "name": "IndexAccess",
+ "src": "2515:19:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 189,
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 200,
+ "name": "Identifier",
+ "src": "2535:8:0"
+ }
+ ],
+ "id": 202,
+ "name": "IndexAccess",
+ "src": "2515:29:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 191,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 203,
+ "name": "Identifier",
+ "src": "2547:6:0"
+ }
+ ],
+ "id": 204,
+ "name": "Assignment",
+ "src": "2515:38:0"
+ }
+ ],
+ "id": 205,
+ "name": "ExpressionStatement",
+ "src": "2515:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "isStructConstructorCall": false,
+ "lValueRequested": false,
+ "names": [
+ null
+ ],
+ "tryCall": false,
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "argumentTypes": [
+ {
+ "typeIdentifier": "t_address_payable",
+ "typeString": "address payable"
+ },
+ {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ ],
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 302,
+ "type": "function (address,address,uint256)",
+ "value": "Approval"
+ },
+ "id": 206,
+ "name": "Identifier",
+ "src": "2568:8:0"
+ },
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": false,
+ "lValueRequested": false,
+ "member_name": "sender",
+ "type": "address payable"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 4294967281,
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 207,
+ "name": "Identifier",
+ "src": "2577:3:0"
+ }
+ ],
+ "id": 208,
+ "name": "MemberAccess",
+ "src": "2577:10:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 189,
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 209,
+ "name": "Identifier",
+ "src": "2589:8:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 191,
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 210,
+ "name": "Identifier",
+ "src": "2599:6:0"
+ }
+ ],
+ "id": 211,
+ "name": "FunctionCall",
+ "src": "2568:38:0"
+ }
+ ],
+ "id": 212,
+ "name": "EmitStatement",
+ "src": "2563:43:0"
+ },
+ {
+ "attributes": {
+ "functionReturnParameters": 196
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "isConstant": false,
+ "isLValue": false,
+ "isPure": true,
+ "lValueRequested": false,
+ "token": "bool",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 213,
+ "name": "Literal",
+ "src": "2669:4:0"
+ }
+ ],
+ "id": 214,
+ "name": "Return",
+ "src": "2662:11:0"
+ }
+ ],
+ "id": 215,
+ "name": "Block",
+ "src": "2505:175:0"
+ }
+ ],
+ "id": 216,
+ "name": "FunctionDefinition",
+ "src": "2387:293:0"
+ },
+ {
+ "attributes": {
+ "baseFunctions": [
+ 286
+ ],
+ "functionSelector": "dd62ed3e",
+ "implemented": true,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "allowance",
+ "scope": 234,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overrides": [
+ null
+ ]
+ },
+ "id": 222,
+ "name": "OverrideSpecifier",
+ "src": "2775:8:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "scope": 233,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 217,
+ "name": "ElementaryTypeName",
+ "src": "2705:7:0"
+ }
+ ],
+ "id": 218,
+ "name": "VariableDeclaration",
+ "src": "2705:14:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "scope": 233,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 219,
+ "name": "ElementaryTypeName",
+ "src": "2721:7:0"
+ }
+ ],
+ "id": 220,
+ "name": "VariableDeclaration",
+ "src": "2721:16:0"
+ }
+ ],
+ "id": 221,
+ "name": "ParameterList",
+ "src": "2704:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "remaining",
+ "scope": 233,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 223,
+ "name": "ElementaryTypeName",
+ "src": "2801:7:0"
+ }
+ ],
+ "id": 224,
+ "name": "VariableDeclaration",
+ "src": "2801:17:0"
+ }
+ ],
+ "id": 225,
+ "name": "ParameterList",
+ "src": "2800:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "functionReturnParameters": 225
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "isConstant": false,
+ "isLValue": true,
+ "isPure": false,
+ "lValueRequested": false,
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 21,
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 226,
+ "name": "Identifier",
+ "src": "2841:7:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 218,
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "2849:6:0"
+ }
+ ],
+ "id": 228,
+ "name": "IndexAccess",
+ "src": "2841:15:0"
+ },
+ {
+ "attributes": {
+ "overloadedDeclarations": [
+ null
+ ],
+ "referencedDeclaration": 220,
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 229,
+ "name": "Identifier",
+ "src": "2857:8:0"
+ }
+ ],
+ "id": 230,
+ "name": "IndexAccess",
+ "src": "2841:25:0"
+ }
+ ],
+ "id": 231,
+ "name": "Return",
+ "src": "2834:32:0"
+ }
+ ],
+ "id": 232,
+ "name": "Block",
+ "src": "2824:49:0"
+ }
+ ],
+ "id": 233,
+ "name": "FunctionDefinition",
+ "src": "2686:187:0"
+ }
+ ],
+ "id": 234,
+ "name": "ContractDefinition",
+ "src": "188:2687:0"
+ }
+ ],
+ "id": 235,
+ "name": "SourceUnit",
+ "src": "139:2737:0"
+ },
+ "compiler": {
+ "name": "solc",
+ "version": "0.7.6+commit.7338295f.Emscripten.clang"
+ },
+ "networks": {
+ "31337": {
+ "events": {},
+ "links": {},
+ "address": "0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf",
+ "transactionHash": "0xda6a315855cb9d175ddfcf73a0ed760fb36ecda71fab8c63e6624aa04362b633"
+ }
+ },
+ "schemaVersion": "3.4.1",
+ "updatedAt": "2021-06-23T19:29:30.741Z",
+ "networkType": "ethereum",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "The address of the account owning tokens",
+ "_spender": "The address of the account able to transfer the tokens"
+ },
+ "returns": {
+ "remaining": "Amount of remaining tokens allowed to spent"
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_spender": "The address of the account able to transfer the tokens",
+ "_value": "The amount of tokens to be approved for transfer"
+ },
+ "returns": {
+ "success": "Whether the approval was successful or not"
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "The address from which the balance will be retrieved"
+ },
+ "returns": {
+ "balance": "The balance"
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_from": "The address of the sender",
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ }
+ },
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "approve(address,uint256)": {
+ "notice": "`msg.sender` approves `_spender` to spend `_value` tokens"
+ },
+ "transfer(address,uint256)": {
+ "notice": "send `_value` token to `_to` from `msg.sender`"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "send `_value` token to `_to` from `_from` on the condition it is approved by `_from`"
+ }
+ },
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/truffle/build/IERC20.json b/omgx_examples/truffle/build/IERC20.json
new file mode 100644
index 000000000000..61159f88be4e
--- /dev/null
+++ b/omgx_examples/truffle/build/IERC20.json
@@ -0,0 +1,1927 @@
+{
+ "contractName": "IERC20",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "remaining",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"_owner\":\"The address of the account owning tokens\",\"_spender\":\"The address of the account able to transfer the tokens\"},\"returns\":{\"remaining\":\"Amount of remaining tokens allowed to spent\"}},\"approve(address,uint256)\":{\"params\":{\"_spender\":\"The address of the account able to transfer the tokens\",\"_value\":\"The amount of tokens to be approved for transfer\"},\"returns\":{\"success\":\"Whether the approval was successful or not\"}},\"balanceOf(address)\":{\"params\":{\"_owner\":\"The address from which the balance will be retrieved\"},\"returns\":{\"balance\":\"The balance\"}},\"transfer(address,uint256)\":{\"params\":{\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"_from\":\"The address of the sender\",\"_to\":\"The address of the recipient\",\"_value\":\"The amount of token to be transferred\"},\"returns\":{\"success\":\"Whether the transfer was successful or not\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"`msg.sender` approves `_spender` to spend `_value` tokens\"},\"transfer(address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `msg.sender`\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol\":{\"keccak256\":\"0x8ef504530876907bd4a3726db7420664851e938a2a9dd32c89a16bd58305774d\",\"license\":\"MIT LICENSE\",\"urls\":[\"bzz-raw://3715c7af8b33b29f7794ea7246c17ce7345329288a70b3cbded6231bef76a3a1\",\"dweb:/ipfs/QmbbWeGZHMvAyxro9sSzJH6aSfEJ4eMarnHG9oxb38Yz5v\"]}},\"version\":1}",
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "immutableReferences": {},
+ "generatedSources": [],
+ "deployedGeneratedSources": [],
+ "sourceMap": "",
+ "deployedSourceMap": "",
+ "source": "// SPDX-License-Identifier: MIT LICENSE\n// Abstract contract for the full ERC20 Token standard\n// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\npragma solidity ^0.7.6;\n\ninterface IERC20 {\n /// @param _owner The address from which the balance will be retrieved\n /// @return balance The balance\n function balanceOf(address _owner) external view returns (uint256 balance);\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n external\n returns (bool success);\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return success Whether the transfer was successful or not\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n ) external returns (bool success);\n\n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of tokens to be approved for transfer\n /// @return success Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n external\n returns (bool success);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return remaining Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256 remaining);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
+ "sourcePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "ast": {
+ "absolutePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "exportedSymbols": {
+ "IERC20": [
+ 303
+ ]
+ },
+ "id": 304,
+ "license": "MIT LICENSE",
+ "nodeType": "SourceUnit",
+ "nodes": [
+ {
+ "id": 236,
+ "literals": [
+ "solidity",
+ "^",
+ "0.7",
+ ".6"
+ ],
+ "nodeType": "PragmaDirective",
+ "src": "158:23:1"
+ },
+ {
+ "abstract": false,
+ "baseContracts": [],
+ "contractDependencies": [],
+ "contractKind": "interface",
+ "fullyImplemented": false,
+ "id": 303,
+ "linearizedBaseContracts": [
+ 303
+ ],
+ "name": "IERC20",
+ "nodeType": "ContractDefinition",
+ "nodes": [
+ {
+ "documentation": {
+ "id": 237,
+ "nodeType": "StructuredDocumentation",
+ "src": "206:106:1",
+ "text": "@param _owner The address from which the balance will be retrieved\n @return balance The balance"
+ },
+ "functionSelector": "70a08231",
+ "id": 244,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "balanceOf",
+ "nodeType": "FunctionDefinition",
+ "parameters": {
+ "id": 240,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 239,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "scope": 244,
+ "src": "336:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 238,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "336:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "335:16:1"
+ },
+ "returnParameters": {
+ "id": 243,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 242,
+ "mutability": "mutable",
+ "name": "balance",
+ "nodeType": "VariableDeclaration",
+ "scope": 244,
+ "src": "375:15:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 241,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "375:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "374:17:1"
+ },
+ "scope": 303,
+ "src": "317:75:1",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "documentation": {
+ "id": 245,
+ "nodeType": "StructuredDocumentation",
+ "src": "398:233:1",
+ "text": "@notice send `_value` token to `_to` from `msg.sender`\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "functionSelector": "a9059cbb",
+ "id": 254,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transfer",
+ "nodeType": "FunctionDefinition",
+ "parameters": {
+ "id": 250,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 247,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "scope": 254,
+ "src": "654:11:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 246,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "654:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 249,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 254,
+ "src": "667:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 248,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "667:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "653:29:1"
+ },
+ "returnParameters": {
+ "id": 253,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 252,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "scope": 254,
+ "src": "717:12:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 251,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "717:4:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "716:14:1"
+ },
+ "scope": 303,
+ "src": "636:95:1",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "documentation": {
+ "id": 255,
+ "nodeType": "StructuredDocumentation",
+ "src": "737:318:1",
+ "text": "@notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n @param _from The address of the sender\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "functionSelector": "23b872dd",
+ "id": 266,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "transferFrom",
+ "nodeType": "FunctionDefinition",
+ "parameters": {
+ "id": 262,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 257,
+ "mutability": "mutable",
+ "name": "_from",
+ "nodeType": "VariableDeclaration",
+ "scope": 266,
+ "src": "1091:13:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 256,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1091:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 259,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "scope": 266,
+ "src": "1114:11:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 258,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1114:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 261,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 266,
+ "src": "1135:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 260,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1135:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1081:74:1"
+ },
+ "returnParameters": {
+ "id": 265,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 264,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "scope": 266,
+ "src": "1174:12:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 263,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1174:4:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1173:14:1"
+ },
+ "scope": 303,
+ "src": "1060:128:1",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "documentation": {
+ "id": 267,
+ "nodeType": "StructuredDocumentation",
+ "src": "1194:286:1",
+ "text": "@notice `msg.sender` approves `_spender` to spend `_value` tokens\n @param _spender The address of the account able to transfer the tokens\n @param _value The amount of tokens to be approved for transfer\n @return success Whether the approval was successful or not"
+ },
+ "functionSelector": "095ea7b3",
+ "id": 276,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "approve",
+ "nodeType": "FunctionDefinition",
+ "parameters": {
+ "id": 272,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 269,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "scope": 276,
+ "src": "1502:16:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 268,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1502:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 271,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 276,
+ "src": "1520:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 270,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1520:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1501:34:1"
+ },
+ "returnParameters": {
+ "id": 275,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 274,
+ "mutability": "mutable",
+ "name": "success",
+ "nodeType": "VariableDeclaration",
+ "scope": 276,
+ "src": "1570:12:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ },
+ "typeName": {
+ "id": 273,
+ "name": "bool",
+ "nodeType": "ElementaryTypeName",
+ "src": "1570:4:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_bool",
+ "typeString": "bool"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1569:14:1"
+ },
+ "scope": 303,
+ "src": "1485:99:1",
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "documentation": {
+ "id": 277,
+ "nodeType": "StructuredDocumentation",
+ "src": "1590:207:1",
+ "text": "@param _owner The address of the account owning tokens\n @param _spender The address of the account able to transfer the tokens\n @return remaining Amount of remaining tokens allowed to spent"
+ },
+ "functionSelector": "dd62ed3e",
+ "id": 286,
+ "implemented": false,
+ "kind": "function",
+ "modifiers": [],
+ "name": "allowance",
+ "nodeType": "FunctionDefinition",
+ "parameters": {
+ "id": 282,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 279,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "scope": 286,
+ "src": "1821:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 278,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1821:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 281,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "scope": 286,
+ "src": "1837:16:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 280,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "1837:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1820:34:1"
+ },
+ "returnParameters": {
+ "id": 285,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 284,
+ "mutability": "mutable",
+ "name": "remaining",
+ "nodeType": "VariableDeclaration",
+ "scope": 286,
+ "src": "1902:17:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 283,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "1902:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "1901:19:1"
+ },
+ "scope": 303,
+ "src": "1802:119:1",
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ {
+ "anonymous": false,
+ "id": 294,
+ "name": "Transfer",
+ "nodeType": "EventDefinition",
+ "parameters": {
+ "id": 293,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 288,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_from",
+ "nodeType": "VariableDeclaration",
+ "scope": 294,
+ "src": "2001:21:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 287,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2001:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 290,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_to",
+ "nodeType": "VariableDeclaration",
+ "scope": 294,
+ "src": "2024:19:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 289,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2024:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 292,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 294,
+ "src": "2045:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 291,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2045:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2000:60:1"
+ },
+ "src": "1986:75:1"
+ },
+ {
+ "anonymous": false,
+ "id": 302,
+ "name": "Approval",
+ "nodeType": "EventDefinition",
+ "parameters": {
+ "id": 301,
+ "nodeType": "ParameterList",
+ "parameters": [
+ {
+ "constant": false,
+ "id": 296,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_owner",
+ "nodeType": "VariableDeclaration",
+ "scope": 302,
+ "src": "2090:22:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 295,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2090:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 298,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_spender",
+ "nodeType": "VariableDeclaration",
+ "scope": 302,
+ "src": "2122:24:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ },
+ "typeName": {
+ "id": 297,
+ "name": "address",
+ "nodeType": "ElementaryTypeName",
+ "src": "2122:7:1",
+ "stateMutability": "nonpayable",
+ "typeDescriptions": {
+ "typeIdentifier": "t_address",
+ "typeString": "address"
+ }
+ },
+ "visibility": "internal"
+ },
+ {
+ "constant": false,
+ "id": 300,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "nodeType": "VariableDeclaration",
+ "scope": 302,
+ "src": "2156:14:1",
+ "stateVariable": false,
+ "storageLocation": "default",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ },
+ "typeName": {
+ "id": 299,
+ "name": "uint256",
+ "nodeType": "ElementaryTypeName",
+ "src": "2156:7:1",
+ "typeDescriptions": {
+ "typeIdentifier": "t_uint256",
+ "typeString": "uint256"
+ }
+ },
+ "visibility": "internal"
+ }
+ ],
+ "src": "2080:96:1"
+ },
+ "src": "2066:111:1"
+ }
+ ],
+ "scope": 304,
+ "src": "183:1996:1"
+ }
+ ],
+ "src": "158:2022:1"
+ },
+ "legacyAST": {
+ "attributes": {
+ "absolutePath": "/Users/jesusmeza/Developer/omgx/optimism/omgx_examples/truffle/contracts/IERC20.sol",
+ "exportedSymbols": {
+ "IERC20": [
+ 303
+ ]
+ },
+ "license": "MIT LICENSE"
+ },
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.7",
+ ".6"
+ ]
+ },
+ "id": 236,
+ "name": "PragmaDirective",
+ "src": "158:23:1"
+ },
+ {
+ "attributes": {
+ "abstract": false,
+ "baseContracts": [
+ null
+ ],
+ "contractDependencies": [
+ null
+ ],
+ "contractKind": "interface",
+ "fullyImplemented": false,
+ "linearizedBaseContracts": [
+ 303
+ ],
+ "name": "IERC20",
+ "scope": 304
+ },
+ "children": [
+ {
+ "attributes": {
+ "functionSelector": "70a08231",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "balanceOf",
+ "scope": 303,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@param _owner The address from which the balance will be retrieved\n @return balance The balance"
+ },
+ "id": 237,
+ "name": "StructuredDocumentation",
+ "src": "206:106:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "scope": 244,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 238,
+ "name": "ElementaryTypeName",
+ "src": "336:7:1"
+ }
+ ],
+ "id": 239,
+ "name": "VariableDeclaration",
+ "src": "336:14:1"
+ }
+ ],
+ "id": 240,
+ "name": "ParameterList",
+ "src": "335:16:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "balance",
+ "scope": 244,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 241,
+ "name": "ElementaryTypeName",
+ "src": "375:7:1"
+ }
+ ],
+ "id": 242,
+ "name": "VariableDeclaration",
+ "src": "375:15:1"
+ }
+ ],
+ "id": 243,
+ "name": "ParameterList",
+ "src": "374:17:1"
+ }
+ ],
+ "id": 244,
+ "name": "FunctionDefinition",
+ "src": "317:75:1"
+ },
+ {
+ "attributes": {
+ "functionSelector": "a9059cbb",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transfer",
+ "scope": 303,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@notice send `_value` token to `_to` from `msg.sender`\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "id": 245,
+ "name": "StructuredDocumentation",
+ "src": "398:233:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "scope": 254,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 246,
+ "name": "ElementaryTypeName",
+ "src": "654:7:1"
+ }
+ ],
+ "id": 247,
+ "name": "VariableDeclaration",
+ "src": "654:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 254,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 248,
+ "name": "ElementaryTypeName",
+ "src": "667:7:1"
+ }
+ ],
+ "id": 249,
+ "name": "VariableDeclaration",
+ "src": "667:14:1"
+ }
+ ],
+ "id": 250,
+ "name": "ParameterList",
+ "src": "653:29:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "scope": 254,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 251,
+ "name": "ElementaryTypeName",
+ "src": "717:4:1"
+ }
+ ],
+ "id": 252,
+ "name": "VariableDeclaration",
+ "src": "717:12:1"
+ }
+ ],
+ "id": 253,
+ "name": "ParameterList",
+ "src": "716:14:1"
+ }
+ ],
+ "id": 254,
+ "name": "FunctionDefinition",
+ "src": "636:95:1"
+ },
+ {
+ "attributes": {
+ "functionSelector": "23b872dd",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "transferFrom",
+ "scope": 303,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n @param _from The address of the sender\n @param _to The address of the recipient\n @param _value The amount of token to be transferred\n @return success Whether the transfer was successful or not"
+ },
+ "id": 255,
+ "name": "StructuredDocumentation",
+ "src": "737:318:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_from",
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 256,
+ "name": "ElementaryTypeName",
+ "src": "1091:7:1"
+ }
+ ],
+ "id": 257,
+ "name": "VariableDeclaration",
+ "src": "1091:13:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_to",
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 258,
+ "name": "ElementaryTypeName",
+ "src": "1114:7:1"
+ }
+ ],
+ "id": 259,
+ "name": "VariableDeclaration",
+ "src": "1114:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 260,
+ "name": "ElementaryTypeName",
+ "src": "1135:7:1"
+ }
+ ],
+ "id": 261,
+ "name": "VariableDeclaration",
+ "src": "1135:14:1"
+ }
+ ],
+ "id": 262,
+ "name": "ParameterList",
+ "src": "1081:74:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "scope": 266,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 263,
+ "name": "ElementaryTypeName",
+ "src": "1174:4:1"
+ }
+ ],
+ "id": 264,
+ "name": "VariableDeclaration",
+ "src": "1174:12:1"
+ }
+ ],
+ "id": 265,
+ "name": "ParameterList",
+ "src": "1173:14:1"
+ }
+ ],
+ "id": 266,
+ "name": "FunctionDefinition",
+ "src": "1060:128:1"
+ },
+ {
+ "attributes": {
+ "functionSelector": "095ea7b3",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "approve",
+ "scope": 303,
+ "stateMutability": "nonpayable",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@notice `msg.sender` approves `_spender` to spend `_value` tokens\n @param _spender The address of the account able to transfer the tokens\n @param _value The amount of tokens to be approved for transfer\n @return success Whether the approval was successful or not"
+ },
+ "id": 267,
+ "name": "StructuredDocumentation",
+ "src": "1194:286:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "scope": 276,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 268,
+ "name": "ElementaryTypeName",
+ "src": "1502:7:1"
+ }
+ ],
+ "id": 269,
+ "name": "VariableDeclaration",
+ "src": "1502:16:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 276,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 270,
+ "name": "ElementaryTypeName",
+ "src": "1520:7:1"
+ }
+ ],
+ "id": 271,
+ "name": "VariableDeclaration",
+ "src": "1520:14:1"
+ }
+ ],
+ "id": 272,
+ "name": "ParameterList",
+ "src": "1501:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "success",
+ "scope": 276,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool",
+ "type": "bool"
+ },
+ "id": 273,
+ "name": "ElementaryTypeName",
+ "src": "1570:4:1"
+ }
+ ],
+ "id": 274,
+ "name": "VariableDeclaration",
+ "src": "1570:12:1"
+ }
+ ],
+ "id": 275,
+ "name": "ParameterList",
+ "src": "1569:14:1"
+ }
+ ],
+ "id": 276,
+ "name": "FunctionDefinition",
+ "src": "1485:99:1"
+ },
+ {
+ "attributes": {
+ "functionSelector": "dd62ed3e",
+ "implemented": false,
+ "isConstructor": false,
+ "kind": "function",
+ "modifiers": [
+ null
+ ],
+ "name": "allowance",
+ "scope": 303,
+ "stateMutability": "view",
+ "virtual": false,
+ "visibility": "external"
+ },
+ "children": [
+ {
+ "attributes": {
+ "text": "@param _owner The address of the account owning tokens\n @param _spender The address of the account able to transfer the tokens\n @return remaining Amount of remaining tokens allowed to spent"
+ },
+ "id": 277,
+ "name": "StructuredDocumentation",
+ "src": "1590:207:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_owner",
+ "scope": 286,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 278,
+ "name": "ElementaryTypeName",
+ "src": "1821:7:1"
+ }
+ ],
+ "id": 279,
+ "name": "VariableDeclaration",
+ "src": "1821:14:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "_spender",
+ "scope": 286,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 280,
+ "name": "ElementaryTypeName",
+ "src": "1837:7:1"
+ }
+ ],
+ "id": 281,
+ "name": "VariableDeclaration",
+ "src": "1837:16:1"
+ }
+ ],
+ "id": 282,
+ "name": "ParameterList",
+ "src": "1820:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "mutability": "mutable",
+ "name": "remaining",
+ "scope": 286,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 283,
+ "name": "ElementaryTypeName",
+ "src": "1902:7:1"
+ }
+ ],
+ "id": 284,
+ "name": "VariableDeclaration",
+ "src": "1902:17:1"
+ }
+ ],
+ "id": 285,
+ "name": "ParameterList",
+ "src": "1901:19:1"
+ }
+ ],
+ "id": 286,
+ "name": "FunctionDefinition",
+ "src": "1802:119:1"
+ },
+ {
+ "attributes": {
+ "anonymous": false,
+ "name": "Transfer"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_from",
+ "scope": 294,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 287,
+ "name": "ElementaryTypeName",
+ "src": "2001:7:1"
+ }
+ ],
+ "id": 288,
+ "name": "VariableDeclaration",
+ "src": "2001:21:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_to",
+ "scope": 294,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 289,
+ "name": "ElementaryTypeName",
+ "src": "2024:7:1"
+ }
+ ],
+ "id": 290,
+ "name": "VariableDeclaration",
+ "src": "2024:19:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 294,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 291,
+ "name": "ElementaryTypeName",
+ "src": "2045:7:1"
+ }
+ ],
+ "id": 292,
+ "name": "VariableDeclaration",
+ "src": "2045:14:1"
+ }
+ ],
+ "id": 293,
+ "name": "ParameterList",
+ "src": "2000:60:1"
+ }
+ ],
+ "id": 294,
+ "name": "EventDefinition",
+ "src": "1986:75:1"
+ },
+ {
+ "attributes": {
+ "anonymous": false,
+ "name": "Approval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_owner",
+ "scope": 302,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 295,
+ "name": "ElementaryTypeName",
+ "src": "2090:7:1"
+ }
+ ],
+ "id": 296,
+ "name": "VariableDeclaration",
+ "src": "2090:22:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "mutability": "mutable",
+ "name": "_spender",
+ "scope": 302,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address",
+ "stateMutability": "nonpayable",
+ "type": "address"
+ },
+ "id": 297,
+ "name": "ElementaryTypeName",
+ "src": "2122:7:1"
+ }
+ ],
+ "id": 298,
+ "name": "VariableDeclaration",
+ "src": "2122:24:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "mutability": "mutable",
+ "name": "_value",
+ "scope": 302,
+ "stateVariable": false,
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256",
+ "type": "uint256"
+ },
+ "id": 299,
+ "name": "ElementaryTypeName",
+ "src": "2156:7:1"
+ }
+ ],
+ "id": 300,
+ "name": "VariableDeclaration",
+ "src": "2156:14:1"
+ }
+ ],
+ "id": 301,
+ "name": "ParameterList",
+ "src": "2080:96:1"
+ }
+ ],
+ "id": 302,
+ "name": "EventDefinition",
+ "src": "2066:111:1"
+ }
+ ],
+ "id": 303,
+ "name": "ContractDefinition",
+ "src": "183:1996:1"
+ }
+ ],
+ "id": 304,
+ "name": "SourceUnit",
+ "src": "158:2022:1"
+ },
+ "compiler": {
+ "name": "solc",
+ "version": "0.7.6+commit.7338295f.Emscripten.clang"
+ },
+ "networks": {},
+ "schemaVersion": "3.4.1",
+ "updatedAt": "2021-06-23T19:14:26.521Z",
+ "devdoc": {
+ "kind": "dev",
+ "methods": {
+ "allowance(address,address)": {
+ "params": {
+ "_owner": "The address of the account owning tokens",
+ "_spender": "The address of the account able to transfer the tokens"
+ },
+ "returns": {
+ "remaining": "Amount of remaining tokens allowed to spent"
+ }
+ },
+ "approve(address,uint256)": {
+ "params": {
+ "_spender": "The address of the account able to transfer the tokens",
+ "_value": "The amount of tokens to be approved for transfer"
+ },
+ "returns": {
+ "success": "Whether the approval was successful or not"
+ }
+ },
+ "balanceOf(address)": {
+ "params": {
+ "_owner": "The address from which the balance will be retrieved"
+ },
+ "returns": {
+ "balance": "The balance"
+ }
+ },
+ "transfer(address,uint256)": {
+ "params": {
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ },
+ "transferFrom(address,address,uint256)": {
+ "params": {
+ "_from": "The address of the sender",
+ "_to": "The address of the recipient",
+ "_value": "The amount of token to be transferred"
+ },
+ "returns": {
+ "success": "Whether the transfer was successful or not"
+ }
+ }
+ },
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {
+ "approve(address,uint256)": {
+ "notice": "`msg.sender` approves `_spender` to spend `_value` tokens"
+ },
+ "transfer(address,uint256)": {
+ "notice": "send `_value` token to `_to` from `msg.sender`"
+ },
+ "transferFrom(address,address,uint256)": {
+ "notice": "send `_value` token to `_to` from `_from` on the condition it is approved by `_from`"
+ }
+ },
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/truffle/contracts/ERC20.sol b/omgx_examples/truffle/contracts/ERC20.sol
new file mode 100644
index 000000000000..049554ee76a6
--- /dev/null
+++ b/omgx_examples/truffle/contracts/ERC20.sol
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: MIT LICENSE
+/* Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md */
+pragma solidity ^0.6.12;
+
+import "./IERC20.sol";
+
+contract ERC20 is IERC20 {
+ uint256 private constant MAX_UINT256 = 2**256 - 1;
+ mapping(address => uint256) public balances;
+ mapping(address => mapping(address => uint256)) public allowed;
+ /*
+ NOTE:
+ The following variables are OPTIONAL vanities. One does not have to include them.
+ They allow one to customise the token contract & in no way influences the core functionality.
+ Some wallets/interfaces might not even bother to look at this information.
+ */
+ string public name;
+ uint8 public decimals;
+ string public symbol;
+ uint256 public totalSupply;
+
+ constructor(
+ uint256 _initialAmount,
+ string memory _tokenName,
+ uint8 _decimalUnits,
+ string memory _tokenSymbol
+ ) public {
+ balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
+ totalSupply = _initialAmount; // Update total supply
+ name = _tokenName; // Set the name for display purposes
+ decimals = _decimalUnits; // Amount of decimals for display purposes
+ symbol = _tokenSymbol; // Set the symbol for display purposes
+ }
+
+ function transfer(address _to, uint256 _value)
+ public
+ override
+ returns (bool success)
+ {
+ require(balances[msg.sender] >= _value);
+ balances[msg.sender] -= _value;
+ balances[_to] += _value;
+ emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
+ return true;
+ }
+
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _value
+ ) public override returns (bool success) {
+ uint256 allowance_ = allowed[_from][msg.sender];
+ require(balances[_from] >= _value && allowance_ >= _value);
+ balances[_to] += _value;
+ balances[_from] -= _value;
+ if (allowance_ < MAX_UINT256) {
+ allowed[_from][msg.sender] -= _value;
+ }
+ emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
+ return true;
+ }
+
+ function balanceOf(address _owner)
+ public
+ view
+ override
+ returns (uint256 balance)
+ {
+ return balances[_owner];
+ }
+
+ function approve(address _spender, uint256 _value)
+ public
+ override
+ returns (bool success)
+ {
+ allowed[msg.sender][_spender] = _value;
+ emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
+ return true;
+ }
+
+ function allowance(address _owner, address _spender)
+ public
+ view
+ override
+ returns (uint256 remaining)
+ {
+ return allowed[_owner][_spender];
+ }
+}
diff --git a/omgx_examples/truffle/contracts/IERC20.sol b/omgx_examples/truffle/contracts/IERC20.sol
new file mode 100644
index 000000000000..050a47e6c65d
--- /dev/null
+++ b/omgx_examples/truffle/contracts/IERC20.sol
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: MIT LICENSE
+// Abstract contract for the full ERC20 Token standard
+// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
+pragma solidity ^0.6.12;
+
+interface IERC20 {
+ /// @param _owner The address from which the balance will be retrieved
+ /// @return balance The balance
+ function balanceOf(address _owner) external view returns (uint256 balance);
+
+ /// @notice send `_value` token to `_to` from `msg.sender`
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return success Whether the transfer was successful or not
+ function transfer(address _to, uint256 _value)
+ external
+ returns (bool success);
+
+ /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
+ /// @param _from The address of the sender
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return success Whether the transfer was successful or not
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _value
+ ) external returns (bool success);
+
+ /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @param _value The amount of tokens to be approved for transfer
+ /// @return success Whether the approval was successful or not
+ function approve(address _spender, uint256 _value)
+ external
+ returns (bool success);
+
+ /// @param _owner The address of the account owning tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @return remaining Amount of remaining tokens allowed to spent
+ function allowance(address _owner, address _spender)
+ external
+ view
+ returns (uint256 remaining);
+
+ // solhint-disable-next-line no-simple-event-func-name
+ event Transfer(address indexed _from, address indexed _to, uint256 _value);
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+}
diff --git a/omgx_examples/truffle/migrations/1_deploy_ERC20_contract.js b/omgx_examples/truffle/migrations/1_deploy_ERC20_contract.js
new file mode 100644
index 000000000000..5ff1bcb6c16e
--- /dev/null
+++ b/omgx_examples/truffle/migrations/1_deploy_ERC20_contract.js
@@ -0,0 +1,17 @@
+const ERC20 = artifacts.require('ERC20')
+
+module.exports = function (deployer, accounts) {
+ const tokenName = 'My Optimistic Coin'
+ const tokenSymbol = 'OPT'
+ const tokenDecimals = 1
+
+ // deployment steps
+ deployer.deploy(
+ ERC20,
+ 10000,
+ tokenName,
+ tokenDecimals,
+ tokenSymbol,
+ { gasPrice: 0, gasLimit: 10000000 }
+ )
+}
diff --git a/omgx_examples/truffle/package.json b/omgx_examples/truffle/package.json
new file mode 100644
index 000000000000..75ee69b1d666
--- /dev/null
+++ b/omgx_examples/truffle/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "@omgx/Truffle-ERC20-Example",
+ "private": true,
+ "version": "1.0.0-alpha.1",
+ "description": "Example of using Optimistic Ethereum compiler & local Optimistic Ethereum nodes with Truffle to run a full ERC20 test suite",
+ "scripts": {
+ "clean": "rimraf build build-ovm",
+ "compile": "truffle compile --config truffle-config",
+ "compile:ovm": "truffle compile --config truffle-config-ovm.js",
+ "compile:omgx": "truffle compile --config truffle-config-ovm.js",
+ "test:integration": "truffle test",
+ "test:integration:ovm": "truffle test --network optimism --config truffle-config-ovm.js",
+ "test:integration:omgx": "truffle test --network omgx_rinkeby --config truffle-config-ovm.js",
+ "deploy": "truffle migrate --network ethereum --config truffle-config",
+ "deploy:ovm": "truffle migrate --network optimism --config truffle-config-ovm.js",
+ "deploy:omgx": "truffle migrate --network omgx_rinkeby --config truffle-config-ovm.js"
+ },
+ "keywords": [
+ "optimism",
+ "rollup",
+ "optimistic",
+ "ethereum",
+ "truffle",
+ "ovm",
+ "example",
+ "ERC20",
+ "token"
+ ],
+ "homepage": "https://github.com/ethereum-optimism/Truffle-ERC20-Example#readme",
+ "license": "MIT",
+ "author": "Optimism PBC",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ethereum-optimism/Truffle-ERC20-Example.git"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "dependencies": {
+ "@eth-optimism/solc": "0.7.6-alpha.1",
+ "@truffle/hdwallet-provider": "^1.4.0",
+ "rimraf": "^3.0.2",
+ "truffle": "^5.3.6"
+ }
+}
diff --git a/omgx_examples/truffle/test/erc20.spec.js b/omgx_examples/truffle/test/erc20.spec.js
new file mode 100644
index 000000000000..6d8594a1c989
--- /dev/null
+++ b/omgx_examples/truffle/test/erc20.spec.js
@@ -0,0 +1,244 @@
+let token
+
+const ERC20 = artifacts.require('ERC20')
+contract('ERC20', (accounts) => {
+ const tokenName = 'My Optimistic Coin'
+ const tokenSymbol = 'OPT'
+ const tokenDecimals = 1
+
+ beforeEach(async () => {
+ token = await ERC20.new(10000, tokenName, tokenDecimals, tokenSymbol, { from: accounts[ 0 ], gasPrice: 0 })
+ })
+
+ it('creation: should create an initial balance of 10000 for the creator', async () => {
+ const balance = await token.balanceOf.call(accounts[ 0 ], {
+ gasPrice: 0
+ })
+ assert.strictEqual(balance.toNumber(), 10000)
+ })
+
+ it('creation: test correct setting of vanity information', async () => {
+ const name = await token.name.call()
+ assert.strictEqual(name, tokenName)
+
+ const decimals = await token.decimals.call()
+ assert.strictEqual(decimals.toNumber(), tokenDecimals)
+
+ const symbol = await token.symbol.call()
+ assert.strictEqual(symbol, tokenSymbol)
+ })
+
+ it('creation: should succeed in creating over 2^256 - 1 (max) tokens', async () => {
+ // 2^256 - 1
+ const token2 = await ERC20.new('115792089237316195423570985008687907853269984665640564039457584007913129639935', 'Simon Bucks', 1, 'SBX', { from: accounts[ 0 ], gasPrice: 0 })
+ const totalSupply = await token2.totalSupply()
+ assert.strictEqual(totalSupply.toString(), '115792089237316195423570985008687907853269984665640564039457584007913129639935')
+ })
+
+ // TRANSERS
+ // normal transfers without approvals
+ it('transfers: ether transfer should be reversed.', async () => {
+ const balanceBefore = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balanceBefore.toNumber(), 10000)
+
+ let threw = false
+ try {
+ await web3.eth.sendTransaction({ from: accounts[ 0 ], to: token.address, value: web3.utils.toWei('10', 'Ether'), gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+
+ const balanceAfter = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balanceAfter.toNumber(), 10000)
+ })
+
+ it('transfers: should transfer 10000 to accounts[1] with accounts[0] having 10000', async () => {
+ await token.transfer(accounts[ 1 ], 10000, { from: accounts[ 0 ], gasPrice: 0 })
+ const balance = await token.balanceOf.call(accounts[ 1 ])
+ assert.strictEqual(balance.toNumber(), 10000)
+ })
+
+ it('transfers: should fail when trying to transfer 10001 to accounts[1] with accounts[0] having 10000', async () => {
+ let threw = false
+ try {
+ await token.transfer.call(accounts[ 1 ], 10001, { from: accounts[ 0 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('transfers: should handle zero-transfers normally', async () => {
+ assert(await token.transfer.call(accounts[ 1 ], 0, { from: accounts[ 0 ], gasPrice: 0 }), 'zero-transfer has failed')
+ })
+
+ // NOTE: testing uint256 wrapping is impossible since you can't supply > 2^256 -1
+ // todo: transfer max amounts
+
+ // APPROVALS
+ it('approvals: msg.sender should approve 100 to accounts[1]', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance.toNumber(), 100)
+ })
+
+ // bit overkill. But is for testing a bug
+ it('approvals: msg.sender approves accounts[1] of 100 & withdraws 20 once.', async () => {
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 10000)
+
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 }) // 100
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 0, 'balance2 not correct')
+
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 }) // -20
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toNumber(), 80) // =80
+
+ const balance22 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance22.toNumber(), 20)
+
+ const balance02 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance02.toNumber(), 9980)
+ })
+
+ // should approve 100 of msg.sender & withdraw 50, twice. (should succeed)
+ it('approvals: msg.sender approves accounts[1] of 100 & withdraws 20 twice.', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toNumber(), 100)
+
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance012 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance012.toNumber(), 80)
+
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 20)
+
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 9980)
+
+ // FIRST tx done.
+ // onto next.
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance013 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance013.toNumber(), 60)
+
+ const balance22 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance22.toNumber(), 40)
+
+ const balance02 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance02.toNumber(), 9960)
+ })
+
+ // should approve 100 of msg.sender & withdraw 50 & 60 (should fail).
+ it('approvals: msg.sender approves accounts[1] of 100 & withdraws 50 & 60 (2nd tx should fail)', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toNumber(), 100)
+
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 50, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance012 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance012.toNumber(), 50)
+
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 50)
+
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 9950)
+
+ // FIRST tx done.
+ // onto next.
+ let threw = false
+ try {
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('approvals: attempt withdrawal from account with no allowance (should fail)', async () => {
+ let threw = false
+ try {
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('approvals: allow accounts[1] 100 to withdraw from accounts[0]. Withdraw 60 and then approve 0 & attempt transfer.', async () => {
+ await token.approve(accounts[ 1 ], 100, { from: accounts[ 0 ], gasPrice: 0 })
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 60, { from: accounts[ 1 ], gasPrice: 0 })
+ await token.approve(accounts[ 1 ], 0, { from: accounts[ 0 ], gasPrice: 0 })
+ let threw = false
+ try {
+ await token.transferFrom.call(accounts[ 0 ], accounts[ 2 ], 10, { from: accounts[ 1 ], gasPrice: 0 })
+ } catch (e) {
+ threw = true
+ }
+ assert.equal(threw, true)
+ })
+
+ it('approvals: approve max (2^256 - 1)', async () => {
+ await token.approve(accounts[ 1 ], '115792089237316195423570985008687907853269984665640564039457584007913129639935', { from: accounts[ 0 ], gasPrice: 0 })
+ const allowance = await token.allowance(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance.toString(), '115792089237316195423570985008687907853269984665640564039457584007913129639935')
+ })
+
+ // should approve max of msg.sender & withdraw 20 without changing allowance (should succeed).
+ it('approvals: msg.sender approves accounts[1] of max (2^256 - 1) & withdraws 20', async () => {
+ const balance0 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance0.toNumber(), 10000)
+
+ const max = '115792089237316195423570985008687907853269984665640564039457584007913129639935'
+ await token.approve(accounts[ 1 ], max, { from: accounts[ 0 ], gasPrice: 0 })
+ const balance2 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance2.toNumber(), 0, 'balance2 not correct')
+
+ await token.transferFrom(accounts[ 0 ], accounts[ 2 ], 20, { from: accounts[ 1 ], gasPrice: 0 })
+ const allowance01 = await token.allowance.call(accounts[ 0 ], accounts[ 1 ])
+ assert.strictEqual(allowance01.toString(), max)
+
+ const balance22 = await token.balanceOf.call(accounts[ 2 ])
+ assert.strictEqual(balance22.toNumber(), 20)
+
+ const balance02 = await token.balanceOf.call(accounts[ 0 ])
+ assert.strictEqual(balance02.toNumber(), 9980)
+ })
+
+ it('events: should fire Transfer event properly', async () => {
+ const res = await token.transfer(accounts[ 1 ], '2666', { from: accounts[ 0 ], gasPrice: 0 })
+ const transferLog = res.logs.find(
+ element => element.event.match('Transfer') &&
+ element.address.match(token.address)
+ )
+ assert.strictEqual(transferLog.args._from, accounts[ 0 ])
+ // L2 ETH transfer also emits a transfer event
+ assert.strictEqual(transferLog.args._to, accounts[ 1 ])
+ assert.strictEqual(transferLog.args._value.toString(), '2666')
+ })
+
+ it('events: should fire Transfer event normally on a zero transfer', async () => {
+ const res = await token.transfer(accounts[ 1 ], '0', { from: accounts[ 0 ], gasPrice: 0 })
+ const transferLog = res.logs.find(
+ element => element.event.match('Transfer') &&
+ element.address.match(token.address)
+ )
+ assert.strictEqual(transferLog.args._from, accounts[ 0 ])
+ assert.strictEqual(transferLog.args._to, accounts[ 1 ])
+ assert.strictEqual(transferLog.args._value.toString(), '0')
+ })
+
+ it('events: should fire Approval event properly', async () => {
+ const res = await token.approve(accounts[ 1 ], '2666', { from: accounts[ 0 ], gasPrice: 0 })
+ const approvalLog = res.logs.find(element => element.event.match('Approval'))
+ assert.strictEqual(approvalLog.args._owner, accounts[ 0 ])
+ assert.strictEqual(approvalLog.args._spender, accounts[ 1 ])
+ assert.strictEqual(approvalLog.args._value.toString(), '2666')
+ })
+})
diff --git a/omgx_examples/truffle/truffle-config-ovm.js b/omgx_examples/truffle/truffle-config-ovm.js
new file mode 100644
index 000000000000..b53f510ba526
--- /dev/null
+++ b/omgx_examples/truffle/truffle-config-ovm.js
@@ -0,0 +1,48 @@
+const mnemonicPhrase = "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat"
+const HDWalletProvider = require('@truffle/hdwallet-provider')
+
+module.exports = {
+ contracts_build_directory: './build-ovm',
+ networks: {
+ optimism: {
+ provider: function () {
+ return new HDWalletProvider({
+ mnemonic: {
+ phrase: mnemonicPhrase
+ },
+ providerOrUrl: 'http://127.0.0.1:8545'
+ })
+ },
+ network_id: 28,
+ host: '127.0.0.1',
+ port: 8545,
+ gasPrice: 0,
+ gas: 54180127,
+ },
+ omgx_rinkeby: {
+ provider: function () {
+ return new HDWalletProvider({
+ mnemonic: {
+ phrase: mnemonicPhrase
+ },
+ providerOrUrl: 'http://rinkeby.omgx.network'
+ })
+ },
+ network_id: 28,
+ host: 'http://rinkeby.omgx.network',
+ gasPrice: 0,
+ gas: 0,
+ }
+ },
+ compilers: {
+ solc: {
+ version: '../../node_modules/@eth-optimism/solc',
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 1
+ },
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/omgx_examples/truffle/truffle-config.js b/omgx_examples/truffle/truffle-config.js
new file mode 100644
index 000000000000..47c7e7f8477d
--- /dev/null
+++ b/omgx_examples/truffle/truffle-config.js
@@ -0,0 +1,17 @@
+module.exports = {
+ contracts_build_directory: './build',
+ networks: {
+ ethereum: {
+ network_id: 31337,
+ host: '127.0.0.1',
+ port: 9545,
+ gasPrice: 0,
+ },
+ },
+ // Configure your compilers
+ compilers: {
+ solc: {
+ version: '0.7.6', // Fetch exact version from solc-bin (default: truffle's version)
+ }
+ }
+}
diff --git a/omgx_examples/truffle/yarn.lock b/omgx_examples/truffle/yarn.lock
new file mode 100644
index 000000000000..8f4b3888b768
--- /dev/null
+++ b/omgx_examples/truffle/yarn.lock
@@ -0,0 +1,11268 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"101@^1.0.0", "101@^1.2.0":
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/101/-/101-1.6.3.tgz#9071196e60c47e4ce327075cf49c0ad79bd822fd"
+ integrity sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw==
+ dependencies:
+ clone "^1.0.2"
+ deep-eql "^0.1.3"
+ keypather "^1.10.2"
+
+"@apollo/client@^3.1.5":
+ version "3.3.20"
+ resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.20.tgz#8f0935fa991857e9cf2e73c9bd378ad7ec97caf8"
+ integrity sha512-hS7UmBwJweudw/J3M0RAcusMHNiRuGqkRH6g91PM2ev8cXScIMdXr/++9jo7wD1nAITMCMF4HQQ3LFaw/Or0Bw==
+ dependencies:
+ "@graphql-typed-document-node/core" "^3.0.0"
+ "@types/zen-observable" "^0.8.0"
+ "@wry/context" "^0.6.0"
+ "@wry/equality" "^0.5.0"
+ fast-json-stable-stringify "^2.0.0"
+ graphql-tag "^2.12.0"
+ hoist-non-react-statics "^3.3.2"
+ optimism "^0.16.0"
+ prop-types "^15.7.2"
+ symbol-observable "^4.0.0"
+ ts-invariant "^0.7.0"
+ tslib "^1.10.0"
+ zen-observable "^0.8.14"
+
+"@apollo/protobufjs@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c"
+ integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.0"
+ "@types/node" "^10.1.0"
+ long "^4.0.0"
+
+"@apollographql/apollo-tools@^0.5.0":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz#f0baef739ff7e2fafcb8b98ad29f6ac817e53e32"
+ integrity sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA==
+
+"@apollographql/graphql-playground-html@1.6.27":
+ version "1.6.27"
+ resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz#bc9ab60e9445aa2a8813b4e94f152fa72b756335"
+ integrity sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==
+ dependencies:
+ xss "^1.0.8"
+
+"@apollographql/graphql-upload-8-fork@^8.1.3":
+ version "8.1.3"
+ resolved "https://registry.yarnpkg.com/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz#a0d4e0d5cec8e126d78bd915c264d6b90f5784bc"
+ integrity sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==
+ dependencies:
+ "@types/express" "*"
+ "@types/fs-capacitor" "*"
+ "@types/koa" "*"
+ busboy "^0.3.1"
+ fs-capacitor "^2.0.4"
+ http-errors "^1.7.3"
+ object-path "^0.11.4"
+
+"@ardatan/aggregate-error@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz#fe6924771ea40fc98dc7a7045c2e872dc8527609"
+ integrity sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==
+ dependencies:
+ tslib "~2.0.1"
+
+"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
+ integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
+ dependencies:
+ "@babel/highlight" "^7.14.5"
+
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7":
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08"
+ integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==
+
+"@babel/core@^7.0.0":
+ version "7.14.6"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab"
+ integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==
+ dependencies:
+ "@babel/code-frame" "^7.14.5"
+ "@babel/generator" "^7.14.5"
+ "@babel/helper-compilation-targets" "^7.14.5"
+ "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helpers" "^7.14.6"
+ "@babel/parser" "^7.14.6"
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.14.5"
+ "@babel/types" "^7.14.5"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ semver "^6.3.0"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.12.13", "@babel/generator@^7.14.5", "@babel/generator@^7.5.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785"
+ integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==
+ dependencies:
+ "@babel/types" "^7.14.5"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61"
+ integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf"
+ integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==
+ dependencies:
+ "@babel/compat-data" "^7.14.5"
+ "@babel/helper-validator-option" "^7.14.5"
+ browserslist "^4.16.6"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.14.5":
+ version "7.14.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542"
+ integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.14.5"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-member-expression-to-functions" "^7.14.5"
+ "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.14.5"
+ "@babel/helper-split-export-declaration" "^7.14.5"
+
+"@babel/helper-define-polyfill-provider@^0.2.2":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6"
+ integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.13.0"
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/traverse" "^7.13.0"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4"
+ integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.14.5"
+ "@babel/template" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-get-function-arity@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815"
+ integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-hoist-variables@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d"
+ integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-member-expression-to-functions@^7.14.5":
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970"
+ integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3"
+ integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-module-transforms@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e"
+ integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.14.5"
+ "@babel/helper-simple-access" "^7.14.5"
+ "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/helper-validator-identifier" "^7.14.5"
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-optimise-call-expression@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c"
+ integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
+ integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
+
+"@babel/helper-replace-supers@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94"
+ integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.14.5"
+ "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/traverse" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-simple-access@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4"
+ integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4"
+ integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a"
+ integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==
+ dependencies:
+ "@babel/types" "^7.14.5"
+
+"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8"
+ integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==
+
+"@babel/helper-validator-option@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
+ integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==
+
+"@babel/helpers@^7.14.6":
+ version "7.14.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635"
+ integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==
+ dependencies:
+ "@babel/template" "^7.14.5"
+ "@babel/traverse" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/highlight@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
+ integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.5"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@7.12.16":
+ version "7.12.16"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4"
+ integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==
+
+"@babel/parser@^7.0.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7":
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595"
+ integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==
+
+"@babel/plugin-proposal-class-properties@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e"
+ integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-proposal-object-rest-spread@^7.0.0":
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363"
+ integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==
+ dependencies:
+ "@babel/compat-data" "^7.14.7"
+ "@babel/helper-compilation-targets" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.14.5"
+
+"@babel/plugin-syntax-class-properties@^7.0.0":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180"
+ integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201"
+ integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-transform-arrow-functions@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a"
+ integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-block-scoped-functions@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4"
+ integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-block-scoping@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939"
+ integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf"
+ integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.14.5"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.14.5"
+ "@babel/helper-split-export-declaration" "^7.14.5"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f"
+ integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-destructuring@^7.0.0":
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576"
+ integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-flow-strip-types@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz#0dc9c1d11dcdc873417903d6df4bed019ef0f85e"
+ integrity sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/plugin-syntax-flow" "^7.14.5"
+
+"@babel/plugin-transform-for-of@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb"
+ integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-function-name@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2"
+ integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-literals@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78"
+ integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-member-expression-literals@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7"
+ integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-modules-commonjs@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97"
+ integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-simple-access" "^7.14.5"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-object-super@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45"
+ integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.14.5"
+
+"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3"
+ integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-property-literals@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34"
+ integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-react-display-name@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz#baa92d15c4570411301a85a74c13534873885b65"
+ integrity sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-react-jsx@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz#39749f0ee1efd8a1bd729152cf5f78f1d247a44a"
+ integrity sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.14.5"
+ "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/plugin-syntax-jsx" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/plugin-transform-runtime@^7.5.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523"
+ integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-plugin-utils" "^7.14.5"
+ babel-plugin-polyfill-corejs2 "^0.2.2"
+ babel-plugin-polyfill-corejs3 "^0.2.2"
+ babel-plugin-polyfill-regenerator "^0.2.2"
+ semver "^6.3.0"
+
+"@babel/plugin-transform-shorthand-properties@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58"
+ integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-spread@^7.0.0":
+ version "7.14.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
+ integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
+
+"@babel/plugin-transform-template-literals@^7.0.0":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93"
+ integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.14.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d"
+ integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4"
+ integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==
+ dependencies:
+ "@babel/code-frame" "^7.14.5"
+ "@babel/parser" "^7.14.5"
+ "@babel/types" "^7.14.5"
+
+"@babel/traverse@7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0"
+ integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.12.13"
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.19"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5":
+ version "7.14.7"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753"
+ integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==
+ dependencies:
+ "@babel/code-frame" "^7.14.5"
+ "@babel/generator" "^7.14.5"
+ "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-hoist-variables" "^7.14.5"
+ "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/parser" "^7.14.7"
+ "@babel/types" "^7.14.5"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611"
+ integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ lodash "^4.17.19"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff"
+ integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.5"
+ to-fast-properties "^2.0.0"
+
+"@consento/sync-randombytes@^1.0.4", "@consento/sync-randombytes@^1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz#5be6bc58c6a6fa6e09f04cc684d037e29e6c28d5"
+ integrity sha512-mPJ2XvrTLQGEdhleDuSIkWtVWnvmhREOC1FjorV1nlK49t/52Z9X1d618gTj6nlQghRLiYvcd8oL4vZ2YZuDIQ==
+ dependencies:
+ buffer "^5.4.3"
+ seedrandom "^3.0.5"
+
+"@eth-optimism/solc@0.7.6-alpha.1":
+ version "0.7.6-alpha.1"
+ resolved "https://registry.yarnpkg.com/@eth-optimism/solc/-/solc-0.7.6-alpha.1.tgz#f503073161fdc0029dbc1dae6fae28eeb046b559"
+ integrity sha512-tVYeBtjwNRUDmaTdJNlKI0lTM0yV1hez0jPFOtACoepBwBEZOuuFLBgQLBOWPaR95UU2ke1YjqB7rrpkE3oRDg==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+"@ethersproject/abi@5.0.7":
+ version "5.0.7"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b"
+ integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==
+ dependencies:
+ "@ethersproject/address" "^5.0.4"
+ "@ethersproject/bignumber" "^5.0.7"
+ "@ethersproject/bytes" "^5.0.4"
+ "@ethersproject/constants" "^5.0.4"
+ "@ethersproject/hash" "^5.0.4"
+ "@ethersproject/keccak256" "^5.0.3"
+ "@ethersproject/logger" "^5.0.5"
+ "@ethersproject/properties" "^5.0.3"
+ "@ethersproject/strings" "^5.0.4"
+
+"@ethersproject/abstract-provider@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d"
+ integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+
+"@ethersproject/abstract-signer@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65"
+ integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
+ integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+
+"@ethersproject/base64@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
+ integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+
+"@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9"
+ integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
+ integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
+ integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+
+"@ethersproject/hash@^5.0.4":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
+ integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
+ integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
+ integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
+
+"@ethersproject/networks@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.0.tgz#71eecd3ef3755118b42c1a5d2a44a7e07202e10a"
+ integrity sha512-5fywtKRDcnaVeA5SjxXH3DOQqe/IbeD/plwydi94SdPps1fbDUrnO6SzDExaruBZXxpxJcO9upG9UComsei4bg==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
+ integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/rlp@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
+ integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/signing-key@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
+ integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
+ integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
+ integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+
+"@ethersproject/web@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
+ integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==
+ dependencies:
+ "@ethersproject/base64" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@graphql-tools/batch-delegate@^6.2.4", "@graphql-tools/batch-delegate@^6.2.6":
+ version "6.2.6"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-6.2.6.tgz#fbea98dc825f87ef29ea5f3f371912c2a2aa2f2c"
+ integrity sha512-QUoE9pQtkdNPFdJHSnBhZtUfr3M7pIRoXoMR+TG7DK2Y62ISKbT/bKtZEUU1/2v5uqd5WVIvw9dF8gHDSJAsSA==
+ dependencies:
+ "@graphql-tools/delegate" "^6.2.4"
+ dataloader "2.0.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/batch-execute@^7.1.2":
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz#35ba09a1e0f80f34f1ce111d23c40f039d4403a0"
+ integrity sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg==
+ dependencies:
+ "@graphql-tools/utils" "^7.7.0"
+ dataloader "2.0.0"
+ tslib "~2.2.0"
+ value-or-promise "1.0.6"
+
+"@graphql-tools/code-file-loader@^6.2.4":
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.3.1.tgz#42dfd4db5b968acdb453382f172ec684fa0c34ed"
+ integrity sha512-ZJimcm2ig+avgsEOWWVvAaxZrXXhiiSZyYYOJi0hk9wh5BxZcLUNKkTp6EFnZE/jmGUwuos3pIjUD3Hwi3Bwhg==
+ dependencies:
+ "@graphql-tools/graphql-tag-pluck" "^6.5.1"
+ "@graphql-tools/utils" "^7.0.0"
+ tslib "~2.1.0"
+
+"@graphql-tools/delegate@^6.2.4":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-6.2.4.tgz#db553b63eb9512d5eb5bbfdfcd8cb1e2b534699c"
+ integrity sha512-mXe6DfoWmq49kPcDrpKHgC2DSWcD5q0YCaHHoXYPAOlnLH8VMTY8BxcE8y/Do2eyg+GLcwAcrpffVszWMwqw0w==
+ dependencies:
+ "@ardatan/aggregate-error" "0.0.6"
+ "@graphql-tools/schema" "^6.2.4"
+ "@graphql-tools/utils" "^6.2.4"
+ dataloader "2.0.0"
+ is-promise "4.0.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.1.5":
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.1.5.tgz#0b027819b7047eff29bacbd5032e34a3d64bd093"
+ integrity sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g==
+ dependencies:
+ "@ardatan/aggregate-error" "0.0.6"
+ "@graphql-tools/batch-execute" "^7.1.2"
+ "@graphql-tools/schema" "^7.1.5"
+ "@graphql-tools/utils" "^7.7.1"
+ dataloader "2.0.0"
+ tslib "~2.2.0"
+ value-or-promise "1.0.6"
+
+"@graphql-tools/git-loader@^6.2.4":
+ version "6.2.6"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.2.6.tgz#c2226f4b8f51f1c05c9ab2649ba32d49c68cd077"
+ integrity sha512-ooQTt2CaG47vEYPP3CPD+nbA0F+FYQXfzrB1Y1ABN9K3d3O2RK3g8qwslzZaI8VJQthvKwt0A95ZeE4XxteYfw==
+ dependencies:
+ "@graphql-tools/graphql-tag-pluck" "^6.2.6"
+ "@graphql-tools/utils" "^7.0.0"
+ tslib "~2.1.0"
+
+"@graphql-tools/github-loader@^6.2.4":
+ version "6.2.5"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz#460dff6f5bbaa26957a5ea3be4f452b89cc6a44b"
+ integrity sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw==
+ dependencies:
+ "@graphql-tools/graphql-tag-pluck" "^6.2.6"
+ "@graphql-tools/utils" "^7.0.0"
+ cross-fetch "3.0.6"
+ tslib "~2.0.1"
+
+"@graphql-tools/graphql-file-loader@^6.2.4":
+ version "6.2.7"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz#d3720f2c4f4bb90eb2a03a7869a780c61945e143"
+ integrity sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ==
+ dependencies:
+ "@graphql-tools/import" "^6.2.6"
+ "@graphql-tools/utils" "^7.0.0"
+ tslib "~2.1.0"
+
+"@graphql-tools/graphql-tag-pluck@^6.2.4", "@graphql-tools/graphql-tag-pluck@^6.2.6", "@graphql-tools/graphql-tag-pluck@^6.5.1":
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.5.1.tgz#5fb227dbb1e19f4b037792b50f646f16a2d4c686"
+ integrity sha512-7qkm82iFmcpb8M6/yRgzjShtW6Qu2OlCSZp8uatA3J0eMl87TxyJoUmL3M3UMMOSundAK8GmoyNVFUrueueV5Q==
+ dependencies:
+ "@babel/parser" "7.12.16"
+ "@babel/traverse" "7.12.13"
+ "@babel/types" "7.12.13"
+ "@graphql-tools/utils" "^7.0.0"
+ tslib "~2.1.0"
+
+"@graphql-tools/import@^6.2.4", "@graphql-tools/import@^6.2.6":
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.3.1.tgz#731c47ab6c6ac9f7994d75c76b6c2fa127d2d483"
+ integrity sha512-1szR19JI6WPibjYurMLdadHKZoG9C//8I/FZ0Dt4vJSbrMdVNp8WFxg4QnZrDeMG4MzZc90etsyF5ofKjcC+jw==
+ dependencies:
+ resolve-from "5.0.0"
+ tslib "~2.2.0"
+
+"@graphql-tools/json-file-loader@^6.2.4":
+ version "6.2.6"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz#830482cfd3721a0799cbf2fe5b09959d9332739a"
+ integrity sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA==
+ dependencies:
+ "@graphql-tools/utils" "^7.0.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/links@^6.2.4":
+ version "6.2.5"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/links/-/links-6.2.5.tgz#b172cadc4b7cbe27bfc1dc787651f92517f583bc"
+ integrity sha512-XeGDioW7F+HK6HHD/zCeF0HRC9s12NfOXAKv1HC0J7D50F4qqMvhdS/OkjzLoBqsgh/Gm8icRc36B5s0rOA9ig==
+ dependencies:
+ "@graphql-tools/utils" "^7.0.0"
+ apollo-link "1.2.14"
+ apollo-upload-client "14.1.2"
+ cross-fetch "3.0.6"
+ form-data "3.0.0"
+ is-promise "4.0.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/load-files@^6.2.4":
+ version "6.3.2"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/load-files/-/load-files-6.3.2.tgz#c4e84394e5b95b96452c22e960e2595ac9154648"
+ integrity sha512-3mgwEKZ8yy7CD/uVs9yeXR3r+GwjlTKRG5bC75xdJFN8WbzbcHjIJiTXfWSAYqbfSTam0hWnRdWghagzFSo5kQ==
+ dependencies:
+ globby "11.0.3"
+ tslib "~2.1.0"
+ unixify "1.0.0"
+
+"@graphql-tools/load@^6.2.4":
+ version "6.2.8"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.2.8.tgz#16900fb6e75e1d075cad8f7ea439b334feb0b96a"
+ integrity sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA==
+ dependencies:
+ "@graphql-tools/merge" "^6.2.12"
+ "@graphql-tools/utils" "^7.5.0"
+ globby "11.0.3"
+ import-from "3.0.0"
+ is-glob "4.0.1"
+ p-limit "3.1.0"
+ tslib "~2.2.0"
+ unixify "1.0.0"
+ valid-url "1.0.9"
+
+"@graphql-tools/merge@^6.2.12", "@graphql-tools/merge@^6.2.4":
+ version "6.2.14"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.14.tgz#694e2a2785ba47558e5665687feddd2935e9d94e"
+ integrity sha512-RWT4Td0ROJai2eR66NHejgf8UwnXJqZxXgDWDI+7hua5vNA2OW8Mf9K1Wav1ZkjWnuRp4ztNtkZGie5ISw55ow==
+ dependencies:
+ "@graphql-tools/schema" "^7.0.0"
+ "@graphql-tools/utils" "^7.7.0"
+ tslib "~2.2.0"
+
+"@graphql-tools/mock@^6.2.4":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-6.2.4.tgz#205323c51f89dd855d345d130c7713d0420909ea"
+ integrity sha512-O5Zvq/mcDZ7Ptky0IZ4EK9USmxV6FEVYq0Jxv2TI80kvxbCjt0tbEpZ+r1vIt1gZOXlAvadSHYyzWnUPh+1vkQ==
+ dependencies:
+ "@graphql-tools/schema" "^6.2.4"
+ "@graphql-tools/utils" "^6.2.4"
+ tslib "~2.0.1"
+
+"@graphql-tools/module-loader@^6.2.4":
+ version "6.2.7"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/module-loader/-/module-loader-6.2.7.tgz#66ab9468775fac8079ca46ea9896ceea76e4ef69"
+ integrity sha512-ItAAbHvwfznY9h1H9FwHYDstTcm22Dr5R9GZtrWlpwqj0jaJGcBxsMB9jnK9kFqkbtFYEe4E/NsSnxsS4/vViQ==
+ dependencies:
+ "@graphql-tools/utils" "^7.5.0"
+ tslib "~2.1.0"
+
+"@graphql-tools/relay-operation-optimizer@^6.2.4":
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.3.0.tgz#f8c7f6c8aa4a9cf50ab151fbc5db4f4282a79532"
+ integrity sha512-Or3UgRvkY9Fq1AAx7q38oPqFmTepLz7kp6wDHKyR0ceG7AvHv5En22R12mAeISInbhff4Rpwgf6cE8zHRu6bCw==
+ dependencies:
+ "@graphql-tools/utils" "^7.1.0"
+ relay-compiler "10.1.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/resolvers-composition@^6.2.4":
+ version "6.2.8"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/resolvers-composition/-/resolvers-composition-6.2.8.tgz#fa91be40ef424e88290cc101e1ab67b1201ce04f"
+ integrity sha512-/2xedRZYhvts88x9Rv/VWrk69wpl84M7cuYZ4aAacqxnXNm7zxT+MqeL54lsRhq2Kb2yjEhtfguEiqOn+kV8Xg==
+ dependencies:
+ "@graphql-tools/utils" "^7.9.1"
+ lodash "4.17.21"
+ tslib "~2.2.0"
+
+"@graphql-tools/schema@^6.2.4":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-6.2.4.tgz#cc4e9f5cab0f4ec48500e666719d99fc5042481d"
+ integrity sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ==
+ dependencies:
+ "@graphql-tools/utils" "^6.2.4"
+ tslib "~2.0.1"
+
+"@graphql-tools/schema@^7.0.0", "@graphql-tools/schema@^7.1.5":
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-7.1.5.tgz#07b24e52b182e736a6b77c829fc48b84d89aa711"
+ integrity sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA==
+ dependencies:
+ "@graphql-tools/utils" "^7.1.2"
+ tslib "~2.2.0"
+ value-or-promise "1.0.6"
+
+"@graphql-tools/stitch@^6.2.4":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/stitch/-/stitch-6.2.4.tgz#acfa6a577a33c0f02e4940ffff04753b23b87fd6"
+ integrity sha512-0C7PNkS7v7iAc001m7c1LPm5FUB0/DYw+s3OyCii6YYYHY8NwdI0roeOyeDGFJkFubWBQfjc3hoSyueKtU73mw==
+ dependencies:
+ "@graphql-tools/batch-delegate" "^6.2.4"
+ "@graphql-tools/delegate" "^6.2.4"
+ "@graphql-tools/merge" "^6.2.4"
+ "@graphql-tools/schema" "^6.2.4"
+ "@graphql-tools/utils" "^6.2.4"
+ "@graphql-tools/wrap" "^6.2.4"
+ is-promise "4.0.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/url-loader@^6.2.4":
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz#dc741e4299e0e7ddf435eba50a1f713b3e763b33"
+ integrity sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw==
+ dependencies:
+ "@graphql-tools/delegate" "^7.0.1"
+ "@graphql-tools/utils" "^7.9.0"
+ "@graphql-tools/wrap" "^7.0.4"
+ "@microsoft/fetch-event-source" "2.0.1"
+ "@types/websocket" "1.0.2"
+ abort-controller "3.0.0"
+ cross-fetch "3.1.4"
+ extract-files "9.0.0"
+ form-data "4.0.0"
+ graphql-ws "^4.4.1"
+ is-promise "4.0.0"
+ isomorphic-ws "4.0.1"
+ lodash "4.17.21"
+ meros "1.1.4"
+ subscriptions-transport-ws "^0.9.18"
+ sync-fetch "0.3.0"
+ tslib "~2.2.0"
+ valid-url "1.0.9"
+ ws "7.4.5"
+
+"@graphql-tools/utils@^6.2.4":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-6.2.4.tgz#38a2314d2e5e229ad4f78cca44e1199e18d55856"
+ integrity sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==
+ dependencies:
+ "@ardatan/aggregate-error" "0.0.6"
+ camel-case "4.1.1"
+ tslib "~2.0.1"
+
+"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.1.0", "@graphql-tools/utils@^7.1.2", "@graphql-tools/utils@^7.5.0", "@graphql-tools/utils@^7.7.0", "@graphql-tools/utils@^7.7.1", "@graphql-tools/utils@^7.8.1", "@graphql-tools/utils@^7.9.0", "@graphql-tools/utils@^7.9.1":
+ version "7.10.0"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.10.0.tgz#07a4cb5d1bec1ff1dc1d47a935919ee6abd38699"
+ integrity sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==
+ dependencies:
+ "@ardatan/aggregate-error" "0.0.6"
+ camel-case "4.1.2"
+ tslib "~2.2.0"
+
+"@graphql-tools/wrap@^6.2.4":
+ version "6.2.4"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-6.2.4.tgz#2709817da6e469753735a9fe038c9e99736b2c57"
+ integrity sha512-cyQgpybolF9DjL2QNOvTS1WDCT/epgYoiA8/8b3nwv5xmMBQ6/6nYnZwityCZ7njb7MMyk7HBEDNNlP9qNJDcA==
+ dependencies:
+ "@graphql-tools/delegate" "^6.2.4"
+ "@graphql-tools/schema" "^6.2.4"
+ "@graphql-tools/utils" "^6.2.4"
+ is-promise "4.0.0"
+ tslib "~2.0.1"
+
+"@graphql-tools/wrap@^7.0.4":
+ version "7.0.8"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-7.0.8.tgz#ad41e487135ca3ea1ae0ea04bb3f596177fb4f50"
+ integrity sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg==
+ dependencies:
+ "@graphql-tools/delegate" "^7.1.5"
+ "@graphql-tools/schema" "^7.1.5"
+ "@graphql-tools/utils" "^7.8.1"
+ tslib "~2.2.0"
+ value-or-promise "1.0.6"
+
+"@graphql-typed-document-node/core@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950"
+ integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==
+
+"@gulp-sourcemaps/map-sources@1.X":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
+ integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o=
+ dependencies:
+ normalize-path "^2.0.1"
+ through2 "^2.0.3"
+
+"@improbable-eng/grpc-web@^0.12.0":
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.12.0.tgz#9b10a7edf2a1d7672f8997e34a60e7b70e49738f"
+ integrity sha512-uJjgMPngreRTYPBuo6gswMj1gK39Wbqre/RgE0XnSDXJRg6ST7ZhuS53dFE6Vc2CX4jxgl+cO+0B3op8LA4Q0Q==
+ dependencies:
+ browser-headers "^0.4.0"
+
+"@improbable-eng/grpc-web@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.13.0.tgz#289e6fc4dafc00b1af8e2b93b970e6892299014d"
+ integrity sha512-vaxxT+Qwb7GPqDQrBV4vAAfH0HywgOLw6xGIKXd9Q8hcV63CQhmS3p4+pZ9/wVvt4Ph3ZDK9fdC983b9aGMUFg==
+ dependencies:
+ browser-headers "^0.4.0"
+
+"@improbable-eng/grpc-web@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.14.0.tgz#a71c5af471dcef6a2810798f71f93ed8d6ac3817"
+ integrity sha512-ag1PTMWpBZKGi6GrEcZ4lkU5Qag23Xjo10BmnK9qyx4TMmSVcWmQ3rECirfQzm2uogrM9n1M6xfOpFsJP62ivA==
+ dependencies:
+ browser-headers "^0.4.1"
+
+"@josephg/resolvable@^1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb"
+ integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==
+
+"@ledgerhq/devices@^5.51.1":
+ version "5.51.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7"
+ integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==
+ dependencies:
+ "@ledgerhq/errors" "^5.50.0"
+ "@ledgerhq/logs" "^5.50.0"
+ rxjs "6"
+ semver "^7.3.5"
+
+"@ledgerhq/errors@^5.50.0":
+ version "5.50.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9"
+ integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==
+
+"@ledgerhq/hw-transport-webusb@^5.22.0":
+ version "5.53.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.53.1.tgz#3df8c401417571e3bcacc378d8aca587214b05ae"
+ integrity sha512-A/f+xcrkIAZiJrvPpDvsrjxQX4cI2kbdiunQkwsYmOG3Bp4z89ZnsBiC7YBst4n2/g+QgTg0/KPVtODU5djooQ==
+ dependencies:
+ "@ledgerhq/devices" "^5.51.1"
+ "@ledgerhq/errors" "^5.50.0"
+ "@ledgerhq/hw-transport" "^5.51.1"
+ "@ledgerhq/logs" "^5.50.0"
+
+"@ledgerhq/hw-transport@^5.51.1":
+ version "5.51.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578"
+ integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==
+ dependencies:
+ "@ledgerhq/devices" "^5.51.1"
+ "@ledgerhq/errors" "^5.50.0"
+ events "^3.3.0"
+
+"@ledgerhq/logs@^5.50.0":
+ version "5.50.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186"
+ integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==
+
+"@microsoft/fetch-event-source@2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d"
+ integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==
+
+"@multiformats/base-x@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121"
+ integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==
+
+"@nodefactory/filsnap-adapter@^0.2.1":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@nodefactory/filsnap-adapter/-/filsnap-adapter-0.2.2.tgz#0e182150ce3825b6c26b8512ab9355ab7759b498"
+ integrity sha512-nbaYMwVopOXN2bWOdDY3il6gGL9qMuCmMN4WPuoxzJjSnAMJNqEeSe6MNNJ/fYBLipZcJfAtirNXRrFLFN+Tvw==
+
+"@nodefactory/filsnap-types@^0.2.1":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@nodefactory/filsnap-types/-/filsnap-types-0.2.2.tgz#f95cbf93ce5815d8d151c60663940086b015cb8f"
+ integrity sha512-XT1tE2vrYF2D0tSNNekgjqKRpqPQn4W72eKul9dDCul/8ykouhqnVTyjFHYvBhlBWE0PK3nmG7i83QvhgGSiMw==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz#94c23db18ee4653e129abd26fb06f870ac9e1ee2"
+ integrity sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+ integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78=
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+ integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A=
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+ integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+ integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+ integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+ integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+ integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
+
+"@redux-saga/core@^1.0.0":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4"
+ integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==
+ dependencies:
+ "@babel/runtime" "^7.6.3"
+ "@redux-saga/deferred" "^1.1.2"
+ "@redux-saga/delay-p" "^1.1.2"
+ "@redux-saga/is" "^1.1.2"
+ "@redux-saga/symbols" "^1.1.2"
+ "@redux-saga/types" "^1.1.0"
+ redux "^4.0.4"
+ typescript-tuple "^2.2.1"
+
+"@redux-saga/deferred@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888"
+ integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==
+
+"@redux-saga/delay-p@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355"
+ integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==
+ dependencies:
+ "@redux-saga/symbols" "^1.1.2"
+
+"@redux-saga/is@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e"
+ integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==
+ dependencies:
+ "@redux-saga/symbols" "^1.1.2"
+ "@redux-saga/types" "^1.1.0"
+
+"@redux-saga/symbols@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d"
+ integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==
+
+"@redux-saga/types@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204"
+ integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==
+
+"@repeaterjs/repeater@^3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca"
+ integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@textile/buckets-grpc@2.6.5":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@textile/buckets-grpc/-/buckets-grpc-2.6.5.tgz#42ed152c19d65766c1da5046cd1532f6eeb873cb"
+ integrity sha512-jySQPKJvqeyeVJZIx4BUlgi3MHxKvVpyV1NtoZXserItLbNNPURaFuCeLi7ujAXjGWIcMMJMbcFfSsetDVvrOQ==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@types/google-protobuf" "^3.7.4"
+ google-protobuf "^3.13.0"
+
+"@textile/buckets@^6.0.5":
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/@textile/buckets/-/buckets-6.0.5.tgz#0d7c27a4545e4d4cc5ec59d7d422ea3f6a99c052"
+ integrity sha512-MJum/qLGPE13Ew0uhoNI4Wp2SdDCdmfp35JFEBHU4Uisna0PZ4lfOFXZVA/cVVgw5g94NOm1KS0FXQKu0x8prw==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@repeaterjs/repeater" "^3.0.4"
+ "@textile/buckets-grpc" "2.6.5"
+ "@textile/context" "^0.11.1"
+ "@textile/crypto" "^4.1.1"
+ "@textile/grpc-authentication" "^3.3.4"
+ "@textile/grpc-connection" "^2.4.1"
+ "@textile/grpc-transport" "^0.4.0"
+ "@textile/hub-grpc" "2.6.5"
+ "@textile/hub-threads-client" "^5.3.4"
+ "@textile/security" "^0.8.1"
+ "@textile/threads-id" "^0.5.1"
+ abort-controller "^3.0.0"
+ cids "^1.1.4"
+ it-drain "^1.0.3"
+ loglevel "^1.6.8"
+ paramap-it "^0.1.1"
+
+"@textile/context@^0.11.1":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@textile/context/-/context-0.11.1.tgz#216b72586dd559a42c00d93e3fb99fbc3b804a38"
+ integrity sha512-XP1cBT5OaJVt8LrTCzE/OffnmE4ImwDXiGG7kzU5gCRSx5ftafEwgOOjbQA3HRPl7nWW1YdBsiZf35xSM1KmoQ==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@textile/security" "^0.8.1"
+
+"@textile/crypto@^4.1.1":
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@textile/crypto/-/crypto-4.1.1.tgz#ab77117bbc66dc5842827ab37670a0d170bd7404"
+ integrity sha512-n/SxZyNvAD4FEyfX1HXtyNDcK+stUYur0vgwIoi5NzT6jP6gwhFVzf8NI3TBNIP2rInCAuF3Qks8hWS+LWL/YA==
+ dependencies:
+ "@types/ed2curve" "^0.2.2"
+ ed2curve "^0.3.0"
+ fastestsmallesttextencoderdecoder "^1.0.22"
+ multibase "^3.1.0"
+ tweetnacl "^1.0.3"
+
+"@textile/grpc-authentication@^3.3.4":
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/@textile/grpc-authentication/-/grpc-authentication-3.3.4.tgz#6b7a31fb1183fee3c338e167fa33dcf80e095a87"
+ integrity sha512-E7pw+MDNu7oWFWiTqDuLZncei+GIwnlSXlRlrRUXITZrf9vBiY+QHKkDrhLyhBpaLGazqB0PERzOFx8a0BYlbw==
+ dependencies:
+ "@textile/context" "^0.11.1"
+ "@textile/crypto" "^4.1.1"
+ "@textile/grpc-connection" "^2.4.1"
+ "@textile/hub-threads-client" "^5.3.4"
+ "@textile/security" "^0.8.1"
+
+"@textile/grpc-connection@^2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@textile/grpc-connection/-/grpc-connection-2.4.1.tgz#eacc2fe5e212d64d35aa7030d2313041b613ef81"
+ integrity sha512-8+y9PFcl9VBCludEpXvzputIis3lKYAzExdm8+zvtrr9uv0dCovIS0bu2GJoqU6DJkQSVBP9PA4V6T9THuQpjQ==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.12.0"
+ "@textile/context" "^0.11.1"
+ "@textile/grpc-transport" "^0.4.0"
+
+"@textile/grpc-powergate-client@^2.3.0":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/@textile/grpc-powergate-client/-/grpc-powergate-client-2.6.0.tgz#a835c454d920dd84444df51c4af39d17964331a2"
+ integrity sha512-5QkU3aClcuqsxPd9Ej2TTYjFUJhXzZzcZ/tSDlZ5jerFnRp09SaL4U+yjnBSe+Dc1k/jv6MUnfjte2vq3YX3Nw==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.14.0"
+ "@types/google-protobuf" "^3.15.2"
+ google-protobuf "^3.17.2"
+
+"@textile/grpc-transport@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@textile/grpc-transport/-/grpc-transport-0.4.0.tgz#96013613ceb8c961bd7b7b1c7764783ed8c932f4"
+ integrity sha512-OyHyv963Y0y1qlMkuIp7urWCKbCL0Tjn06ffFo+u82yy6G1YprjTQDE980dUGQMZfK1EF2/OTjqZb04PxHa5zQ==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@types/ws" "^7.2.6"
+ isomorphic-ws "^4.0.1"
+ loglevel "^1.6.6"
+ ws "^7.2.1"
+
+"@textile/hub-filecoin@^2.0.5":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@textile/hub-filecoin/-/hub-filecoin-2.0.5.tgz#c610a1c2fb3a6d81586e840bb7a7fb46cbebed44"
+ integrity sha512-5qwm3aMeR5q6KBbY1tVagUynMDw/Irh6jijgtlv66kQ+CbV4TgQjLsIH14UQkgcAW5hj1CMfqPIabLaBXFtDlA==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.12.0"
+ "@textile/context" "^0.11.1"
+ "@textile/crypto" "^4.1.1"
+ "@textile/grpc-authentication" "^3.3.4"
+ "@textile/grpc-connection" "^2.4.1"
+ "@textile/grpc-powergate-client" "^2.3.0"
+ "@textile/hub-grpc" "2.6.5"
+ "@textile/security" "^0.8.1"
+ event-iterator "^2.0.0"
+ loglevel "^1.6.8"
+
+"@textile/hub-grpc@2.6.5":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@textile/hub-grpc/-/hub-grpc-2.6.5.tgz#9ba6596a18bf66f0c0e830826b97ce673113759a"
+ integrity sha512-BFjhkBOQD1CebGjP4Hys/6Z5OlzepZTbC11kUSuLG6mt4rb2JiDNw25/UUzylsJCkpyAusob2sttJ9GUh/lv+g==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@types/google-protobuf" "^3.7.4"
+ google-protobuf "^3.13.0"
+
+"@textile/hub-threads-client@^5.3.4":
+ version "5.3.4"
+ resolved "https://registry.yarnpkg.com/@textile/hub-threads-client/-/hub-threads-client-5.3.4.tgz#ad94d35dd5da1271f6cd4ef06c04c8dd0828a02b"
+ integrity sha512-bKbpavWOg2bH9Zuf/aSmg7YOfKzx9yL7xmvPYo1FBaVcos8XeZvsN2gA80oFzTfm88e6xvotNNcRy7GktGDWIQ==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@textile/context" "^0.11.1"
+ "@textile/hub-grpc" "2.6.5"
+ "@textile/security" "^0.8.1"
+ "@textile/threads-client" "^2.1.2"
+ "@textile/threads-id" "^0.5.1"
+ "@textile/users-grpc" "2.6.5"
+ loglevel "^1.7.0"
+
+"@textile/hub@^6.0.2":
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/@textile/hub/-/hub-6.1.2.tgz#d200c5bb7e5d285e613f8c8a509291a5ebd21447"
+ integrity sha512-BnmF1539+/939BmmHt+X7TzSrDgD3vkP5tBHZKksjppJn6q+6BJOPYdmWapt6S9YOTQAoCcYkkcr+xUdN8z3mA==
+ dependencies:
+ "@textile/buckets" "^6.0.5"
+ "@textile/crypto" "^4.1.1"
+ "@textile/grpc-authentication" "^3.3.4"
+ "@textile/hub-filecoin" "^2.0.5"
+ "@textile/hub-grpc" "2.6.5"
+ "@textile/hub-threads-client" "^5.3.4"
+ "@textile/security" "^0.8.1"
+ "@textile/threads-id" "^0.5.1"
+ "@textile/users" "^6.0.4"
+ loglevel "^1.6.8"
+ multihashes "3.1.2"
+
+"@textile/multiaddr@^0.5.1":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@textile/multiaddr/-/multiaddr-0.5.1.tgz#a31c4a72ab2e246571ee8bd5d4fcdb2d350dd79d"
+ integrity sha512-i/lBZ9j+MgxqcjLl+4lbOCbw5dU3Vbn39aGKma8yBILLPbmCAWWUDGzk5+Rbcnk3giuPBM/nNhJLLSeKzK+rhA==
+ dependencies:
+ "@textile/threads-id" "^0.5.1"
+ multiaddr "^8.1.2"
+ varint "^6.0.0"
+
+"@textile/security@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@textile/security/-/security-0.8.1.tgz#4b8815eeedfd76ed95cd920fb361fbec50c560d1"
+ integrity sha512-FVoBRP7DAL+lh1+CyUQPE3ceG8HO3LMClTPYuNjW+2BAOR+KiKf5vFbeSpe29l6p+A9LF5/r2KWz7bN5cqCs8w==
+ dependencies:
+ "@consento/sync-randombytes" "^1.0.5"
+ fast-sha256 "^1.3.0"
+ fastestsmallesttextencoderdecoder "^1.0.22"
+ multibase "^3.1.0"
+
+"@textile/threads-client-grpc@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@textile/threads-client-grpc/-/threads-client-grpc-1.0.2.tgz#5d6ee09431eef2eb582f116bb3b48698e9fedc99"
+ integrity sha512-yrgdUb3VLGW18HKmbzAU8L7NElhnPYKWG9cHZG6EnV3ITS9zOiDydfVSNSkojEDfoFSel5x3eAUiOQbXUrkKng==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@types/google-protobuf" "^3.7.3"
+ google-protobuf "^3.13.0"
+
+"@textile/threads-client@^2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@textile/threads-client/-/threads-client-2.1.2.tgz#7c8be5c7f28108c61e8f29066f31a375975e518b"
+ integrity sha512-N4ItF3hxKmdC3oA1dAENw9uA7Q89q86/foYiNaXLPq5KJ1B3IYP3GdXjxe56wkT6dRRniCIREkRnqDdwVpRtQA==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@textile/context" "^0.11.1"
+ "@textile/crypto" "^4.1.1"
+ "@textile/grpc-transport" "^0.4.0"
+ "@textile/multiaddr" "^0.5.1"
+ "@textile/security" "^0.8.1"
+ "@textile/threads-client-grpc" "^1.0.2"
+ "@textile/threads-id" "^0.5.1"
+ "@types/to-json-schema" "^0.2.0"
+ fastestsmallesttextencoderdecoder "^1.0.22"
+ to-json-schema "^0.2.5"
+
+"@textile/threads-id@^0.5.1":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@textile/threads-id/-/threads-id-0.5.1.tgz#fa200244429c5e9a17630d1a23b28d2b958b5295"
+ integrity sha512-Nyvp24RsHarLBT3JxEI5akshcKKXA4Yx851bAooReE5G/40cijMuxTeVK4hDM0HdTex4PZRYozpPRXIDFDA96Q==
+ dependencies:
+ "@consento/sync-randombytes" "^1.0.4"
+ multibase "^3.1.0"
+ varint "^6.0.0"
+
+"@textile/users-grpc@2.6.5":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@textile/users-grpc/-/users-grpc-2.6.5.tgz#ab5fb1d9f6a8571ea81af8bb63f90207e6f2aa56"
+ integrity sha512-JMxkze3eyxyuxhbuMrqdbVTqp5wQmv1YoXAq1gJdAYYpcOX5S4ov6arI5NPy3weF3+KP3U+BX/HdR8dIvkFAcw==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@types/google-protobuf" "^3.7.4"
+ google-protobuf "^3.13.0"
+
+"@textile/users@^6.0.4":
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/@textile/users/-/users-6.0.4.tgz#93b6c0ef738fb6cabd00b42a6559087b4740b8ae"
+ integrity sha512-/aDwdcsvpW0QrUuXmRAAg41oGjGebwMUGK5czY0gcI/+Av6W8PicHJk4O9ft5ByfwXWzUMyz3ODWH45OYi0TVQ==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.13.0"
+ "@textile/buckets-grpc" "2.6.5"
+ "@textile/context" "^0.11.1"
+ "@textile/crypto" "^4.1.1"
+ "@textile/grpc-authentication" "^3.3.4"
+ "@textile/grpc-connection" "^2.4.1"
+ "@textile/grpc-transport" "^0.4.0"
+ "@textile/hub-grpc" "2.6.5"
+ "@textile/hub-threads-client" "^5.3.4"
+ "@textile/security" "^0.8.1"
+ "@textile/threads-id" "^0.5.1"
+ "@textile/users-grpc" "2.6.5"
+ event-iterator "^2.0.0"
+ loglevel "^1.7.0"
+
+"@truffle/abi-utils@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.2.2.tgz#2d1b92a2ffb7887ec5a0163cd5415aab552b34af"
+ integrity sha512-GRphTbgqrsz0B43t5gNGRlMNV/L3LUv9oZXWqw6+ySEiZo1l/p6AA8cPmHp9jbA/dHyqx4MKSQ94qTR2siy0Eg==
+ dependencies:
+ change-case "3.0.2"
+ faker "^5.3.1"
+ fast-check "^2.12.1"
+
+"@truffle/code-utils@^1.2.28":
+ version "1.2.28"
+ resolved "https://registry.yarnpkg.com/@truffle/code-utils/-/code-utils-1.2.28.tgz#8f7a3d25aa30857631c7acc8fb3b1df1865e9908"
+ integrity sha512-FUZNjAomB3nzeihzIU8aReVaYbrX2N7BKpe1CFJR7WK9SXi4KocZ3Y+hVcZyEoDfSDQpO4ElR5ydtYJQa5RUEQ==
+ dependencies:
+ cbor "^5.1.0"
+
+"@truffle/codec@^0.11.2":
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.11.2.tgz#2b32480991b561bcf625f7e8d41d1d869d80d99e"
+ integrity sha512-z3eNmTQ9Oq5W8f6UMyFmA4cTrp87Lvw7LCgBnH3v1trDT4+IiUQjf52bkyZBOVBGu7ngaw7myPRmJ1hwBySbOw==
+ dependencies:
+ big.js "^5.2.2"
+ bn.js "^5.1.3"
+ cbor "^5.1.0"
+ debug "^4.3.1"
+ lodash.clonedeep "^4.5.0"
+ lodash.escaperegexp "^4.1.2"
+ lodash.partition "^4.6.0"
+ lodash.sum "^4.0.2"
+ semver "^7.3.4"
+ utf8 "^3.0.0"
+ web3-utils "1.3.6"
+
+"@truffle/config@^1.2.43":
+ version "1.2.43"
+ resolved "https://registry.yarnpkg.com/@truffle/config/-/config-1.2.43.tgz#2d9f62c717db1ba869750ad95bacf3b37b5b5d42"
+ integrity sha512-EW1nnhiO7EScANURIvAp3KoyJzpIjcmKU+SvYTge56MyHQ5PwZGrhvcrrzorCRFX/UTnOPOppEhP0e6aeWcCGA==
+ dependencies:
+ "@truffle/error" "^0.0.14"
+ "@truffle/events" "^0.0.13"
+ "@truffle/provider" "^0.2.33"
+ configstore "^4.0.0"
+ find-up "^2.1.0"
+ lodash.assignin "^4.2.0"
+ lodash.merge "^4.6.2"
+ module "^1.2.5"
+ original-require "^1.0.1"
+
+"@truffle/db@^0.5.18":
+ version "0.5.18"
+ resolved "https://registry.yarnpkg.com/@truffle/db/-/db-0.5.18.tgz#eed7f9359884ef30ae63dacb31841b6e1fe08840"
+ integrity sha512-97JwchmNoe0AUe500wjbXW4yWyrcUpPtmCFQl7ACqEs4M5gUkn6NqRts0oP3BTGKlsgE+lLdoZqBvgrRDaFjtw==
+ dependencies:
+ "@truffle/abi-utils" "^0.2.2"
+ "@truffle/code-utils" "^1.2.28"
+ "@truffle/config" "^1.2.43"
+ apollo-server "^2.18.2"
+ debug "^4.3.1"
+ fs-extra "^9.1.0"
+ graphql "^15.3.0"
+ graphql-tag "^2.11.0"
+ graphql-tools "^6.2.4"
+ json-stable-stringify "^1.0.1"
+ jsondown "^1.0.0"
+ pascal-case "^2.0.1"
+ pluralize "^8.0.0"
+ pouchdb "7.1.1"
+ pouchdb-adapter-memory "^7.1.1"
+ pouchdb-adapter-node-websql "^7.0.0"
+ pouchdb-debug "^7.1.1"
+ pouchdb-find "^7.0.0"
+ web3-utils "1.3.6"
+
+"@truffle/debugger@^9.1.3":
+ version "9.1.3"
+ resolved "https://registry.yarnpkg.com/@truffle/debugger/-/debugger-9.1.3.tgz#2ec20d4ecae2bf6ec0a05a206f94cb7a61b24730"
+ integrity sha512-6WIzRA8XVZHcxHfSXVNnTB87A7oxMV4k7dzffAEYur2vRuAu9ozQGpQn06im86afgZZiS+GvdM5DyzrXwC/gww==
+ dependencies:
+ "@truffle/abi-utils" "^0.2.2"
+ "@truffle/codec" "^0.11.2"
+ "@truffle/source-map-utils" "^1.3.46"
+ bn.js "^5.1.3"
+ debug "^4.3.1"
+ json-pointer "^0.6.0"
+ json-stable-stringify "^1.0.1"
+ lodash.flatten "^4.4.0"
+ lodash.merge "^4.6.2"
+ lodash.sum "^4.0.2"
+ lodash.zipwith "^4.2.0"
+ redux "^3.7.2"
+ redux-cli-logger "^2.0.1"
+ redux-saga "1.0.0"
+ remote-redux-devtools "^0.5.12"
+ reselect-tree "^1.3.4"
+ semver "^7.3.4"
+ web3 "1.3.6"
+ web3-eth-abi "1.3.6"
+
+"@truffle/error@^0.0.14":
+ version "0.0.14"
+ resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05"
+ integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==
+
+"@truffle/events@^0.0.13":
+ version "0.0.13"
+ resolved "https://registry.yarnpkg.com/@truffle/events/-/events-0.0.13.tgz#932dcb8ada53934ca222918adbefdc5f73d35988"
+ integrity sha512-y2Odd8OV7GqEqPhP2sD4tSocBYXCgx0kfyYNl7ltpkK1E2Z3yknh453GeA0yzrIbcFQAAYfU4OIhE4RIUt5ISA==
+ dependencies:
+ emittery "^0.4.1"
+ ora "^3.4.0"
+
+"@truffle/hdwallet-provider@^1.4.0":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-1.4.1.tgz#112fba16c703a32c03e1cf9fb9ebd458b66c28b0"
+ integrity sha512-mcImWO3oyFu+4Sxrvrer0ZghjiJyDpOzG+vWUYCeV6Nl1Q3sqxNDvJKyTFkXQzHeNOPTVCOenqxUAGWF8XwlCA==
+ dependencies:
+ "@trufflesuite/web3-provider-engine" "15.0.13-1"
+ any-promise "^1.3.0"
+ bindings "^1.5.0"
+ ethereum-cryptography "^0.1.3"
+ ethereum-protocol "^1.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.1.0"
+ ethereumjs-wallet "^1.0.1"
+
+"@truffle/interface-adapter@^0.5.1":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.1.tgz#14c16e59dab5babc3860e9ccaeb350ffa76a8cba"
+ integrity sha512-Uvd7em/9DKb0PAMSklvlvbfHNNm9CiXKxXJT5VUmV9SlAe+C/vbUIiuIv8lStdX1PdF4KkO/K5rBJDvmDmXOyw==
+ dependencies:
+ bn.js "^5.1.3"
+ ethers "^4.0.32"
+ web3 "1.3.6"
+
+"@truffle/preserve-fs@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@truffle/preserve-fs/-/preserve-fs-0.2.3.tgz#d60e2ec664ae36bb81ee6fc1820c5dc03d625863"
+ integrity sha512-wf/l8ACdNxSlPW3ikJGx2/cxT4piwMDbIvkKN7TTFqWEwHp9/+rXOYgQfrJj0v1PyKk/tRmh8ghR0Q21zhUonA==
+ dependencies:
+ "@truffle/preserve" "^0.2.3"
+
+"@truffle/preserve-to-buckets@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@truffle/preserve-to-buckets/-/preserve-to-buckets-0.2.3.tgz#11df5a60c54d2076388e49ed9988b1fd86d429ae"
+ integrity sha512-eGQDKsNYrXWuvSzwn14TwcbeUKm/M8CRTtVkp50DQZhCLrixTkXJhgqPBC+g96vjVPwMA5kSl4QIPeJWSnRztw==
+ dependencies:
+ "@textile/hub" "^6.0.2"
+ "@truffle/preserve" "^0.2.3"
+ cids "^1.1.5"
+ ipfs-http-client "^48.2.2"
+ isomorphic-ws "^4.0.1"
+ iter-tools "^7.0.2"
+ ws "^7.4.3"
+
+"@truffle/preserve-to-filecoin@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@truffle/preserve-to-filecoin/-/preserve-to-filecoin-0.2.3.tgz#e297c4b1121e61e16df4a66a7299f91d0ee014fb"
+ integrity sha512-Fx0zqszBgwgfSUxqhATCqF51tyTsaO7Z020swKl92D9qOu0W72gxvMtX0BxOxXKQKm+Agt9Qvd7ObzhV3p3THA==
+ dependencies:
+ "@truffle/preserve" "^0.2.3"
+ cids "^1.1.5"
+ delay "^5.0.0"
+ filecoin.js "^0.0.5-alpha"
+ node-fetch "^2.6.0"
+
+"@truffle/preserve-to-ipfs@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@truffle/preserve-to-ipfs/-/preserve-to-ipfs-0.2.3.tgz#7895f01ad426a4c5a92a8778d50346e8b10793c2"
+ integrity sha512-B6X0W6n1TUbnxt1DheuR8EXF8uEf/Cw9gIpudXhOuQ0z4xA0TKyJJTOluAPrFWbf5KuYs+XCZLnLqIf75rt/Ag==
+ dependencies:
+ "@truffle/preserve" "^0.2.3"
+ ipfs-http-client "^48.2.2"
+ iter-tools "^7.0.2"
+
+"@truffle/preserve@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@truffle/preserve/-/preserve-0.2.3.tgz#bb387a6e5e4af0c9c69e6fcf73dc53b33c1aeb1b"
+ integrity sha512-vtbq2SmZx3nsBYJH2sKOS9Y6yEflkue8yydeT6znfcIvLdG5nf1+PRFO6xqbuFsFkkqKRjSUl2oJHV0B2eWyrg==
+ dependencies:
+ spinnies "^0.5.1"
+
+"@truffle/provider@^0.2.33":
+ version "0.2.33"
+ resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.33.tgz#081517f9bef8209a7850d00f59f66d9d4931069f"
+ integrity sha512-JPntn4YyyqSm8h0pTgXqdNV1gEwiCWe99AE0GVUnkyHAwu2v39rRPIR7/jueIQWMzFyQITB1hHvRGh953ECNZQ==
+ dependencies:
+ "@truffle/error" "^0.0.14"
+ "@truffle/interface-adapter" "^0.5.1"
+ web3 "1.3.6"
+
+"@truffle/source-map-utils@^1.3.46":
+ version "1.3.46"
+ resolved "https://registry.yarnpkg.com/@truffle/source-map-utils/-/source-map-utils-1.3.46.tgz#958cc4e50c67cf6d0b580ce4bcaef8a9d1120457"
+ integrity sha512-IjYvKGsOxM4x63fDGEY2Hud9iIpheh67ZulBkaAdT8kTEWsHrobOFP2R3WtEpI3nmGuz3k4Y+GqoQeQV4H9MJA==
+ dependencies:
+ "@truffle/code-utils" "^1.2.28"
+ "@truffle/codec" "^0.11.2"
+ debug "^4.3.1"
+ json-pointer "^0.6.0"
+ node-interval-tree "^1.3.3"
+ web3-utils "1.3.6"
+
+"@trufflesuite/eth-json-rpc-filters@^4.1.2-1":
+ version "4.1.2-1"
+ resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-filters/-/eth-json-rpc-filters-4.1.2-1.tgz#61ab78c52e98a883e5cf086925b34a30297b1824"
+ integrity sha512-/MChvC5dw2ck9NU1cZmdovCz2VKbOeIyR4tcxDvA5sT+NaL0rA2/R5U0yI7zsbo1zD+pgqav77rQHTzpUdDNJQ==
+ dependencies:
+ "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-0"
+ await-semaphore "^0.1.3"
+ eth-query "^2.1.2"
+ json-rpc-engine "^5.1.3"
+ lodash.flatmap "^4.5.0"
+ safe-event-emitter "^1.0.1"
+
+"@trufflesuite/eth-json-rpc-infura@^4.0.3-0":
+ version "4.0.3-0"
+ resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-infura/-/eth-json-rpc-infura-4.0.3-0.tgz#6d22122937cf60ec9d21a02351c101fdc608c4fe"
+ integrity sha512-xaUanOmo0YLqRsL0SfXpFienhdw5bpQ1WEXxMTRi57az4lwpZBv4tFUDvcerdwJrxX9wQqNmgUgd1BrR01dumw==
+ dependencies:
+ "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1"
+ cross-fetch "^2.1.1"
+ eth-json-rpc-errors "^1.0.1"
+ json-rpc-engine "^5.1.3"
+
+"@trufflesuite/eth-json-rpc-middleware@^4.4.2-0", "@trufflesuite/eth-json-rpc-middleware@^4.4.2-1":
+ version "4.4.2-1"
+ resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.2-1.tgz#8c3638ed8a7ed89a1e5e71407de068a65bef0df2"
+ integrity sha512-iEy9H8ja7/8aYES5HfrepGBKU9n/Y4OabBJEklVd/zIBlhCCBAWBqkIZgXt11nBXO/rYAeKwYuE3puH3ByYnLA==
+ dependencies:
+ "@trufflesuite/eth-sig-util" "^1.4.2"
+ btoa "^1.2.1"
+ clone "^2.1.1"
+ eth-json-rpc-errors "^1.0.1"
+ eth-query "^2.1.2"
+ ethereumjs-block "^1.6.0"
+ ethereumjs-tx "^1.3.7"
+ ethereumjs-util "^5.1.2"
+ ethereumjs-vm "^2.6.0"
+ fetch-ponyfill "^4.0.0"
+ json-rpc-engine "^5.1.3"
+ json-stable-stringify "^1.0.1"
+ pify "^3.0.0"
+ safe-event-emitter "^1.0.1"
+
+"@trufflesuite/eth-sig-util@^1.4.2":
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@trufflesuite/eth-sig-util/-/eth-sig-util-1.4.2.tgz#b529e2f38ac08e652116f48981132a26242a4f08"
+ integrity sha512-+GyfN6b0LNW77hbQlH3ufZ/1eCON7mMrGym6tdYf7xiNw9Vv3jBO72bmmos1EId2NgBvPMhmYYm6DSLQFTmzrA==
+ dependencies:
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^5.1.1"
+
+"@trufflesuite/web3-provider-engine@15.0.13-1":
+ version "15.0.13-1"
+ resolved "https://registry.yarnpkg.com/@trufflesuite/web3-provider-engine/-/web3-provider-engine-15.0.13-1.tgz#f6a7f7131a2fdc4ab53976318ed13ce83e8e4bcb"
+ integrity sha512-6u3x/iIN5fyj8pib5QTUDmIOUiwAGhaqdSTXdqCu6v9zo2BEwdCqgEJd1uXDh3DBmPRDfiZ/ge8oUPy7LerpHg==
+ dependencies:
+ "@trufflesuite/eth-json-rpc-filters" "^4.1.2-1"
+ "@trufflesuite/eth-json-rpc-infura" "^4.0.3-0"
+ "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1"
+ "@trufflesuite/eth-sig-util" "^1.4.2"
+ async "^2.5.0"
+ backoff "^2.5.0"
+ clone "^2.0.0"
+ cross-fetch "^2.1.0"
+ eth-block-tracker "^4.4.2"
+ eth-json-rpc-errors "^2.0.2"
+ ethereumjs-block "^1.2.2"
+ ethereumjs-tx "^1.2.0"
+ ethereumjs-util "^5.1.5"
+ ethereumjs-vm "^2.3.4"
+ 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"
+
+"@types/accepts@*", "@types/accepts@^1.3.5":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+ integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/body-parser@*", "@types/body-parser@1.19.0":
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
+ integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/connect@*":
+ version "3.4.34"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901"
+ integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/content-disposition@*":
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96"
+ integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==
+
+"@types/cookies@*":
+ version "0.7.6"
+ resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504"
+ integrity sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==
+ dependencies:
+ "@types/connect" "*"
+ "@types/express" "*"
+ "@types/keygrip" "*"
+ "@types/node" "*"
+
+"@types/cors@2.8.10":
+ version "2.8.10"
+ resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4"
+ integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==
+
+"@types/ed2curve@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@types/ed2curve/-/ed2curve-0.2.2.tgz#8f8bc7e2c9a5895a941c63a4f7acd7a6a62a5b15"
+ integrity sha512-G1sTX5xo91ydevQPINbL2nfgVAj/s1ZiqZxC8OCWduwu+edoNGUm5JXtTkg9F3LsBZbRI46/0HES4CPUE2wc9g==
+ dependencies:
+ tweetnacl "^1.0.0"
+
+"@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.21":
+ version "4.17.22"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.22.tgz#e011c55de3f17ddf1161f790042a15c5a218744d"
+ integrity sha512-WdqmrUsRS4ootGha6tVwk/IVHM1iorU8tGehftQD2NWiPniw/sm7xdJOIlXLwqdInL9wBw/p7oO8vaYEF3NDmA==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@types/express@*", "@types/express@^4.17.12":
+ version "4.17.12"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.12.tgz#4bc1bf3cd0cfe6d3f6f2853648b40db7d54de350"
+ integrity sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/fs-capacitor@*":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e"
+ integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/google-protobuf@^3.15.2", "@types/google-protobuf@^3.7.3", "@types/google-protobuf@^3.7.4":
+ version "3.15.2"
+ resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.2.tgz#70753e948cabeb416d71299dc35c3f562a10fb0f"
+ integrity sha512-ubeqvw7sl6CdgeiIilsXB2jIFoD/D0F+/LIEp7xEBEXRNtDJcf05FRINybsJtL7GlkWOUVn6gJs2W9OF+xI6lg==
+
+"@types/http-assert@*":
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b"
+ integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==
+
+"@types/http-errors@*":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69"
+ integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==
+
+"@types/json-schema@*":
+ version "7.0.7"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
+ integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
+
+"@types/keygrip@*":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
+ integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==
+
+"@types/koa-compose@*":
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d"
+ integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==
+ dependencies:
+ "@types/koa" "*"
+
+"@types/koa@*":
+ version "2.13.3"
+ resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.3.tgz#5b44c0956d7f7bf41f74ccfb530fec60fbed45ca"
+ integrity sha512-TaujBV+Dhe/FvmSMZJtCFBms+bqQacgUebk/M2C2tq8iGmHE/DDf4DcW2Hc7NqusVZmy5xzrWOjtdPKNP+fTfw==
+ dependencies:
+ "@types/accepts" "*"
+ "@types/content-disposition" "*"
+ "@types/cookies" "*"
+ "@types/http-assert" "*"
+ "@types/http-errors" "*"
+ "@types/keygrip" "*"
+ "@types/koa-compose" "*"
+ "@types/node" "*"
+
+"@types/long@^4.0.0", "@types/long@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
+ integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
+
+"@types/mime@^1":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/node@*", "@types/node@>=13.7.0":
+ version "15.12.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.5.tgz#9a78318a45d75c9523d2396131bd3cca54b2d185"
+ integrity sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==
+
+"@types/node@10.12.18":
+ version "10.12.18"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67"
+ integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
+
+"@types/node@11.11.6":
+ version "11.11.6"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a"
+ integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
+
+"@types/node@^10.1.0":
+ version "10.17.60"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
+ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
+
+"@types/node@^12.12.6":
+ version "12.20.15"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.15.tgz#10ee6a6a3f971966fddfa3f6e89ef7a73ec622df"
+ integrity sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/qs@*":
+ version "6.9.6"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
+ integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
+
+"@types/range-parser@*":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
+ integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d"
+ integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==
+ dependencies:
+ "@types/node" "*"
+
+"@types/serve-static@*":
+ version "1.13.9"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e"
+ integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==
+ dependencies:
+ "@types/mime" "^1"
+ "@types/node" "*"
+
+"@types/to-json-schema@^0.2.0":
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@types/to-json-schema/-/to-json-schema-0.2.0.tgz#6c76736449942aa8a16a522fa2d3fcfd3bcb8d15"
+ integrity sha512-9fqRjNFSSxJ8dQrE4v8gThS5ftxdFj8Q0y8hAjaF+uN+saJRxLiJdtFaDd9sv3bhzwcB2oDJpT/1ZelHnexbLw==
+ dependencies:
+ "@types/json-schema" "*"
+
+"@types/websocket@1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a"
+ integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/ws@^7.0.0", "@types/ws@^7.2.6":
+ version "7.4.5"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.5.tgz#8ff0f7efcd8fea19f51f9dd66cb8b498d172a752"
+ integrity sha512-8mbDgtc8xpxDDem5Gwj76stBDJX35KQ3YBoayxlqUQcL5BZUthiqP/VQ4PQnLHqM4PmlbyO74t98eJpURO+gPA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/zen-observable@^0.8.0":
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71"
+ integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==
+
+"@wry/context@^0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.0.tgz#f903eceb89d238ef7e8168ed30f4511f92d83e06"
+ integrity sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q==
+ dependencies:
+ tslib "^2.1.0"
+
+"@wry/equality@^0.1.2":
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
+ integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==
+ dependencies:
+ tslib "^1.9.3"
+
+"@wry/equality@^0.5.0":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.1.tgz#b22e4e1674d7bf1439f8ccdccfd6a785f6de68b0"
+ integrity sha512-FZKbdpbcVcbDxQrKcaBClNsQaMg9nof1RKM7mReJe5DKUzM5u8S7T+PqwNqvib5O2j2xxF1R4p5O3+b6baTrbw==
+ dependencies:
+ tslib "^2.1.0"
+
+"@wry/trie@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463"
+ integrity sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug==
+ dependencies:
+ tslib "^2.1.0"
+
+"@zondax/filecoin-signing-tools@github:Digital-MOB-Filecoin/filecoin-signing-tools-js":
+ version "0.2.0"
+ resolved "https://codeload.github.com/Digital-MOB-Filecoin/filecoin-signing-tools-js/tar.gz/8f8e92157cac2556d35cab866779e9a8ea8a4e25"
+ dependencies:
+ axios "^0.20.0"
+ base32-decode "^1.0.0"
+ base32-encode "^1.1.1"
+ bip32 "^2.0.5"
+ bip39 "^3.0.2"
+ blakejs "^1.1.0"
+ bn.js "^5.1.2"
+ ipld-dag-cbor "^0.17.0"
+ leb128 "0.0.5"
+ secp256k1 "^4.0.1"
+
+"@zxing/text-encoding@0.9.0":
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b"
+ integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==
+
+abab@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+ integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+abort-controller@3.0.0, abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.0.0, abstract-leveldown@~6.0.1:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz#b4b6159343c74b0c5197b2817854782d8f748c4a"
+ integrity sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==
+ dependencies:
+ level-concat-iterator "~2.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+accepts@^1.3.5, accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+acorn-globals@^1.0.4:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf"
+ integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=
+ dependencies:
+ acorn "^2.1.0"
+
+acorn@4.X:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+ integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
+
+acorn@^2.1.0, acorn@^2.4.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
+ integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+any-promise@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
+any-signal@^2.0.0, any-signal@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102"
+ integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==
+ dependencies:
+ abort-controller "^3.0.0"
+ native-abort-controller "^1.0.3"
+
+anymatch@~3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+apollo-cache-control@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz#95f20c3e03e7994e0d1bd48c59aeaeb575ed0ce7"
+ integrity sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==
+ dependencies:
+ apollo-server-env "^3.1.0"
+ apollo-server-plugin-base "^0.13.0"
+
+apollo-datasource@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.9.0.tgz#b0b2913257a6103a5f4c03cb56d78a30e9d850db"
+ integrity sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==
+ dependencies:
+ apollo-server-caching "^0.7.0"
+ apollo-server-env "^3.1.0"
+
+apollo-graphql@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.3.tgz#1ca6f625322ae10a66f57a39642849a07a7a5dc9"
+ integrity sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A==
+ dependencies:
+ core-js-pure "^3.10.2"
+ lodash.sortby "^4.7.0"
+ sha.js "^2.4.11"
+
+apollo-link@1.2.14, apollo-link@^1.2.14:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
+ integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==
+ dependencies:
+ apollo-utilities "^1.3.0"
+ ts-invariant "^0.4.0"
+ tslib "^1.9.3"
+ zen-observable-ts "^0.8.21"
+
+apollo-reporting-protobuf@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz#ae9d967934d3d8ed816fc85a0d8068ef45c371b9"
+ integrity sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==
+ dependencies:
+ "@apollo/protobufjs" "1.2.2"
+
+apollo-server-caching@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz#e6d1e68e3bb571cba63a61f60b434fb771c6ff39"
+ integrity sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==
+ dependencies:
+ lru-cache "^6.0.0"
+
+apollo-server-core@^2.25.2:
+ version "2.25.2"
+ resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.25.2.tgz#ff65da5e512d9b5ca54c8e5e8c78ee28b5987247"
+ integrity sha512-lrohEjde2TmmDTO7FlOs8x5QQbAS0Sd3/t0TaK2TWaodfzi92QAvIsq321Mol6p6oEqmjm8POIDHW1EuJd7XMA==
+ dependencies:
+ "@apollographql/apollo-tools" "^0.5.0"
+ "@apollographql/graphql-playground-html" "1.6.27"
+ "@apollographql/graphql-upload-8-fork" "^8.1.3"
+ "@josephg/resolvable" "^1.0.0"
+ "@types/ws" "^7.0.0"
+ apollo-cache-control "^0.14.0"
+ apollo-datasource "^0.9.0"
+ apollo-graphql "^0.9.0"
+ apollo-reporting-protobuf "^0.8.0"
+ apollo-server-caching "^0.7.0"
+ apollo-server-env "^3.1.0"
+ apollo-server-errors "^2.5.0"
+ apollo-server-plugin-base "^0.13.0"
+ apollo-server-types "^0.9.0"
+ apollo-tracing "^0.15.0"
+ async-retry "^1.2.1"
+ fast-json-stable-stringify "^2.0.0"
+ graphql-extensions "^0.15.0"
+ graphql-tag "^2.11.0"
+ graphql-tools "^4.0.8"
+ loglevel "^1.6.7"
+ lru-cache "^6.0.0"
+ sha.js "^2.4.11"
+ subscriptions-transport-ws "^0.9.19"
+ uuid "^8.0.0"
+
+apollo-server-env@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.1.0.tgz#0733c2ef50aea596cc90cf40a53f6ea2ad402cd0"
+ integrity sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==
+ dependencies:
+ node-fetch "^2.6.1"
+ util.promisify "^1.0.0"
+
+apollo-server-errors@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz#5d1024117c7496a2979e3e34908b5685fe112b68"
+ integrity sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==
+
+apollo-server-express@^2.25.2:
+ version "2.25.2"
+ resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.25.2.tgz#58cd819694ff4c2dec6945a95c5dff6aa2719ef6"
+ integrity sha512-A2gF2e85vvDugPlajbhr0A14cDFDIGX0mteNOJ8P3Z3cIM0D4hwrWxJidI+SzobefDIyIHu1dynFedJVhV0euQ==
+ dependencies:
+ "@apollographql/graphql-playground-html" "1.6.27"
+ "@types/accepts" "^1.3.5"
+ "@types/body-parser" "1.19.0"
+ "@types/cors" "2.8.10"
+ "@types/express" "^4.17.12"
+ "@types/express-serve-static-core" "^4.17.21"
+ accepts "^1.3.5"
+ apollo-server-core "^2.25.2"
+ apollo-server-types "^0.9.0"
+ body-parser "^1.18.3"
+ cors "^2.8.5"
+ express "^4.17.1"
+ graphql-subscriptions "^1.0.0"
+ graphql-tools "^4.0.8"
+ parseurl "^1.3.2"
+ subscriptions-transport-ws "^0.9.19"
+ type-is "^1.6.16"
+
+apollo-server-plugin-base@^0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz#3f85751a420d3c4625355b6cb3fbdd2acbe71f13"
+ integrity sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==
+ dependencies:
+ apollo-server-types "^0.9.0"
+
+apollo-server-types@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.9.0.tgz#ccf550b33b07c48c72f104fbe2876232b404848b"
+ integrity sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==
+ dependencies:
+ apollo-reporting-protobuf "^0.8.0"
+ apollo-server-caching "^0.7.0"
+ apollo-server-env "^3.1.0"
+
+apollo-server@^2.18.2:
+ version "2.25.2"
+ resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.25.2.tgz#db45c3ef8d9116cee8f12218f06588db717fee9e"
+ integrity sha512-2Ekx9puU5DqviZk6Kw1hbqTun3lwOWUjhiBJf+UfifYmnqq0s9vAv6Ditw+DEXwphJQ4vGKVVgVIEw6f/9YfhQ==
+ dependencies:
+ apollo-server-core "^2.25.2"
+ apollo-server-express "^2.25.2"
+ express "^4.0.0"
+ graphql-subscriptions "^1.0.0"
+ graphql-tools "^4.0.8"
+ stoppable "^1.1.0"
+
+apollo-tracing@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.15.0.tgz#237fbbbf669aee4370b7e9081b685eabaa8ce84a"
+ integrity sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==
+ dependencies:
+ apollo-server-env "^3.1.0"
+ apollo-server-plugin-base "^0.13.0"
+
+apollo-upload-client@14.1.2:
+ version "14.1.2"
+ resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-14.1.2.tgz#7a72b000f1cd67eaf8f12b4bda2796d0898c0dae"
+ integrity sha512-ozaW+4tnVz1rpfwiQwG3RCdCcZ93RV/37ZQbRnObcQ9mjb+zur58sGDPVg9Ef3fiujLmiE/Fe9kdgvIMA3VOjA==
+ dependencies:
+ "@apollo/client" "^3.1.5"
+ "@babel/runtime" "^7.11.2"
+ extract-files "^9.0.0"
+
+apollo-utilities@^1.0.1, apollo-utilities@^1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf"
+ integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==
+ dependencies:
+ "@wry/equality" "^0.1.2"
+ fast-json-stable-stringify "^2.0.0"
+ ts-invariant "^0.4.0"
+ tslib "^1.10.0"
+
+app-module-path@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5"
+ integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU=
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argsarray@0.0.1, argsarray@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb"
+ integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs=
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+ integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=
+
+array.prototype.map@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.3.tgz#1609623618d3d84134a37d4a220030c2bd18420b"
+ integrity sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+ es-array-method-boxes-properly "^1.0.0"
+ is-string "^1.0.5"
+
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+
+asn1.js@^5.0.1, asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-args@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/assert-args/-/assert-args-1.2.1.tgz#404103a1452a32fe77898811e54e590a8a9373bd"
+ integrity sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70=
+ dependencies:
+ "101" "^1.2.0"
+ compound-subject "0.0.1"
+ debug "^2.2.0"
+ get-prototype-of "0.0.0"
+ is-capitalized "^1.0.0"
+ is-class "0.0.4"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+async-eventemitter@^0.2.2:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async-retry@^1.2.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55"
+ integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==
+ dependencies:
+ retry "0.12.0"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+available-typed-arrays@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9"
+ integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
+
+await-semaphore@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/await-semaphore/-/await-semaphore-0.1.3.tgz#2b88018cc8c28e06167ae1cdff02504f1f9688d3"
+ integrity sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+axios@^0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.20.0.tgz#057ba30f04884694993a8cd07fa394cff11c50bd"
+ integrity sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==
+ dependencies:
+ follow-redirects "^1.10.0"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-generator@6.26.1:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-polyfill-corejs2@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
+ integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==
+ dependencies:
+ "@babel/compat-data" "^7.13.11"
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b"
+ integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
+ core-js-compat "^3.14.0"
+
+babel-plugin-polyfill-regenerator@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077"
+ integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
+
+babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0:
+ version "7.0.0-beta.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf"
+ integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==
+
+babel-preset-fbjs@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c"
+ integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==
+ dependencies:
+ "@babel/plugin-proposal-class-properties" "^7.0.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.0.0"
+ "@babel/plugin-syntax-class-properties" "^7.0.0"
+ "@babel/plugin-syntax-flow" "^7.0.0"
+ "@babel/plugin-syntax-jsx" "^7.0.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
+ "@babel/plugin-transform-arrow-functions" "^7.0.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.0.0"
+ "@babel/plugin-transform-block-scoping" "^7.0.0"
+ "@babel/plugin-transform-classes" "^7.0.0"
+ "@babel/plugin-transform-computed-properties" "^7.0.0"
+ "@babel/plugin-transform-destructuring" "^7.0.0"
+ "@babel/plugin-transform-flow-strip-types" "^7.0.0"
+ "@babel/plugin-transform-for-of" "^7.0.0"
+ "@babel/plugin-transform-function-name" "^7.0.0"
+ "@babel/plugin-transform-literals" "^7.0.0"
+ "@babel/plugin-transform-member-expression-literals" "^7.0.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.0.0"
+ "@babel/plugin-transform-object-super" "^7.0.0"
+ "@babel/plugin-transform-parameters" "^7.0.0"
+ "@babel/plugin-transform-property-literals" "^7.0.0"
+ "@babel/plugin-transform-react-display-name" "^7.0.0"
+ "@babel/plugin-transform-react-jsx" "^7.0.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.0.0"
+ "@babel/plugin-transform-spread" "^7.0.0"
+ "@babel/plugin-transform-template-literals" "^7.0.0"
+ babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-traverse@6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@6.18.0, babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backo2@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+ integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base32-decode@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/base32-decode/-/base32-decode-1.0.0.tgz#2a821d6a664890c872f20aa9aca95a4b4b80e2a7"
+ integrity sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g==
+
+base32-encode@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-1.2.0.tgz#e150573a5e431af0a998e32bdfde7045725ca453"
+ integrity sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==
+ dependencies:
+ to-data-view "^1.1.0"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@=1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd"
+ integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+bignumber.js@^9.0.0, bignumber.js@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bindings@^1.3.0, bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bip32@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134"
+ integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==
+ dependencies:
+ "@types/node" "10.12.18"
+ bs58check "^2.1.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ tiny-secp256k1 "^1.1.3"
+ typeforce "^1.11.5"
+ wif "^2.0.6"
+
+bip39@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0"
+ integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==
+ dependencies:
+ "@types/node" "11.11.6"
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+
+bitcore-lib@^8.22.2, bitcore-lib@^8.25.10:
+ version "8.25.10"
+ resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-8.25.10.tgz#4bbb30932dec65cb76e4d1d793f55d7e4a75f071"
+ integrity sha512-MyHpSg7aFRHe359RA/gdkaQAal3NswYZTLEuu0tGX1RGWXAYN9i/24fsjPqVKj+z0ua+gzAT7aQs0KiKXWCgKA==
+ dependencies:
+ bech32 "=1.1.3"
+ bn.js "=4.11.8"
+ bs58 "^4.0.1"
+ buffer-compare "=1.1.1"
+ elliptic "^6.5.3"
+ inherits "=2.0.1"
+ lodash "^4.17.20"
+
+bitcore-mnemonic@^8.22.2:
+ version "8.25.10"
+ resolved "https://registry.yarnpkg.com/bitcore-mnemonic/-/bitcore-mnemonic-8.25.10.tgz#43d7b73d9705a11fceef62e37089ad487e917c26"
+ integrity sha512-FeXxO37BLV5JRvxPmVFB91zRHalavV8H4TdQGt1/hz0AkoPymIV68OkuB+TptpjeYgatcgKPoPvPhglJkTzFQQ==
+ dependencies:
+ bitcore-lib "^8.25.10"
+ unorm "^1.4.1"
+
+bl@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
+blakejs@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+ integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+blob-to-it@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.2.tgz#bc76550638ca13280dbd3f202422a6a132ffcc8d"
+ integrity sha512-yD8tikfTlUGEOSHExz4vDCIQFLaBPXIL0KcxGQt9RbwMVXBEh+jokdJyStvTXPgWrdKfwgk7RX8GPsgrYzsyng==
+ dependencies:
+ browser-readablestream-to-it "^1.0.2"
+
+bluebird@^3.5.0:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@=4.11.8:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0, body-parser@^1.18.3:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+borc@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19"
+ integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==
+ dependencies:
+ bignumber.js "^9.0.0"
+ buffer "^5.5.0"
+ commander "^2.15.0"
+ ieee754 "^1.1.13"
+ iso-url "~0.4.7"
+ json-text-sequence "~0.1.0"
+ readable-stream "^3.6.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-headers@^0.4.0, browser-headers@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02"
+ integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==
+
+browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.2.tgz#f6b8d18e7a35b0321359261a32aa2c70f46921c4"
+ integrity sha512-lv4M2Z6RKJpyJijJzBQL5MNssS7i8yedl+QkhnLCyPtgNGNSXv1KthzUnye9NlRAtBAI80X6S9i+vK09Rzjcvg==
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^4.16.6:
+ version "4.16.6"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
+ integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+ dependencies:
+ caniuse-lite "^1.0.30001219"
+ colorette "^1.2.2"
+ electron-to-chromium "^1.3.723"
+ escalade "^3.1.1"
+ node-releases "^1.1.71"
+
+bs58@^4.0.0, bs58@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+btoa-lite@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
+ integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc=
+
+btoa@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
+ integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
+
+buffer-compare@=1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.1.1.tgz#5be7be853af89198d1f4ddc090d1d66a48aef596"
+ integrity sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY=
+
+buffer-from@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+ integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==
+
+buffer-from@1.1.1, buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-pipe@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.3.tgz#242197681d4591e7feda213336af6c07a5ce2409"
+ integrity sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==
+ dependencies:
+ safe-buffer "^5.1.2"
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0, buffer@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+buffer@^6.0.1:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+busboy@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b"
+ integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==
+ dependencies:
+ dicer "0.3.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camel-case@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547"
+ integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==
+ dependencies:
+ pascal-case "^3.1.1"
+ tslib "^1.10.0"
+
+camel-case@4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
+ integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
+ dependencies:
+ pascal-case "^3.1.2"
+ tslib "^2.0.3"
+
+camel-case@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+ integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30001219:
+ version "1.0.30001240"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz#ec15d125b590602c8731545c5351ff054ad2d52f"
+ integrity sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+cbor@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c"
+ integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==
+ dependencies:
+ bignumber.js "^9.0.1"
+ nofilter "^1.0.4"
+
+chalk@1.1.3, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+change-case@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037"
+ integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==
+ dependencies:
+ camel-case "^3.0.0"
+ constant-case "^2.0.0"
+ dot-case "^2.1.0"
+ header-case "^1.0.0"
+ is-lower-case "^1.1.0"
+ is-upper-case "^1.1.0"
+ lower-case "^1.1.1"
+ lower-case-first "^1.0.0"
+ no-case "^2.3.2"
+ param-case "^2.1.0"
+ pascal-case "^2.0.0"
+ path-case "^2.1.0"
+ sentence-case "^2.1.0"
+ snake-case "^2.1.0"
+ swap-case "^1.1.0"
+ title-case "^2.1.0"
+ upper-case "^1.1.1"
+ upper-case-first "^1.1.0"
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+cheerio@0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35"
+ integrity sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=
+ dependencies:
+ css-select "~1.2.0"
+ dom-serializer "~0.1.0"
+ entities "~1.1.1"
+ htmlparser2 "~3.8.1"
+ lodash "^4.1.0"
+ optionalDependencies:
+ jsdom "^7.0.2"
+
+cheerio@1.0.0-rc.2:
+ version "1.0.0-rc.2"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
+ integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=
+ dependencies:
+ 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@3.4.2:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
+ integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.4.0"
+ optionalDependencies:
+ fsevents "~2.1.2"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cids@^1.0.0, cids@^1.1.4, cids@^1.1.5:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.7.tgz#06aee89b9b5d615a7def86f2308a72bb642b7c7e"
+ integrity sha512-dlh+K0hMwFAFFjWQ2ZzxOhgGVNVREPdmk8cqHFui2U4sOodcemLMxdE5Ujga4cDcDQhWfldEPThkfu6KWBt1eA==
+ dependencies:
+ multibase "^4.0.1"
+ multicodec "^3.0.1"
+ multihashes "^4.0.1"
+ uint8arrays "^2.1.3"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+circular-json@^0.5.9:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d"
+ integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-cursor@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.0.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939"
+ integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
+clone-buffer@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+ integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone-stats@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+ integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=
+
+clone@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+ integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=
+
+clone@^1.0.0, clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+
+clone@^2.0.0, clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-logger@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018"
+ integrity sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg=
+
+color-logger@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.6.tgz#e56245ef29822657110c7cb75a9cd786cb69ed1b"
+ integrity sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs=
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colorette@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+ integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+colors@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+commander@^2.15.0, commander@^2.20.3:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+ integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
+
+compound-subject@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/compound-subject/-/compound-subject-0.0.1.tgz#271554698a15ae608b1dfcafd30b7ba1ea892c4b"
+ integrity sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs=
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.1.tgz#f3b80acf9e1f48e3875c0688b41b6c31602eea1c"
+ integrity sha1-87gKz54fSOOHXAaItBtsMWAu6hw=
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+configstore@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7"
+ integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==
+ dependencies:
+ 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"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+constant-case@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46"
+ integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=
+ dependencies:
+ snake-case "^2.1.0"
+ upper-case "^1.1.1"
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@1.X, convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+core-js-compat@^3.14.0:
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.1.tgz#1afe233716d37ee021956ef097594071b2b585a7"
+ integrity sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww==
+ dependencies:
+ browserslist "^4.16.6"
+ semver "7.0.0"
+
+core-js-pure@^3.10.2:
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.1.tgz#8356f6576fa2aa8e54ca6fe02620968ff010eed7"
+ integrity sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA==
+
+core-js@^2.4.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1, cors@^2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c"
+ integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==
+ dependencies:
+ node-fetch "2.6.1"
+
+cross-fetch@3.1.4, cross-fetch@^3.0.4:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39"
+ integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==
+ dependencies:
+ node-fetch "2.6.1"
+
+cross-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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-random-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+ integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
+
+css-select@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-what@2.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+ integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
+css@2.X:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
+ integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
+ dependencies:
+ inherits "^2.0.3"
+ source-map "^0.6.1"
+ source-map-resolve "^0.5.2"
+ urix "^0.1.0"
+
+cssfilter@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae"
+ integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=
+
+cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0":
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+"cssstyle@>= 0.2.29 < 0.3.0":
+ version "0.2.37"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+ integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=
+ dependencies:
+ cssom "0.3.x"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+dataloader@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f"
+ integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==
+
+debug-fabulous@0.0.X:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763"
+ integrity sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=
+ dependencies:
+ debug "2.X"
+ lazy-debug-legacy "0.0.X"
+ object-assign "4.1.0"
+
+debug@2.6.9, debug@2.X, debug@^2.2.0, debug@^2.6.8:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
+ dependencies:
+ ms "2.0.0"
+
+debug@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^3.1.0, debug@^3.2.6:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
+ integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=
+ dependencies:
+ type-detect "0.1.1"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
+ dependencies:
+ clone "^1.0.2"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.0.1.tgz#1642eb18b535dfb2b6ac4d39fb10a9cbcfd13b09"
+ integrity sha512-BXohsvTedWOLkj2n/TY+yqVlrCWa2Zs8LSxh3uCAgFOru7/pjxKyZAexGa1j83BaKloER4PqUyQ9rGPJLt9bqA==
+ dependencies:
+ abstract-leveldown "~6.0.0"
+ inherits "^2.0.3"
+
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+delay@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d"
+ integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+delimit-stream@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b"
+ integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+deprecated-decorator@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37"
+ integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+detect-newline@2.X:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+ integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
+
+dicer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872"
+ integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==
+ dependencies:
+ streamsearch "0.1.2"
+
+diff@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+dns-over-http-resolver@^1.0.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9"
+ integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==
+ dependencies:
+ debug "^4.3.1"
+ native-fetch "^3.0.0"
+ receptacle "^1.3.2"
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+dom-serializer@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+ integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+ dependencies:
+ domelementtype "^1.3.0"
+ entities "^1.1.1"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
+ integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
+
+domhandler@2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
+ integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg=
+ dependencies:
+ domelementtype "1"
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5, domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee"
+ integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=
+ dependencies:
+ no-case "^2.2.0"
+
+dot-prop@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
+ integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==
+ dependencies:
+ is-obj "^1.0.0"
+
+double-ended-queue@2.1.0-0:
+ version "2.1.0-0"
+ resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+ integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+duplexify@^3.2.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ed2curve@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/ed2curve/-/ed2curve-0.3.0.tgz#322b575152a45305429d546b071823a93129a05d"
+ integrity sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==
+ dependencies:
+ tweetnacl "1.x.x"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-fetch@^1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.3.tgz#06cf363d7f64073ec00a37e9949ec9d29ce6b08a"
+ integrity sha512-1AVMaxrHXTTMqd7EK0MGWusdqNr07Rpj8Th6bG4at0oNgIi/1LBwa9CjT/0Zy+M0k/tSJPS04nFxHj0SXDVgVw==
+ dependencies:
+ encoding "^0.1.13"
+
+electron-to-chromium@^1.3.723:
+ version "1.3.760"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.760.tgz#cf19c9ae9ff23c0ac6bb289e3b71c09b7c3f8de1"
+ integrity sha512-XPKwjX6pHezJWB4FLVuSil9gGmU6XYl27ahUwEHODXF4KjCEB8RuIT05MkU1au2Tdye57o49yY0uCMK+bwUt+A==
+
+elliptic@6.5.3:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
+ integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
+ 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"
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emittery@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d"
+ integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
+encoding@^0.1.11, encoding@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+end-stream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/end-stream/-/end-stream-0.1.0.tgz#32003f3f438a2b0143168137f8fa6e9866c81ed5"
+ integrity sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU=
+ dependencies:
+ write-stream "~0.4.3"
+
+entities@1.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
+ integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=
+
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+err-code@^2.0.0, err-code@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
+ integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
+
+err-code@^3.0.0, err-code@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920"
+ integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0-next.1, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-array-method-boxes-properly@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
+ integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+
+es-get-iterator@^1.0.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7"
+ integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.0"
+ has-symbols "^1.0.1"
+ is-arguments "^1.1.0"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.5"
+ isarray "^2.0.5"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-denodeify@^0.1.1:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-denodeify/-/es6-denodeify-0.1.5.tgz#31d4d5fe9c5503e125460439310e16a2a3f39c1f"
+ integrity sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8=
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@1.0.3, escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escodegen@^1.6.1:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+ integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esdoc@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-1.1.0.tgz#07d40ebf791764cd537929c29111e20a857624f3"
+ integrity sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA==
+ dependencies:
+ babel-generator "6.26.1"
+ babel-traverse "6.26.0"
+ babylon "6.18.0"
+ cheerio "1.0.0-rc.2"
+ color-logger "0.0.6"
+ escape-html "1.0.3"
+ fs-extra "5.0.0"
+ ice-cap "0.0.4"
+ marked "0.3.19"
+ minimist "1.2.0"
+ taffydb "2.7.3"
+
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^4.4.2:
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626"
+ integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==
+ dependencies:
+ "@babel/plugin-transform-runtime" "^7.5.5"
+ "@babel/runtime" "^7.5.5"
+ eth-query "^2.1.0"
+ json-rpc-random-id "^1.0.1"
+ pify "^3.0.0"
+ safe-event-emitter "^1.0.1"
+
+eth-ens-namehash@2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-errors@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f"
+ integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg==
+ dependencies:
+ fast-safe-stringify "^2.0.6"
+
+eth-json-rpc-errors@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4"
+ integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA==
+ dependencies:
+ fast-safe-stringify "^2.0.6"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-rpc-errors@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10"
+ integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==
+ dependencies:
+ fast-safe-stringify "^2.0.6"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-protocol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz#b7d68142f4105e0ae7b5e178cf42f8d4dc4b93cf"
+ integrity sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==
+
+ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-block@~2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
+ integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
+
+ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^7.0.2:
+ version "7.0.10"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
+ integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
+ integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz#664a4bcacfc1291ca2703de066df1178938dba1c"
+ integrity sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^7.0.2"
+ randombytes "^2.0.6"
+ scrypt-js "^3.0.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@^4.0.32:
+ version "4.0.48"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.48.tgz#330c65b8133e112b0613156e57e92d9009d8fbbe"
+ integrity sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==
+ dependencies:
+ aes-js "3.0.0"
+ bn.js "^4.4.0"
+ elliptic "6.5.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"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-iterator@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-1.2.0.tgz#2e71dc6ca56f1cf8ebcb2b9be7fdfd10acabbb76"
+ integrity sha512-Daq7YUl0Mv1i4QEgzGQlz0jrx7hUFNyLGbiF+Ap7NCMCjDLCCnolyj6s0TAc6HmrBziO5rNVHsPwGMp7KdRPvw==
+
+event-iterator@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62"
+ integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+eventemitter3@^3.1.0, eventemitter3@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
+ integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
+
+events@^3.0.0, events@^3.2.0, events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=
+ dependencies:
+ fill-range "^2.1.0"
+
+express@^4.0.0, express@^4.14.0, express@^4.17.1:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend@^3.0.0, extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=
+ dependencies:
+ is-extglob "^1.0.0"
+
+extract-files@9.0.0, extract-files@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a"
+ integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+faker@^5.3.1:
+ version "5.5.3"
+ resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e"
+ integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==
+
+fast-check@^2.12.1:
+ version "2.17.0"
+ resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.17.0.tgz#9b9637684332be386219a5f73a4799874da7461c"
+ integrity sha512-fNNKkxNEJP+27QMcEzF6nbpOYoSZIS0p+TyB+xh/jXqRBxRhLkiZSREly4ruyV8uJi7nwH1YWAhi7OOK5TubRw==
+ dependencies:
+ pure-rand "^5.0.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-fifo@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.0.0.tgz#9bc72e6860347bb045a876d1c5c0af11e9b984e7"
+ integrity sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ==
+
+fast-future@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/fast-future/-/fast-future-1.0.2.tgz#8435a9aaa02d79248d17d704e76259301d99280a"
+ integrity sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=
+
+fast-glob@^3.1.1:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.6.tgz#434dd9529845176ea049acc9343e8282765c6e1a"
+ integrity sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fast-safe-stringify@^2.0.6:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
+ integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
+
+fast-sha256@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fast-sha256/-/fast-sha256-1.3.0.tgz#7916ba2054eeb255982608cccd0f6660c79b7ae6"
+ integrity sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==
+
+fastestsmallesttextencoderdecoder@^1.0.22:
+ version "1.0.22"
+ resolved "https://registry.yarnpkg.com/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz#59b47e7b965f45258629cc6c127bf783281c5e93"
+ integrity sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==
+
+fastq@^1.6.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858"
+ integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==
+ dependencies:
+ reusify "^1.0.4"
+
+fb-watchman@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+ integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ dependencies:
+ bser "2.1.1"
+
+fbjs-css-vars@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8"
+ integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==
+
+fbjs@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz#0907067fb3f57a78f45d95f1eacffcacd623c165"
+ integrity sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==
+ dependencies:
+ cross-fetch "^3.0.4"
+ fbjs-css-vars "^1.0.0"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.18"
+
+fetch-cookie@0.10.1:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.10.1.tgz#5ea88f3d36950543c87997c27ae2aeafb4b5c4d4"
+ integrity sha512-beB+VEd4cNeVG1PY+ee74+PkuCQnik78pgLi5Ah/7qdUfov8IctU0vLUbBT8/10Ma5GMBeI4wtxhGrEfKNYs2g==
+ dependencies:
+ tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+
+fetch-cookie@0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.7.0.tgz#a6fc137ad8363aa89125864c6451b86ecb7de802"
+ integrity sha512-Mm5pGlT3agW6t71xVM7vMZPIvI7T4FaTuFW4jari6dVzYHFDb3WZZsGpN22r/o3XMdkM0E7sPd1EGeyVbH2Tgg==
+ dependencies:
+ es6-denodeify "^0.1.1"
+ tough-cookie "^2.3.1"
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filecoin.js@^0.0.5-alpha:
+ version "0.0.5-alpha"
+ resolved "https://registry.yarnpkg.com/filecoin.js/-/filecoin.js-0.0.5-alpha.tgz#cf6f14ae0715e88c290aeacfe813ff48a69442cd"
+ integrity sha512-xPrB86vDnTPfmvtN/rJSrhl4M77694ruOgNXd0+5gP67mgmCDhStLCqcr+zHIDRgDpraf7rY+ELbwjXZcQNdpQ==
+ dependencies:
+ "@ledgerhq/hw-transport-webusb" "^5.22.0"
+ "@nodefactory/filsnap-adapter" "^0.2.1"
+ "@nodefactory/filsnap-types" "^0.2.1"
+ "@zondax/filecoin-signing-tools" "github:Digital-MOB-Filecoin/filecoin-signing-tools-js"
+ bignumber.js "^9.0.0"
+ bitcore-lib "^8.22.2"
+ bitcore-mnemonic "^8.22.2"
+ btoa-lite "^1.0.0"
+ events "^3.2.0"
+ isomorphic-ws "^4.0.1"
+ node-fetch "^2.6.0"
+ rpc-websockets "^5.3.1"
+ scrypt-async "^2.0.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.1"
+ websocket "^1.0.31"
+ ws "^7.3.1"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+ integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+ integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+first-chunk-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
+ integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+follow-redirects@^1.10.0, follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.4, foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+ integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682"
+ integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-capacitor@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c"
+ integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==
+
+fs-extra@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
+ integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.1, fs-extra@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ 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"
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-iterator@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82"
+ integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==
+
+get-params@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe"
+ integrity sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=
+
+get-prototype-of@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/get-prototype-of/-/get-prototype-of-0.0.0.tgz#98772bd10716d16deb4b322516c469efca28ac44"
+ integrity sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ=
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
+ dependencies:
+ is-glob "^2.0.0"
+
+glob-parent@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-parent@^5.1.2, glob-parent@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-stream@^5.3.2:
+ version "5.3.5"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
+ integrity sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=
+ dependencies:
+ extend "^3.0.0"
+ glob "^5.0.3"
+ glob-parent "^3.0.0"
+ micromatch "^2.3.7"
+ ordered-read-streams "^0.3.0"
+ through2 "^0.6.0"
+ to-absolute-glob "^0.1.1"
+ unique-stream "^2.0.2"
+
+glob@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ 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@^5.0.3:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.1.1, glob@^7.1.3:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+globalthis@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b"
+ integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@11.0.3:
+ version "11.0.3"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
+ integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
+google-protobuf@^3.13.0, google-protobuf@^3.17.2:
+ version "3.17.3"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.17.3.tgz#f87595073545a77946c8f0b67c302c5f7646d700"
+ integrity sha512-OVPzcSWIAJ+d5yiHyeaLrdufQtrvaBrF4JQg+z8ynTkbO3uFcujqXszTumqg1cGsAsjkWnI+M5B1xZ19yR4Wyg==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+graphql-extensions@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.15.0.tgz#3f291f9274876b0c289fa4061909a12678bd9817"
+ integrity sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==
+ dependencies:
+ "@apollographql/apollo-tools" "^0.5.0"
+ apollo-server-env "^3.1.0"
+ apollo-server-types "^0.9.0"
+
+graphql-subscriptions@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz#2142b2d729661ddf967b7388f7cf1dd4cf2e061d"
+ integrity sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==
+ dependencies:
+ iterall "^1.3.0"
+
+graphql-tag@^2.11.0, graphql-tag@^2.12.0:
+ version "2.12.5"
+ resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f"
+ integrity sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ==
+ dependencies:
+ tslib "^2.1.0"
+
+graphql-tools@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30"
+ integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==
+ dependencies:
+ apollo-link "^1.2.14"
+ apollo-utilities "^1.0.1"
+ deprecated-decorator "^0.1.6"
+ iterall "^1.1.3"
+ uuid "^3.1.0"
+
+graphql-tools@^6.2.4:
+ version "6.2.6"
+ resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-6.2.6.tgz#557c6d32797a02988f214bd596dec2abd12425dd"
+ integrity sha512-OyhSvK5ALVVD6bFiWjAqv2+lRyvjIRfb6Br5Tkjrv++rxnXDodPH/zhMbDGRw+W3SD5ioGEEz84yO48iPiN7jA==
+ dependencies:
+ "@graphql-tools/batch-delegate" "^6.2.6"
+ "@graphql-tools/code-file-loader" "^6.2.4"
+ "@graphql-tools/delegate" "^6.2.4"
+ "@graphql-tools/git-loader" "^6.2.4"
+ "@graphql-tools/github-loader" "^6.2.4"
+ "@graphql-tools/graphql-file-loader" "^6.2.4"
+ "@graphql-tools/graphql-tag-pluck" "^6.2.4"
+ "@graphql-tools/import" "^6.2.4"
+ "@graphql-tools/json-file-loader" "^6.2.4"
+ "@graphql-tools/links" "^6.2.4"
+ "@graphql-tools/load" "^6.2.4"
+ "@graphql-tools/load-files" "^6.2.4"
+ "@graphql-tools/merge" "^6.2.4"
+ "@graphql-tools/mock" "^6.2.4"
+ "@graphql-tools/module-loader" "^6.2.4"
+ "@graphql-tools/relay-operation-optimizer" "^6.2.4"
+ "@graphql-tools/resolvers-composition" "^6.2.4"
+ "@graphql-tools/schema" "^6.2.4"
+ "@graphql-tools/stitch" "^6.2.4"
+ "@graphql-tools/url-loader" "^6.2.4"
+ "@graphql-tools/utils" "^6.2.4"
+ "@graphql-tools/wrap" "^6.2.4"
+ tslib "~2.0.1"
+
+graphql-ws@^4.4.1:
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-4.9.0.tgz#5cfd8bb490b35e86583d8322f5d5d099c26e365c"
+ integrity sha512-sHkK9+lUm20/BGawNEWNtVAeJzhZeBg21VmvmLoT5NdGVeZWv5PdIhkcayQIAgjSyyQ17WMKmbDijIPG2On+Ag==
+
+graphql@^15.3.0:
+ version "15.5.1"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.1.tgz#f2f84415d8985e7b84731e7f3536f8bb9d383aad"
+ integrity sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+gulp-sourcemaps@^1.5.2:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz#b437d1f3d980cf26e81184823718ce15ae6597b6"
+ integrity sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=
+ dependencies:
+ "@gulp-sourcemaps/map-sources" "1.X"
+ acorn "4.X"
+ convert-source-map "1.X"
+ css "2.X"
+ debug-fabulous "0.0.X"
+ detect-newline "2.X"
+ graceful-fs "4.X"
+ source-map "~0.6.0"
+ strip-bom "2.X"
+ through2 "2.X"
+ vinyl "1.X"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+ integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+header-case@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d"
+ integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.3"
+
+hmac-drbg@^1.0.0, hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hoist-non-react-statics@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+htmlparser2@^3.9.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+htmlparser2@~3.8.1:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
+ integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg=
+ dependencies:
+ domelementtype "1"
+ domhandler "2.3"
+ domutils "1.5"
+ entities "1.0"
+ readable-stream "1.1"
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@^1.7.3:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507"
+ integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+ice-cap@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18"
+ integrity sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg=
+ dependencies:
+ cheerio "0.20.0"
+ color-logger "0.0.3"
+
+iconv-lite@0.4.24, iconv-lite@^0.4.4:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13, ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore-walk@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335"
+ integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^5.1.4:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+immediate@3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+ integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+
+immediate@3.3.0, immediate@^3.2.2, immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+immutable@~3.7.6:
+ version "3.7.6"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b"
+ integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks=
+
+import-from@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
+ integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
+ dependencies:
+ resolve-from "^5.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+inherits@=2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+ip-regex@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
+ integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+ipfs-core-types@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.2.1.tgz#460bf2116477ce621995468c962c685dbdc4ac6f"
+ integrity sha512-q93+93qSybku6woZaajE9mCrHeVoMzNtZ7S5m/zx0+xHRhnoLlg8QNnGGsb5/+uFQt/RiBArsIw/Q61K9Jwkzw==
+ dependencies:
+ cids "^1.1.5"
+ multiaddr "^8.0.0"
+ peer-id "^0.14.1"
+
+ipfs-core-utils@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.6.1.tgz#59d1ca9ff4a33bbf6497c4abe024573c3fd7d784"
+ integrity sha512-UFIklwE3CFcsNIhYFDuz0qB7E2QtdFauRfc76kskgiqhGWcjqqiDeND5zBCrAy0u8UMaDqAbFl02f/mIq1yKXw==
+ dependencies:
+ any-signal "^2.0.0"
+ blob-to-it "^1.0.1"
+ browser-readablestream-to-it "^1.0.1"
+ cids "^1.1.5"
+ err-code "^2.0.3"
+ ipfs-core-types "^0.2.1"
+ ipfs-utils "^5.0.0"
+ it-all "^1.0.4"
+ it-map "^1.0.4"
+ it-peekable "^1.0.1"
+ multiaddr "^8.0.0"
+ multiaddr-to-uri "^6.0.0"
+ parse-duration "^0.4.4"
+ timeout-abort-controller "^1.1.1"
+ uint8arrays "^1.1.0"
+
+ipfs-http-client@^48.2.2:
+ version "48.2.2"
+ resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.2.2.tgz#b570fb99866f94df1c394a6101a2eb750ff46599"
+ integrity sha512-f3ppfWe913SJLvunm0UgqdA1dxVZSGQJPaEVJtqgjxPa5x0fPDiBDdo60g2MgkW1W6bhF9RGlxvHHIE9sv/tdg==
+ dependencies:
+ any-signal "^2.0.0"
+ bignumber.js "^9.0.0"
+ cids "^1.1.5"
+ debug "^4.1.1"
+ form-data "^3.0.0"
+ ipfs-core-types "^0.2.1"
+ ipfs-core-utils "^0.6.1"
+ ipfs-utils "^5.0.0"
+ ipld-block "^0.11.0"
+ ipld-dag-cbor "^0.17.0"
+ ipld-dag-pb "^0.20.0"
+ ipld-raw "^6.0.0"
+ it-last "^1.0.4"
+ it-map "^1.0.4"
+ it-tar "^1.2.2"
+ it-to-stream "^0.1.2"
+ merge-options "^2.0.0"
+ multiaddr "^8.0.0"
+ multibase "^3.0.0"
+ multicodec "^2.0.1"
+ multihashes "^3.0.1"
+ nanoid "^3.1.12"
+ native-abort-controller "~0.0.3"
+ parse-duration "^0.4.4"
+ stream-to-it "^0.2.2"
+ uint8arrays "^1.1.0"
+
+ipfs-utils@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7"
+ integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg==
+ dependencies:
+ abort-controller "^3.0.0"
+ any-signal "^2.1.0"
+ buffer "^6.0.1"
+ electron-fetch "^1.7.2"
+ err-code "^2.0.0"
+ fs-extra "^9.0.1"
+ is-electron "^2.2.0"
+ iso-url "^1.0.0"
+ it-glob "0.0.10"
+ it-to-stream "^0.1.2"
+ merge-options "^2.0.0"
+ nanoid "^3.1.3"
+ native-abort-controller "0.0.3"
+ native-fetch "^2.0.0"
+ node-fetch "^2.6.0"
+ stream-to-it "^0.2.0"
+
+ipld-block@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e"
+ integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw==
+ dependencies:
+ cids "^1.0.0"
+
+ipld-dag-cbor@^0.17.0:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1"
+ integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw==
+ dependencies:
+ borc "^2.1.2"
+ cids "^1.0.0"
+ is-circular "^1.0.2"
+ multicodec "^3.0.1"
+ multihashing-async "^2.0.0"
+ uint8arrays "^2.1.3"
+
+ipld-dag-pb@^0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360"
+ integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg==
+ dependencies:
+ cids "^1.0.0"
+ class-is "^1.1.0"
+ multicodec "^2.0.0"
+ multihashing-async "^2.0.0"
+ protons "^2.0.0"
+ reset "^0.1.0"
+ run "^1.4.0"
+ stable "^0.1.8"
+ uint8arrays "^1.0.0"
+
+ipld-raw@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0"
+ integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg==
+ dependencies:
+ cids "^1.0.0"
+ multicodec "^2.0.0"
+ multihashing-async "^2.0.0"
+
+is-arguments@^1.0.4, is-arguments@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-capitalized@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-capitalized/-/is-capitalized-1.0.0.tgz#4c8464b4d91d3e4eeb44889dd2cd8f1b0ac4c136"
+ integrity sha1-TIRktNkdPk7rRIid0s2PGwrEwTY=
+
+is-circular@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c"
+ integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==
+
+is-class@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/is-class/-/is-class-0.0.4.tgz#e057451705bb34e39e3e33598c93a9837296b736"
+ integrity sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY=
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+ integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=
+
+is-electron@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0"
+ integrity sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q==
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+ integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-generator-function@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c"
+ integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==
+
+is-glob@4.0.1, is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-ip@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8"
+ integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==
+ dependencies:
+ ip-regex "^4.0.0"
+
+is-lower-case@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393"
+ integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=
+ dependencies:
+ lower-case "^1.1.0"
+
+is-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+ integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+ integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+ integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+ integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU=
+
+is-promise@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
+ integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
+
+is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-set@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e"
+ integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==
+ dependencies:
+ available-typed-arrays "^1.0.2"
+ call-bind "^1.0.2"
+ es-abstract "^1.18.0-next.2"
+ foreach "^2.0.5"
+ has-symbols "^1.0.1"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-upper-case@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f"
+ integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=
+ dependencies:
+ upper-case "^1.1.0"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-valid-glob@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
+ integrity sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+iso-constants@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4"
+ integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ==
+
+iso-random-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-2.0.0.tgz#3f0118166d5443148bbc134345fb100002ad0f1d"
+ integrity sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg==
+ dependencies:
+ events "^3.3.0"
+ readable-stream "^3.4.0"
+
+iso-url@^1.0.0:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.1.5.tgz#875a0f2bf33fa1fc200f8d89e3f49eee57a8f0d9"
+ integrity sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ==
+
+iso-url@~0.4.7:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385"
+ integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isomorphic-ws@4.0.1, isomorphic-ws@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
+ integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+it-all@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.5.tgz#e880510d7e73ebb79063a76296a2eb3cb77bbbdb"
+ integrity sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA==
+
+it-concat@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b"
+ integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA==
+ dependencies:
+ bl "^4.0.0"
+
+it-drain@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-1.0.4.tgz#15ee0e90fba4b5bc8cff1c61b8c59d4203293baa"
+ integrity sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ==
+
+it-glob@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8"
+ integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA==
+ dependencies:
+ fs-extra "^9.0.1"
+ minimatch "^3.0.4"
+
+it-last@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.5.tgz#5c711c7d58948bcbc8e0cb129af3a039ba2a585b"
+ integrity sha512-PV/2S4zg5g6dkVuKfgrQfN2rUN4wdTI1FzyAvU+i8RV96syut40pa2s9Dut5X7SkjwA3P0tOhLABLdnOJ0Y/4Q==
+
+it-map@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.5.tgz#2f6a9b8f0ba1ed1aeadabf86e00b38c73a1dc299"
+ integrity sha512-EElupuWhHVStUgUY+OfTJIS2MZed96lDrAXzJUuqiiqLnIKoBRqtX1ZG2oR0bGDsSppmz83MtzCeKLZ9TVAUxQ==
+
+it-peekable@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.2.tgz#3b2c7948b765f35b3bb07abbb9b2108c644e73c1"
+ integrity sha512-LRPLu94RLm+lxLZbChuc9iCXrKCOu1obWqxfaKhF00yIp30VGkl741b5P60U+rdBxuZD/Gt1bnmakernv7bVFg==
+
+it-reader@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f"
+ integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw==
+ dependencies:
+ bl "^4.0.0"
+
+it-tar@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf"
+ integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA==
+ dependencies:
+ bl "^4.0.0"
+ buffer "^5.4.3"
+ iso-constants "^0.1.2"
+ it-concat "^1.0.0"
+ it-reader "^2.0.0"
+ p-defer "^3.0.0"
+
+it-to-stream@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b"
+ integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ==
+ dependencies:
+ buffer "^5.6.0"
+ fast-fifo "^1.0.0"
+ get-iterator "^1.0.2"
+ p-defer "^3.0.0"
+ p-fifo "^1.0.0"
+ readable-stream "^3.6.0"
+
+iter-tools@^7.0.2:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/iter-tools/-/iter-tools-7.1.3.tgz#eeafa7cde16ae8ff3b67ce6890f5e2f745a65fe7"
+ integrity sha512-Pnd3FVHgKnDHrTVjggXLMq5O/P60fho5iL0a0kkdLcofxX8STHw6cgYZ4ZHQS3Zb4Hg/VeqeNUxDs4vlVwUL4A==
+ dependencies:
+ "@babel/runtime" "^7.12.1"
+
+iterall@^1.1.3, iterall@^1.2.1, iterall@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
+ integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
+
+iterate-iterator@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6"
+ integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==
+
+iterate-value@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57"
+ integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==
+ dependencies:
+ es-get-iterator "^1.0.2"
+ iterate-iterator "^1.0.1"
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.14.0:
+ version "3.14.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+ integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsan@^3.1.13:
+ version "3.1.13"
+ resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86"
+ integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsdom@^7.0.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e"
+ integrity sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=
+ dependencies:
+ abab "^1.0.0"
+ acorn "^2.4.0"
+ acorn-globals "^1.0.4"
+ cssom ">= 0.3.0 < 0.4.0"
+ cssstyle ">= 0.2.29 < 0.3.0"
+ escodegen "^1.6.1"
+ nwmatcher ">= 1.3.7 < 2.0.0"
+ parse5 "^1.5.1"
+ request "^2.55.0"
+ sax "^1.1.4"
+ symbol-tree ">= 3.1.0 < 4.0.0"
+ tough-cookie "^2.2.0"
+ webidl-conversions "^2.0.0"
+ whatwg-url-compat "~0.6.5"
+ xml-name-validator ">= 2.0.1 < 3.0.0"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-pointer@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.1.tgz#3c6caa6ac139e2599f5a1659d39852154015054d"
+ integrity sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q==
+ dependencies:
+ foreach "^2.0.4"
+
+json-rpc-engine@^5.1.3:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5"
+ integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==
+ dependencies:
+ eth-rpc-errors "^3.0.0"
+ safe-event-emitter "^1.0.1"
+
+json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+ integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json-text-sequence@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2"
+ integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I=
+ dependencies:
+ delimit-stream "0.1.0"
+
+json5@^2.1.2:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsondown@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jsondown/-/jsondown-1.0.0.tgz#c5cc5cda65f515d2376136a104b5f535534f26e3"
+ integrity sha512-p6XxPaq59aXwcdDQV3ISMA5xk+1z6fJuctcwwSdR9iQgbYOcIrnknNrhcMGG+0FaUfKHGkdDpQNaZrovfBoyOw==
+ dependencies:
+ memdown "1.4.1"
+ mkdirp "0.5.1"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keypair@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.3.tgz#4314109d94052a0acfd6b885695026ad29529c80"
+ integrity sha512-0wjZ2z/SfZZq01+3/8jYLd8aEShSa+aat1zyPGQY3IuKoEAp6DJGvu2zt6snELrQU9jbCkIlCyNOD7RdQbHhkQ==
+
+keypather@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614"
+ integrity sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ=
+ dependencies:
+ "101" "^1.0.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.0:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lazy-debug-legacy@0.0.X:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1"
+ integrity sha1-U3cWwHduTPeePtG2IfdljCkRsbE=
+
+lazystream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+ integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
+ dependencies:
+ readable-stream "^2.0.5"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+leb128@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/leb128/-/leb128-0.0.5.tgz#84524a86ef7799fb3933ce41345f6490e27ac948"
+ integrity sha512-elbNtfmu3GndZbesVF6+iQAfVjOXW9bM/aax9WwMlABZW+oK9sbAZEXoewaPHmL34sxa8kVwWsru8cNE/yn2gg==
+ dependencies:
+ bn.js "^5.0.0"
+ buffer-pipe "0.0.3"
+
+level-codec@9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247"
+ integrity sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==
+
+level-codec@9.0.2, level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
+ integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
+
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
+ integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
+level-js@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-js/-/level-js-4.0.2.tgz#fa51527fa38b87c4d111b0d0334de47fcda38f21"
+ integrity sha512-PeGjZsyMG4O89KHiez1zoMJxStnkM+oBIqgACjoo5PJqFiSUUm3GNod/KcbqN5ktyZa8jkG7I1T0P2u6HN9lIg==
+ dependencies:
+ abstract-leveldown "~6.0.1"
+ immediate "~3.2.3"
+ inherits "^2.0.3"
+ ltgt "^2.1.2"
+ typedarray-to-buffer "~3.1.5"
+
+level-packager@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
+level-write-stream@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-write-stream/-/level-write-stream-1.0.0.tgz#3f7fbb679a55137c0feb303dee766e12ee13c1dc"
+ integrity sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw=
+ dependencies:
+ end-stream "~0.1.0"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/level/-/level-5.0.1.tgz#8528cc1ee37ac413270129a1eab938c610be3ccb"
+ integrity sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg==
+ dependencies:
+ level-js "^4.0.0"
+ level-packager "^5.0.0"
+ leveldown "^5.0.0"
+ opencollective-postinstall "^2.0.0"
+
+leveldown@5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.0.2.tgz#c8edc2308c8abf893ffc81e66ab6536111cae92c"
+ integrity sha512-Ib6ygFYBleS8x2gh3C1AkVsdrUShqXpe6jSTnZ6sRycEXKhqVf+xOSkhgSnjidpPzyv0d95LJVFrYQ4NuXAqHA==
+ dependencies:
+ abstract-leveldown "~6.0.0"
+ fast-future "~1.0.2"
+ napi-macros "~1.8.1"
+ node-gyp-build "~3.8.0"
+
+leveldown@^5.0.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
+ integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ napi-macros "~2.0.0"
+ node-gyp-build "~4.1.0"
+
+levelup@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.0.2.tgz#bcb8d28d0a82ee97f1c6d00f20ea6d32c2803c5b"
+ integrity sha512-cx9PmLENwbGA3svWBEbeO2HazpOSOYSXH4VA+ahVpYyurvD+SDSfURl29VBY2qgyk+Vfy2dJd71SBRckj/EZVA==
+ dependencies:
+ deferred-leveldown "~5.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ xtend "~4.0.0"
+
+levelup@4.4.0, levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+libp2p-crypto@^0.19.0:
+ version "0.19.4"
+ resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.19.4.tgz#90603a1318e903fbf142db3124ff3b2a1ba07ec7"
+ integrity sha512-8iUwiNlU/sFEtXQpxaehmXUQ5Fw6r52H7NH0d8ZSb8nKBbO6r8y8ft6f1to8A81SrFOVd4/zsjEzokpedDvRgw==
+ dependencies:
+ err-code "^3.0.1"
+ is-typedarray "^1.0.0"
+ iso-random-stream "^2.0.0"
+ keypair "^1.0.1"
+ multibase "^4.0.3"
+ multicodec "^3.0.1"
+ multihashes "^4.0.2"
+ multihashing-async "^2.1.2"
+ node-forge "^0.10.0"
+ pem-jwk "^2.0.0"
+ protobufjs "^6.10.2"
+ secp256k1 "^4.0.0"
+ uint8arrays "^2.1.4"
+ ursa-optional "^0.10.1"
+
+linked-list@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf"
+ integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=
+
+load-json-file@^1.0.0, load-json-file@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash-es@^4.2.1:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+ integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash.assignin@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+ integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI=
+
+lodash.assigninwith@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.assigninwith/-/lodash.assigninwith-4.2.0.tgz#af02c98432ac86d93da695b4be801401971736af"
+ integrity sha1-rwLJhDKshtk9ppW0voAUAZcXNq8=
+
+lodash.clonedeep@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
+lodash.escaperegexp@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
+ integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
+
+lodash.flatmap@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e"
+ integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4=
+
+lodash.flatten@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+ integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
+
+lodash.isequal@^4.0.0, lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+
+lodash.keys@^4.0.0, lodash.keys@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205"
+ integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.omit@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60"
+ integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=
+
+lodash.partition@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.partition/-/lodash.partition-4.6.0.tgz#a38e46b73469e0420b0da1212e66d414be364ba4"
+ integrity sha1-o45GtzRp4EILDaEhLmbUFL42S6Q=
+
+lodash.rest@^4.0.0:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa"
+ integrity sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=
+
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+ integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+
+lodash.sum@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/lodash.sum/-/lodash.sum-4.0.2.tgz#ad90e397965d803d4f1ff7aa5b2d0197f3b4637b"
+ integrity sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s=
+
+lodash.template@4.2.4:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.2.4.tgz#d053c19e8e74e38d965bf4fb495d80f109e7f7a4"
+ integrity sha1-0FPBno50442WW/T7SV2A8Qnn96Q=
+ dependencies:
+ lodash._reinterpolate "~3.0.0"
+ lodash.assigninwith "^4.0.0"
+ lodash.keys "^4.0.0"
+ lodash.rest "^4.0.0"
+ lodash.templatesettings "^4.0.0"
+ lodash.tostring "^4.0.0"
+
+lodash.templatesettings@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
+ integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+
+lodash.tostring@^4.0.0:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/lodash.tostring/-/lodash.tostring-4.1.4.tgz#560c27d1f8eadde03c2cce198fef5c031d8298fb"
+ integrity sha1-Vgwn0fjq3eA8LM4Zj+9cAx2CmPs=
+
+lodash.without@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
+ integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
+
+lodash.xor@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6"
+ integrity sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=
+
+lodash.zipwith@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.zipwith/-/lodash.zipwith-4.2.0.tgz#afacf03fd2f384af29e263c3c6bda3b80e3f51fd"
+ integrity sha1-r6zwP9LzhK8p4mPDxr2juA4/Uf0=
+
+lodash@4.17.21, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.2.1:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+ dependencies:
+ chalk "^4.0.0"
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+ dependencies:
+ chalk "^2.0.1"
+
+loglevel@^1.6.6, loglevel@^1.6.7, loglevel@^1.6.8, loglevel@^1.7.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
+ integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
+
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+ integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lower-case-first@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1"
+ integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=
+ dependencies:
+ lower-case "^1.1.2"
+
+lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+ integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+ltgt@2.2.1, ltgt@^2.1.2, ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
+map-stream@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.6.tgz#d2ef4eb811a28644c7a8989985c69c2fdd496827"
+ integrity sha1-0u9OuBGihkTHqJiZhcacL91JaCc=
+
+marked@0.3.19:
+ version "0.3.19"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
+ integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==
+
+math-random@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
+ integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@1.4.1, memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-options@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3"
+ integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ==
+ dependencies:
+ is-plain-obj "^2.0.0"
+
+merge-stream@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+ integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=
+ dependencies:
+ readable-stream "^2.0.1"
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
+ integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
+ dependencies:
+ 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"
+
+meros@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948"
+ integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^2.3.7:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=
+ dependencies:
+ 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"
+
+micromatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@*, "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+minimist@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+ integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mocha@8.1.2:
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.2.tgz#d67fad13300e4f5cd48135a935ea566f96caf827"
+ integrity sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==
+ dependencies:
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.4.2"
+ debug "4.1.1"
+ diff "4.0.2"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.14.0"
+ log-symbols "4.0.0"
+ minimatch "3.0.4"
+ ms "2.1.2"
+ object.assign "4.1.0"
+ promise.allsettled "1.0.2"
+ serialize-javascript "4.0.0"
+ strip-json-comments "3.0.1"
+ supports-color "7.1.0"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.0.0"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.1"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+module@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/module/-/module-1.2.5.tgz#b503eb06cdc13473f56818426974cde7ec59bf15"
+ integrity sha1-tQPrBs3BNHP1aBhCaXTN5+xZvxU=
+ dependencies:
+ chalk "1.1.3"
+ concat-stream "1.5.1"
+ lodash.template "4.2.4"
+ map-stream "0.0.6"
+ tildify "1.2.0"
+ vinyl-fs "2.4.3"
+ yargs "4.6.0"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multiaddr-to-uri@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0"
+ integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A==
+ dependencies:
+ multiaddr "^8.0.0"
+
+multiaddr@^8.0.0, multiaddr@^8.1.2:
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f"
+ integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ==
+ dependencies:
+ cids "^1.0.0"
+ class-is "^1.1.0"
+ dns-over-http-resolver "^1.0.0"
+ err-code "^2.0.3"
+ is-ip "^3.1.0"
+ multibase "^3.0.0"
+ uint8arrays "^1.1.0"
+ varint "^5.0.0"
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@^3.0.0, multibase@^3.1.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f"
+ integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==
+ dependencies:
+ "@multiformats/base-x" "^4.0.1"
+ web-encoding "^1.0.6"
+
+multibase@^4.0.1, multibase@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.4.tgz#55ef53e6acce223c5a09341a8a3a3d973871a577"
+ integrity sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==
+ dependencies:
+ "@multiformats/base-x" "^4.0.1"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multicodec@^2.0.0, multicodec@^2.0.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d"
+ integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==
+ dependencies:
+ uint8arrays "1.1.0"
+ varint "^6.0.0"
+
+multicodec@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.1.0.tgz#bc96faee2118d1ff114a3ee9e870a030a3b65743"
+ integrity sha512-f6d4DhbQ9a8WiJ/wpbKgeJSeR0/juP/1wnjbKdZ0KAWDkC/z7Lb3xOegMUG+uTcfwSYf6j1eTvFf8HDgqPRGmQ==
+ dependencies:
+ uint8arrays "^2.1.5"
+ varint "^6.0.0"
+
+multihashes@3.1.2, multihashes@^3.0.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc"
+ integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ==
+ dependencies:
+ multibase "^3.1.0"
+ uint8arrays "^2.0.5"
+ varint "^6.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+multihashes@^4.0.1, multihashes@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.2.tgz#d76aeac3a302a1bed9fe1ec964fb7a22fa662283"
+ integrity sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==
+ dependencies:
+ multibase "^4.0.1"
+ uint8arrays "^2.1.3"
+ varint "^5.0.2"
+
+multihashing-async@^2.0.0, multihashing-async@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.2.tgz#9ed68f183bde70e0416b166bbc59a0c0623a0ede"
+ integrity sha512-FTPNnWWxwIK5dXXmTFhySSF8Fkdqf7vzqpV09+RWsmfUhrsL/b3Arg3+bRrBnXTtjxm3JRGI3wSAtQHL0QCxhQ==
+ dependencies:
+ blakejs "^1.1.0"
+ err-code "^3.0.0"
+ js-sha3 "^0.8.0"
+ multihashes "^4.0.1"
+ murmurhash3js-revisited "^3.0.0"
+ uint8arrays "^2.1.3"
+
+murmurhash3js-revisited@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869"
+ integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==
+
+nan@^2.12.1, nan@^2.13.2, nan@^2.14.2:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanoid@^2.0.0:
+ version "2.1.11"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
+ integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
+
+nanoid@^3.1.12, nanoid@^3.1.3:
+ version "3.1.23"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
+ integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
+
+napi-macros@~1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-1.8.2.tgz#299265c1d8aa401351ad0675107d751228c03eda"
+ integrity sha512-Tr0DNY4RzTaBG2W2m3l7ZtFuJChTH6VZhXVhkGGjF/4cZTt+i8GcM9ozD+30Lmr4mDoZ5Xx34t2o4GJqYWDGcg==
+
+napi-macros@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
+ integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==
+
+native-abort-controller@0.0.3, native-abort-controller@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8"
+ integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA==
+ dependencies:
+ globalthis "^1.0.1"
+
+native-abort-controller@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.3.tgz#35974a2e189c0d91399c8767a989a5bf058c1435"
+ integrity sha512-fd5LY5q06mHKZPD5FmMrn7Lkd2H018oBGKNOAdLpctBDEPFKsfJ1nX9ke+XRa8PEJJpjqrpQkGjq2IZ27QNmYA==
+
+native-fetch@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89"
+ integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ==
+ dependencies:
+ globalthis "^1.0.1"
+
+native-fetch@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb"
+ integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==
+
+needle@^2.2.1:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe"
+ integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==
+ dependencies:
+ debug "^3.2.6"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+no-case@^2.2.0, no-case@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+ integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+ dependencies:
+ lower-case "^1.1.1"
+
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
+ dependencies:
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.4.1.tgz#b2e38f1117b8acbedbe0524f041fb3177188255d"
+ integrity sha512-P9UbpFK87NyqBZzUuDBDz4f6Yiys8xm8j7ACDbi6usvFm6KItklQUKjeoqTrYS/S1k6I8oaOC2YLLDr/gg26Mw==
+
+node-fetch@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
+ integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
+
+node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-forge@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
+ integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+node-gyp-build@~3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.8.0.tgz#0f57efeb1971f404dfcbfab975c284de7c70f14a"
+ integrity sha512-bYbpIHyRqZ7sVWXxGpz8QIRug5JZc/hzZH4GbdT9HTZi6WmKCZ8GLvP8OZ9TTiIBvwPFKgtGrlWQSXDAvYdsPw==
+
+node-gyp-build@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
+ integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+node-interval-tree@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/node-interval-tree/-/node-interval-tree-1.3.3.tgz#15ffb904cde08270214acace8dc7653e89ae32b7"
+ integrity sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw==
+ dependencies:
+ shallowequal "^1.0.2"
+
+node-pre-gyp@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054"
+ integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==
+ dependencies:
+ 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"
+
+node-releases@^1.1.71:
+ version "1.1.73"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20"
+ integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==
+
+nofilter@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e"
+ integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==
+
+noop-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/noop-fn/-/noop-fn-1.0.0.tgz#5f33d47f13d2150df93e0cb036699e982f78ffbf"
+ integrity sha1-XzPUfxPSFQ35PgywNmmemC94/78=
+
+nopt@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
+ integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1, normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+npm-bundled@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1"
+ integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==
+ dependencies:
+ npm-normalize-package-bin "^1.0.1"
+
+npm-normalize-package-bin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
+ integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
+
+npm-packlist@^1.1.6:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
+ integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+ npm-normalize-package-bin "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+nullthrows@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"
+ integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+"nwmatcher@>= 1.3.7 < 2.0.0":
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e"
+ integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+ integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A=
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-inspect@^1.10.3:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-path@^0.11.4:
+ version "0.11.5"
+ resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a"
+ integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.0, object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+oboe@2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd"
+ integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
+ dependencies:
+ mimic-fn "^1.0.0"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+opencollective-postinstall@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
+ integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
+
+optimism@^0.16.0:
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d"
+ integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==
+ dependencies:
+ "@wry/context" "^0.6.0"
+ "@wry/trie" "^0.3.0"
+
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+ora@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
+ integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
+ dependencies:
+ chalk "^2.4.2"
+ cli-cursor "^2.1.0"
+ cli-spinners "^2.0.0"
+ log-symbols "^2.2.0"
+ strip-ansi "^5.2.0"
+ wcwidth "^1.0.1"
+
+ordered-read-streams@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
+ integrity sha1-cTfmmzKYuzQiR6G77jiByA4v14s=
+ dependencies:
+ is-stream "^1.0.1"
+ readable-stream "^2.0.1"
+
+original-require@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20"
+ integrity sha1-DxMEcVhM0zURxew4yNWSE/msXiA=
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-defer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83"
+ integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==
+
+p-fifo@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63"
+ integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==
+ dependencies:
+ fast-fifo "^1.0.0"
+ p-defer "^3.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@3.1.0, p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+param-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
+ dependencies:
+ no-case "^2.2.0"
+
+paramap-it@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/paramap-it/-/paramap-it-0.1.1.tgz#dad5963c003315c0993b84402a9c08f8c36e80d9"
+ integrity sha512-3uZmCAN3xCw7Am/4ikGzjjR59aNMJVXGSU7CjG2Z6DfOAdhnLdCOd0S0m1sTkN4ov9QhlE3/jkzyu953hq0uwQ==
+ dependencies:
+ event-iterator "^1.0.0"
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-duration@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c"
+ integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw=
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parse5@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+ integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=
+
+parse5@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+ integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==
+ dependencies:
+ "@types/node" "*"
+
+parseurl@^1.3.2, parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascal-case@^2.0.0, pascal-case@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e"
+ integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=
+ dependencies:
+ camel-case "^3.0.0"
+ upper-case-first "^1.1.0"
+
+pascal-case@^3.1.1, pascal-case@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
+ integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+path-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5"
+ integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=
+ dependencies:
+ no-case "^2.2.0"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+peer-id@^0.14.1:
+ version "0.14.8"
+ resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.14.8.tgz#667c6bedc8ab313c81376f6aca0baa2140266fab"
+ integrity sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig==
+ dependencies:
+ cids "^1.1.5"
+ class-is "^1.1.0"
+ libp2p-crypto "^0.19.0"
+ minimist "^1.2.5"
+ multihashes "^4.0.2"
+ protobufjs "^6.10.2"
+ uint8arrays "^2.0.5"
+
+pem-jwk@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085"
+ integrity sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA==
+ dependencies:
+ asn1.js "^5.0.1"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pkg-conf@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-1.1.3.tgz#378e56d6fd13e88bfb6f4a25df7a83faabddba5b"
+ integrity sha1-N45W1v0T6Iv7b0ol33qD+qvduls=
+ dependencies:
+ find-up "^1.0.0"
+ load-json-file "^1.1.0"
+ object-assign "^4.0.1"
+ symbol "^0.2.1"
+
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
+pouchdb-abstract-mapreduce@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.2.2.tgz#dd1b10a83f8d24361dce9aaaab054614b39f766f"
+ integrity sha512-7HWN/2yV2JkwMnGnlp84lGvFtnm0Q55NiBUdbBcaT810+clCGKvhssBCrXnmwShD1SXTwT83aszsgiSfW+SnBA==
+ dependencies:
+ pouchdb-binary-utils "7.2.2"
+ pouchdb-collate "7.2.2"
+ pouchdb-collections "7.2.2"
+ pouchdb-errors "7.2.2"
+ pouchdb-fetch "7.2.2"
+ pouchdb-mapreduce-utils "7.2.2"
+ pouchdb-md5 "7.2.2"
+ pouchdb-utils "7.2.2"
+
+pouchdb-adapter-leveldb-core@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.2.2.tgz#e0aa6a476e2607d7ae89f4a803c9fba6e6d05a8a"
+ integrity sha512-K9UGf1Ivwe87mjrMqN+1D07tO/DfU7ariVDrGffuOjvl+3BcvUF25IWrxsBObd4iPOYCH7NVQWRpojhBgxULtQ==
+ dependencies:
+ argsarray "0.0.1"
+ buffer-from "1.1.1"
+ double-ended-queue "2.1.0-0"
+ levelup "4.4.0"
+ pouchdb-adapter-utils "7.2.2"
+ pouchdb-binary-utils "7.2.2"
+ pouchdb-collections "7.2.2"
+ pouchdb-errors "7.2.2"
+ pouchdb-json "7.2.2"
+ pouchdb-md5 "7.2.2"
+ pouchdb-merge "7.2.2"
+ pouchdb-utils "7.2.2"
+ sublevel-pouchdb "7.2.2"
+ through2 "3.0.2"
+
+pouchdb-adapter-memory@^7.1.1:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-adapter-memory/-/pouchdb-adapter-memory-7.2.2.tgz#c0ec2e87928d516ca9d1b5badc7269df6f95e5ea"
+ integrity sha512-9o+zdItPEq7rIrxdkUxgsLNaZkDJAGEqqoYgeYdrHidOCZnlhxhX3g7/R/HcpDKC513iEPqJWDJQSfeT6nVKkw==
+ dependencies:
+ memdown "1.4.1"
+ pouchdb-adapter-leveldb-core "7.2.2"
+ pouchdb-utils "7.2.2"
+
+pouchdb-adapter-node-websql@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-7.0.0.tgz#64ad88dd45b23578e454bf3032a3a79f9d1e4008"
+ integrity sha512-fNaOMO8bvMrRTSfmH4RSLSpgnKahRcCA7Z0jg732PwRbGvvMdGbreZwvKPPD1fg2tm2ZwwiXWK2G3+oXyoqZYw==
+ dependencies:
+ pouchdb-adapter-websql-core "7.0.0"
+ pouchdb-utils "7.0.0"
+ websql "1.0.0"
+
+pouchdb-adapter-utils@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.0.0.tgz#1ac8d34481911e0e9a9bf51024610a2e7351dc80"
+ integrity sha512-UWKPC6jkz6mHUzZefrU7P5X8ZGvBC8LSNZ7BIp0hWvJE6c20cnpDwedTVDpZORcCbVJpDmFOHBYnOqEIblPtbA==
+ dependencies:
+ pouchdb-binary-utils "7.0.0"
+ pouchdb-collections "7.0.0"
+ pouchdb-errors "7.0.0"
+ pouchdb-md5 "7.0.0"
+ pouchdb-merge "7.0.0"
+ pouchdb-utils "7.0.0"
+
+pouchdb-adapter-utils@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.2.2.tgz#c64426447d9044ba31517a18500d6d2d28abd47d"
+ integrity sha512-2CzZkTyTyHZkr3ePiWFMTiD5+56lnembMjaTl8ohwegM0+hYhRyJux0biAZafVxgIL4gnCUC4w2xf6WVztzKdg==
+ dependencies:
+ pouchdb-binary-utils "7.2.2"
+ pouchdb-collections "7.2.2"
+ pouchdb-errors "7.2.2"
+ pouchdb-md5 "7.2.2"
+ pouchdb-merge "7.2.2"
+ pouchdb-utils "7.2.2"
+
+pouchdb-adapter-websql-core@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-adapter-websql-core/-/pouchdb-adapter-websql-core-7.0.0.tgz#27b3e404159538e515b2567baa7869f90caac16c"
+ integrity sha512-NyMaH0bl20SdJdOCzd+fwXo8JZ15a48/MAwMcIbXzsRHE4DjFNlRcWAcjUP6uN4Ezc+Gx+r2tkBBMf71mIz1Aw==
+ dependencies:
+ pouchdb-adapter-utils "7.0.0"
+ pouchdb-binary-utils "7.0.0"
+ pouchdb-collections "7.0.0"
+ pouchdb-errors "7.0.0"
+ pouchdb-json "7.0.0"
+ pouchdb-merge "7.0.0"
+ pouchdb-utils "7.0.0"
+
+pouchdb-binary-utils@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz#cb71a288b09572a231f6bab1b4aed201c4d219a7"
+ integrity sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==
+ dependencies:
+ buffer-from "1.1.0"
+
+pouchdb-binary-utils@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-binary-utils/-/pouchdb-binary-utils-7.2.2.tgz#0690b348052c543b1e67f032f47092ca82bcb10e"
+ integrity sha512-shacxlmyHbUrNfE6FGYpfyAJx7Q0m91lDdEAaPoKZM3SzAmbtB1i+OaDNtYFztXjJl16yeudkDb3xOeokVL3Qw==
+ dependencies:
+ buffer-from "1.1.1"
+
+pouchdb-collate@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-collate/-/pouchdb-collate-7.2.2.tgz#fc261f5ef837c437e3445fb0abc3f125d982c37c"
+ integrity sha512-/SMY9GGasslknivWlCVwXMRMnQ8myKHs4WryQ5535nq1Wj/ehpqWloMwxEQGvZE1Sda3LOm7/5HwLTcB8Our+w==
+
+pouchdb-collections@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz#fd1f632337dc6301b0ff8649732ca79204e41780"
+ integrity sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==
+
+pouchdb-collections@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-7.2.2.tgz#aeed77f33322429e3f59d59ea233b48ff0e68572"
+ integrity sha512-6O9zyAYlp3UdtfneiMYuOCWdUCQNo2bgdjvNsMSacQX+3g8WvIoFQCYJjZZCpTttQGb+MHeRMr8m2U95lhJTew==
+
+pouchdb-debug@^7.1.1:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/pouchdb-debug/-/pouchdb-debug-7.2.1.tgz#f5f869f6113c12ccb97cddf5b0a32b6e0e67e961"
+ integrity sha512-eP3ht/AKavLF2RjTzBM6S9gaI2/apcW6xvaKRQhEdOfiANqerFuksFqHCal3aikVQuDO+cB/cw+a4RyJn/glBw==
+ dependencies:
+ debug "3.1.0"
+
+pouchdb-errors@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz#4e2a5a8b82af20cbe5f9970ca90b7ec74563caa0"
+ integrity sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==
+ dependencies:
+ inherits "2.0.3"
+
+pouchdb-errors@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-errors/-/pouchdb-errors-7.2.2.tgz#80d811d65c766c9d20b755c6e6cc123f8c3c4792"
+ integrity sha512-6GQsiWc+7uPfgEHeavG+7wuzH3JZW29Dnrvz8eVbDFE50kVFxNDVm3EkYHskvo5isG7/IkOx7PV7RPTA3keG3g==
+ dependencies:
+ inherits "2.0.4"
+
+pouchdb-fetch@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-fetch/-/pouchdb-fetch-7.2.2.tgz#492791236d60c899d7e9973f9aca0d7b9cc02230"
+ integrity sha512-lUHmaG6U3zjdMkh8Vob9GvEiRGwJfXKE02aZfjiVQgew+9SLkuOxNw3y2q4d1B6mBd273y1k2Lm0IAziRNxQnA==
+ dependencies:
+ abort-controller "3.0.0"
+ fetch-cookie "0.10.1"
+ node-fetch "2.6.0"
+
+pouchdb-find@^7.0.0:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-find/-/pouchdb-find-7.2.2.tgz#1227afdd761812d508fe0794b3e904518a721089"
+ integrity sha512-BmFeFVQ0kHmDehvJxNZl9OmIztCjPlZlVSdpijuFbk/Fi1EFPU1BAv3kLC+6DhZuOqU/BCoaUBY9sn66pPY2ag==
+ dependencies:
+ pouchdb-abstract-mapreduce "7.2.2"
+ pouchdb-collate "7.2.2"
+ pouchdb-errors "7.2.2"
+ pouchdb-fetch "7.2.2"
+ pouchdb-md5 "7.2.2"
+ pouchdb-selector-core "7.2.2"
+ pouchdb-utils "7.2.2"
+
+pouchdb-json@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-json/-/pouchdb-json-7.0.0.tgz#d9860f66f27a359ac6e4b24da4f89b6909f37530"
+ integrity sha512-w0bNRu/7VmmCrFWMYAm62n30wvJJUT2SokyzeTyj3hRohj4GFwTRg1mSZ+iAmxgRKOFE8nzZstLG/WAB4Ymjew==
+ dependencies:
+ vuvuzela "1.0.3"
+
+pouchdb-json@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-json/-/pouchdb-json-7.2.2.tgz#b939be24b91a7322e9a24b8880a6e21514ec5e1f"
+ integrity sha512-3b2S2ynN+aoB7aCNyDZc/4c0IAdx/ir3nsHB+/RrKE9cM3QkQYbnnE3r/RvOD1Xvr6ji/KOCBie+Pz/6sxoaug==
+ dependencies:
+ vuvuzela "1.0.3"
+
+pouchdb-mapreduce-utils@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.2.2.tgz#13a46a3cc2a3f3b8e24861da26966904f2963146"
+ integrity sha512-rAllb73hIkU8rU2LJNbzlcj91KuulpwQu804/F6xF3fhZKC/4JQMClahk+N/+VATkpmLxp1zWmvmgdlwVU4HtQ==
+ dependencies:
+ argsarray "0.0.1"
+ inherits "2.0.4"
+ pouchdb-collections "7.2.2"
+ pouchdb-utils "7.2.2"
+
+pouchdb-md5@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz#935dc6bb507a5f3978fb653ca5790331bae67c96"
+ integrity sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==
+ dependencies:
+ pouchdb-binary-utils "7.0.0"
+ spark-md5 "3.0.0"
+
+pouchdb-md5@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-md5/-/pouchdb-md5-7.2.2.tgz#415401acc5a844112d765bd1fb4e5d9f38fb0838"
+ integrity sha512-c/RvLp2oSh8PLAWU5vFBnp6ejJABIdKqboZwRRUrWcfGDf+oyX8RgmJFlYlzMMOh4XQLUT1IoaDV8cwlsuryZw==
+ dependencies:
+ pouchdb-binary-utils "7.2.2"
+ spark-md5 "3.0.1"
+
+pouchdb-merge@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-merge/-/pouchdb-merge-7.0.0.tgz#9f476ce7e32aae56904ad770ae8a1dfe14b57547"
+ integrity sha512-tci5u6NpznQhGcPv4ho1h0miky9rs+ds/T9zQ9meQeDZbUojXNaX1Jxsb0uYEQQ+HMqdcQs3Akdl0/u0mgwPGg==
+
+pouchdb-merge@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-merge/-/pouchdb-merge-7.2.2.tgz#940d85a2b532d6a93a6cab4b250f5648511bcc16"
+ integrity sha512-6yzKJfjIchBaS7Tusuk8280WJdESzFfQ0sb4jeMUNnrqs4Cx3b0DIEOYTRRD9EJDM+je7D3AZZ4AT0tFw8gb4A==
+
+pouchdb-selector-core@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-selector-core/-/pouchdb-selector-core-7.2.2.tgz#264d7436a8c8ac3801f39960e79875ef7f3879a0"
+ integrity sha512-XYKCNv9oiNmSXV5+CgR9pkEkTFqxQGWplnVhO3W9P154H08lU0ZoNH02+uf+NjZ2kjse7Q1fxV4r401LEcGMMg==
+ dependencies:
+ pouchdb-collate "7.2.2"
+ pouchdb-utils "7.2.2"
+
+pouchdb-utils@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz#48bfced6665b8f5a2b2d2317e2aa57635ed1e88e"
+ integrity sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==
+ dependencies:
+ argsarray "0.0.1"
+ clone-buffer "1.0.0"
+ immediate "3.0.6"
+ inherits "2.0.3"
+ pouchdb-collections "7.0.0"
+ pouchdb-errors "7.0.0"
+ pouchdb-md5 "7.0.0"
+ uuid "3.2.1"
+
+pouchdb-utils@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb-utils/-/pouchdb-utils-7.2.2.tgz#c17c4788f1d052b0daf4ef8797bbc4aaa3945aa4"
+ integrity sha512-XmeM5ioB4KCfyB2MGZXu1Bb2xkElNwF1qG+zVFbQsKQij0zvepdOUfGuWvLRHxTOmt4muIuSOmWZObZa3NOgzQ==
+ dependencies:
+ argsarray "0.0.1"
+ clone-buffer "1.0.0"
+ immediate "3.3.0"
+ inherits "2.0.4"
+ pouchdb-collections "7.2.2"
+ pouchdb-errors "7.2.2"
+ pouchdb-md5 "7.2.2"
+ uuid "8.1.0"
+
+pouchdb@7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/pouchdb/-/pouchdb-7.1.1.tgz#f5f8dcd1fc440fb76651cb26f6fc5d97a39cd6ce"
+ integrity sha512-8bXWclixNJZqokvxGHRsG19zehSJiaZaz4dVYlhXhhUctz7gMcNTElHjPBzBdZlKKvt9aFDndmXN1VVE53Co8g==
+ dependencies:
+ argsarray "0.0.1"
+ buffer-from "1.1.0"
+ clone-buffer "1.0.0"
+ double-ended-queue "2.1.0-0"
+ fetch-cookie "0.7.0"
+ immediate "3.0.6"
+ inherits "2.0.3"
+ level "5.0.1"
+ level-codec "9.0.1"
+ level-write-stream "1.0.0"
+ leveldown "5.0.2"
+ levelup "4.0.2"
+ ltgt "2.2.1"
+ node-fetch "2.4.1"
+ readable-stream "1.0.33"
+ spark-md5 "3.0.0"
+ through2 "3.0.1"
+ uuid "3.2.1"
+ vuvuzela "1.0.3"
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+ integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+ integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+promise.allsettled@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9"
+ integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==
+ dependencies:
+ array.prototype.map "^1.0.1"
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
+ function-bind "^1.1.1"
+ iterate-value "^1.0.0"
+
+promise@^7.1.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.7.2:
+ version "15.7.2"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
+ integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.8.1"
+
+protobufjs@^6.10.2:
+ version "6.11.2"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b"
+ integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.1"
+ "@types/node" ">=13.7.0"
+ long "^4.0.0"
+
+protocol-buffers-schema@^3.3.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz#8388e768d383ac8cbea23e1280dfadb79f4122ad"
+ integrity sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==
+
+protons@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.1.tgz#bfee5123c100001dcf56ab8f71b1b36f2e8289f1"
+ integrity sha512-FlmPorLEeCEDPu+uIn0Qardgiy5XqVA4IyNTz9wb9c0e2U7BEXdRcIbx64r09o4Abtf+4B7mkTtMbsIXMxZzKw==
+ dependencies:
+ protocol-buffers-schema "^3.3.1"
+ signed-varint "^2.0.1"
+ uint8arrays "^2.1.3"
+ varint "^5.0.0"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+psl@^1.1.28, psl@^1.1.33:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+pure-rand@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.0.tgz#87f5bdabeadbd8904e316913a5c0b8caac517b37"
+ integrity sha512-lD2/y78q+7HqBx2SaT6OT4UcwtvXNRfEpzYEzl0EQ+9gZq2Qi3fa0HDnYPeqQwhlHJFBUhT7AO3mLU3+8bynHA==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+querystring@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd"
+ integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+randomatic@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
+ integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-is@^16.7.0, react-is@^16.8.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@1.0.33:
+ version "1.0.33"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.33.tgz#3a360dd66c1b1d7fd4705389860eda1d0f61126c"
+ integrity sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@1.1:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
+ integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@1.1.14, readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.9, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@~0.0.2:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d"
+ integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=
+
+readable-stream@~2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+ integrity sha1-j5A0HmilPMySh4jaz80Rs265t44=
+ dependencies:
+ 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"
+
+readdirp@~3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
+ integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+receptacle@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2"
+ integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==
+ dependencies:
+ ms "^2.1.1"
+
+redux-cli-logger@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz#7e546502a4b08c7fac4fe2faee2326a6326cb4a1"
+ integrity sha512-75mVsggAJRSykWy2qxdGI7osocDWvc3RCMeN93hlvS/FxgdRww12NaXslez+W6gBOrSJKO7W16V0IzuISSfCxg==
+ dependencies:
+ colors "^1.1.2"
+
+redux-devtools-core@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz#4e43cbe590a1f18c13ee165d2d42e0bc77a164d8"
+ integrity sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==
+ dependencies:
+ get-params "^0.1.2"
+ jsan "^3.1.13"
+ lodash "^4.17.11"
+ nanoid "^2.0.0"
+ remotedev-serialize "^0.1.8"
+
+redux-devtools-instrument@^1.9.4:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz#036caf79fa1e5f25ec4bae38a9af4f08c69e323a"
+ integrity sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==
+ dependencies:
+ lodash "^4.17.19"
+ symbol-observable "^1.2.0"
+
+redux-saga@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.0.0.tgz#acb8b3ed9180fecbe75f342011d75af3ac11045b"
+ integrity sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==
+ dependencies:
+ "@redux-saga/core" "^1.0.0"
+
+redux@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
+ integrity sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==
+ dependencies:
+ lodash "^4.2.1"
+ lodash-es "^4.2.1"
+ loose-envify "^1.1.0"
+ symbol-observable "^1.0.3"
+
+redux@^4.0.4:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4"
+ integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+relay-compiler@10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-10.1.0.tgz#fb4672cdbe9b54869a3a79759edd8c2d91609cbe"
+ integrity sha512-HPqc3N3tNgEgUH5+lTr5lnLbgnsZMt+MRiyS0uAVNhuPY2It0X1ZJG+9qdA3L9IqKFUNwVn6zTO7RArjMZbARQ==
+ dependencies:
+ "@babel/core" "^7.0.0"
+ "@babel/generator" "^7.5.0"
+ "@babel/parser" "^7.0.0"
+ "@babel/runtime" "^7.0.0"
+ "@babel/traverse" "^7.0.0"
+ "@babel/types" "^7.0.0"
+ babel-preset-fbjs "^3.3.0"
+ chalk "^4.0.0"
+ fb-watchman "^2.0.0"
+ fbjs "^3.0.0"
+ glob "^7.1.1"
+ immutable "~3.7.6"
+ nullthrows "^1.1.1"
+ relay-runtime "10.1.0"
+ signedsource "^1.0.0"
+ yargs "^15.3.1"
+
+relay-runtime@10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-10.1.0.tgz#4753bf36e95e8d862cef33608e3d98b4ed730d16"
+ integrity sha512-bxznLnQ1ST6APN/cFi7l0FpjbZVchWQjjhj9mAuJBuUqNNCh9uV+UTRhpQF7Q8ycsPp19LHTpVyGhYb0ustuRQ==
+ dependencies:
+ "@babel/runtime" "^7.0.0"
+ fbjs "^3.0.0"
+
+remote-redux-devtools@^0.5.12:
+ version "0.5.16"
+ resolved "https://registry.yarnpkg.com/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz#95b1a4a1988147ca04f3368f3573b661748b3717"
+ integrity sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==
+ dependencies:
+ jsan "^3.1.13"
+ querystring "^0.2.0"
+ redux-devtools-core "^0.2.1"
+ redux-devtools-instrument "^1.9.4"
+ rn-host-detect "^1.1.5"
+ socketcluster-client "^14.2.1"
+
+remotedev-serialize@^0.1.8:
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz#5e67e05cbca75d408d769d057dc59d0f56cd2c43"
+ integrity sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==
+ dependencies:
+ jsan "^3.1.13"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+ integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=
+
+request@^2.55.0, request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+reselect-tree@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/reselect-tree/-/reselect-tree-1.3.4.tgz#449629728e2dc79bf0602571ec8859ac34737089"
+ integrity sha512-1OgNq1IStyJFqIqOoD3k3Ge4SsYCMP9W88VQOfvgyLniVKLfvbYO1Vrl92SyEK5021MkoBX6tWb381VxTDyPBQ==
+ dependencies:
+ debug "^3.1.0"
+ esdoc "^1.0.4"
+ json-pointer "^0.6.0"
+ reselect "^4.0.0"
+ source-map-support "^0.5.3"
+
+reselect@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
+ integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==
+
+reset@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb"
+ integrity sha1-n8cxQXGZWubLC35YsGznUir0uvs=
+
+resolve-from@5.0.0, resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.0, resolve@^1.14.2:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+retimer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca"
+ integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==
+
+retry@0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^2.2.8, rimraf@^2.6.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rn-host-detect@^1.1.5:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.2.0.tgz#8b0396fc05631ec60c1cb8789e5070cdb04d0da0"
+ integrity sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==
+
+rpc-websockets@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-5.3.1.tgz#678ca24315e4fe34a5f42ac7c2744764c056eb08"
+ integrity sha512-rIxEl1BbXRlIA9ON7EmY/2GUM7RLMy8zrUPTiLPFiYnYOz0I3PXfCmDDrge5vt4pW4oIcAXBDvgZuJ1jlY5+VA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ assert-args "^1.2.1"
+ babel-runtime "^6.26.0"
+ circular-json "^0.5.9"
+ eventemitter3 "^3.1.2"
+ uuid "^3.4.0"
+ ws "^5.2.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+run@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa"
+ integrity sha1-4X2ekEOrL+F3dsspnhI3848LT/o=
+ dependencies:
+ minimatch "*"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+rxjs@6:
+ version "6.6.7"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
+ integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+ dependencies:
+ tslib "^1.9.0"
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.1.4, sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+sc-channel@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.2.0.tgz#d9209f3a91e3fa694c66b011ce55c4ad8c3087d9"
+ integrity sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==
+ dependencies:
+ component-emitter "1.2.1"
+
+sc-errors@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-2.0.1.tgz#3af2d934dfd82116279a4b2c1552c1e021ddcb03"
+ integrity sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==
+
+sc-formatter@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz#9abdb14e71873ce7157714d3002477bbdb33c4e6"
+ integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==
+
+scrypt-async@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-async/-/scrypt-async-2.0.1.tgz#4318dae48a8b7cc3b8fe05f75f4164a7d973d25d"
+ integrity sha512-wHR032jldwZNy7Tzrfu7RccOgGf8r5hyDMSP2uV6DpLiBUsR8JsDcx/in73o2UGVVrH5ivRFdNsFPcjtl3LErQ==
+
+scrypt-js@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16"
+ integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==
+
+scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+secp256k1@^4.0.0, secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
+ integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
+
+semaphore@>=1.0.1, semaphore@^1.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.4, semver@^7.3.5:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+sentence-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4"
+ integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case-first "^1.1.2"
+
+serialize-javascript@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+ integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+setimmediate@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f"
+ integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shallowequal@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+ integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+signed-varint@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129"
+ integrity sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=
+ dependencies:
+ varint "~5.0.0"
+
+signedsource@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a"
+ integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snake-case@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f"
+ integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=
+ dependencies:
+ no-case "^2.2.0"
+
+socketcluster-client@^14.2.1:
+ version "14.3.2"
+ resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-14.3.2.tgz#c0d245233b114a4972857dc81049c710b7691fb7"
+ integrity sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==
+ dependencies:
+ buffer "^5.2.1"
+ clone "2.1.1"
+ component-emitter "1.2.1"
+ linked-list "0.1.0"
+ querystring "0.2.0"
+ sc-channel "^1.2.0"
+ sc-errors "^2.0.1"
+ sc-formatter "^3.0.1"
+ uuid "3.2.1"
+ ws "^7.5.0"
+
+source-map-resolve@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.5.3:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.0, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spark-md5@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.0.tgz#3722227c54e2faf24b1dc6d933cc144e6f71bfef"
+ integrity sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8=
+
+spark-md5@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d"
+ integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+spinnies@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/spinnies/-/spinnies-0.5.1.tgz#6ac88455d9117c7712d52898a02c969811819a7e"
+ integrity sha512-WpjSXv9NQz0nU3yCT9TFEOfpFrXADY9C5fG6eAJqixLhvTX1jP3w92Y8IE5oafIe42nlF9otjhllnXN/QCaB3A==
+ dependencies:
+ chalk "^2.4.2"
+ cli-cursor "^3.0.0"
+ strip-ansi "^5.2.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sqlite3@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.2.0.tgz#49026d665e9fc4f922e56fb9711ba5b4c85c4901"
+ integrity sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==
+ dependencies:
+ nan "^2.12.1"
+ node-pre-gyp "^0.11.0"
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stoppable@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b"
+ integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==
+
+stream-shift@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+ integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+
+stream-to-it@^0.2.0, stream-to-it@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.3.tgz#b9320ceb26a51b313de81036d4354d9b657f4d2d"
+ integrity sha512-xaK9EjPtLox5rrC7YLSBXSanTtUJN/lzJlMFvy9VaROmnyvy0U/X6m2uMhXPJRn3g3M9uOSIzTszW7BPiWSg9w==
+ dependencies:
+ get-iterator "^1.0.2"
+
+streamsearch@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+ integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-bom-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
+ integrity sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=
+ dependencies:
+ first-chunk-stream "^1.0.0"
+ strip-bom "^2.0.0"
+
+strip-bom@2.X, strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
+ integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+sublevel-pouchdb@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz#49e46cd37883bf7ff5006d7c5b9bcc7bcc1f422f"
+ integrity sha512-y5uYgwKDgXVyPZceTDGWsSFAhpSddY29l9PJbXqMJLfREdPmQTY8InpatohlEfCXX7s1LGcrfYAhxPFZaJOLnQ==
+ dependencies:
+ inherits "2.0.4"
+ level-codec "9.0.2"
+ ltgt "2.2.1"
+ readable-stream "1.1.14"
+
+subscriptions-transport-ws@^0.9.18, subscriptions-transport-ws@^0.9.19:
+ version "0.9.19"
+ resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf"
+ integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==
+ dependencies:
+ backo2 "^1.0.2"
+ eventemitter3 "^3.1.0"
+ iterall "^1.2.1"
+ symbol-observable "^1.0.4"
+ ws "^5.2.0 || ^6.0.0 || ^7.0.0"
+
+supports-color@7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swap-case@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3"
+ integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=
+ dependencies:
+ lower-case "^1.1.1"
+ upper-case "^1.1.1"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+ integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
+
+symbol-observable@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205"
+ integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
+
+"symbol-tree@>= 3.1.0 < 4.0.0":
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+symbol@^0.2.1:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.2.3.tgz#3b9873b8a901e47c6efe21526a3ac372ef28bbc7"
+ integrity sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c=
+
+sync-fetch@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/sync-fetch/-/sync-fetch-0.3.0.tgz#77246da949389310ad978ab26790bb05f88d1335"
+ integrity sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g==
+ dependencies:
+ buffer "^5.7.0"
+ node-fetch "^2.6.1"
+
+taffydb@2.7.3:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.3.tgz#2ad37169629498fca5bc84243096d3cde0ec3a34"
+ integrity sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=
+
+tar@^4, tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+through2-filter@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
+ integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=
+ dependencies:
+ through2 "~2.0.0"
+ xtend "~4.0.0"
+
+through2-filter@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
+ integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
+ dependencies:
+ through2 "~2.0.0"
+ xtend "~4.0.0"
+
+through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through2@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
+ integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
+ dependencies:
+ readable-stream "2 || 3"
+
+through2@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
+ integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "2 || 3"
+
+through2@^0.6.0:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+ integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
+ dependencies:
+ readable-stream ">=1.0.33-1 <1.1.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+tildify@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
+ integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
+ dependencies:
+ os-homedir "^1.0.0"
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+timeout-abort-controller@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29"
+ integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==
+ dependencies:
+ abort-controller "^3.0.0"
+ retimer "^2.0.0"
+
+tiny-queue@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
+ integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=
+
+tiny-secp256k1@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c"
+ integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==
+ dependencies:
+ bindings "^1.3.0"
+ bn.js "^4.11.8"
+ create-hmac "^1.1.7"
+ elliptic "^6.4.0"
+ nan "^2.13.2"
+
+title-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa"
+ integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.0.3"
+
+tmp@0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-absolute-glob@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
+ integrity sha1-HN+kcqnvUMI57maZm2YsoOs5k38=
+ dependencies:
+ extend-shallow "^2.0.1"
+
+to-data-view@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00"
+ integrity sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-json-schema@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/to-json-schema/-/to-json-schema-0.2.5.tgz#ef3c3f11ad64460dcfbdbafd0fd525d69d62a98f"
+ integrity sha512-jP1ievOee8pec3tV9ncxLSS48Bnw7DIybgy112rhMCEhf3K4uyVNZZHr03iQQBzbV5v5Hos+dlZRRyk6YSMNDw==
+ dependencies:
+ lodash.isequal "^4.5.0"
+ lodash.keys "^4.2.0"
+ lodash.merge "^4.6.2"
+ lodash.omit "^4.5.0"
+ lodash.without "^4.4.0"
+ lodash.xor "^4.5.0"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@^2.2.0, tough-cookie@^2.3.1, tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+ integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.1.2"
+
+tr46@~0.0.1:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+truffle@^5.3.6:
+ version "5.3.13"
+ resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.3.13.tgz#20098e9a2c2338c728151a7dc845aa21f43533ed"
+ integrity sha512-NawKbUhIz0QnTktyHXt/Ne5cSmCKjp0G61FWNaI7hgnAHGuK50doo2MxkccOj9Wy/e58N4CIXk37s1+6qbgb1Q==
+ dependencies:
+ "@truffle/debugger" "^9.1.3"
+ app-module-path "^2.2.0"
+ mocha "8.1.2"
+ original-require "^1.0.1"
+ optionalDependencies:
+ "@truffle/db" "^0.5.18"
+ "@truffle/preserve-fs" "^0.2.3"
+ "@truffle/preserve-to-buckets" "^0.2.3"
+ "@truffle/preserve-to-filecoin" "^0.2.3"
+ "@truffle/preserve-to-ipfs" "^0.2.3"
+
+ts-invariant@^0.4.0:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
+ integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==
+ dependencies:
+ tslib "^1.9.3"
+
+ts-invariant@^0.7.0:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.5.tgz#f9658719f9a7737b117d09820d952aacf6263f9c"
+ integrity sha512-qfVyqTYWEqADMtncLqwpUdMjMSXnsqOeqGtj1LeJNFDjz8oqZ1YxLEp29YCOq65z0LgEiERqQ8ThVjnfibJNpg==
+ dependencies:
+ tslib "^2.1.0"
+
+tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.0.3, tslib@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
+ integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
+tslib@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
+ integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
+
+tslib@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
+ integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
+
+tslib@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
+ integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@1.x.x, tweetnacl@^1.0.0, tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
+ integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI=
+
+type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typedarray-to-buffer@^3.1.5, typedarray-to-buffer@~3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@~0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typeforce@^1.11.5:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
+ integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==
+
+typescript-compare@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425"
+ integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==
+ dependencies:
+ typescript-logic "^0.0.0"
+
+typescript-logic@^0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196"
+ integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==
+
+typescript-tuple@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2"
+ integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==
+ dependencies:
+ typescript-compare "^0.0.2"
+
+ua-parser-js@^0.7.18:
+ version "0.7.28"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31"
+ integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==
+
+uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2"
+ integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==
+ dependencies:
+ multibase "^3.0.0"
+ web-encoding "^1.0.2"
+
+uint8arrays@^2.0.5, uint8arrays@^2.1.3, uint8arrays@^2.1.4, uint8arrays@^2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.5.tgz#9e6e6377a9463d5eba4620a3f0450f7eb389a351"
+ integrity sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==
+ dependencies:
+ multibase "^4.0.1"
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+unique-stream@^2.0.2:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
+ integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
+ dependencies:
+ json-stable-stringify-without-jsonify "^1.0.1"
+ through2-filter "^3.0.0"
+
+unique-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+ integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
+ dependencies:
+ crypto-random-string "^1.0.0"
+
+universalify@^0.1.0, universalify@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unixify@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090"
+ integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=
+ dependencies:
+ normalize-path "^2.1.1"
+
+unorm@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+upper-case-first@^1.1.0, upper-case-first@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115"
+ integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=
+ dependencies:
+ upper-case "^1.1.1"
+
+upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+ integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+ursa-optional@^0.10.1:
+ version "0.10.2"
+ resolved "https://registry.yarnpkg.com/ursa-optional/-/ursa-optional-0.10.2.tgz#bd74e7d60289c22ac2a69a3c8dea5eb2817f9681"
+ integrity sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.14.2"
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+util@^0.12.0, util@^0.12.3:
+ version "0.12.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253"
+ integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ safe-buffer "^5.1.2"
+ which-typed-array "^1.1.2"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac"
+ integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=
+
+uuid@3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+ integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d"
+ integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==
+
+uuid@^3.1.0, uuid@^3.3.2, uuid@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.0.0:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+vali-date@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
+ integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=
+
+valid-url@1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
+ integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+value-or-promise@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.6.tgz#218aa4794aa2ee24dcf48a29aba4413ed584747f"
+ integrity sha512-9r0wQsWD8z/BxPOvnwbPf05ZvFngXyouE9EKB+5GbYix+BYnAwrIChCUyFIinfbf2FL/U71z+CPpbnmTdxrwBg==
+
+varint@^5.0.0, varint@^5.0.2, varint@~5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+varint@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0"
+ integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vinyl-fs@2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.3.tgz#3d97e562ebfdd4b66921dea70626b84bde9d2d07"
+ integrity sha1-PZflYuv91LZpId6nBia4S96dLQc=
+ dependencies:
+ duplexify "^3.2.0"
+ glob-stream "^5.3.2"
+ graceful-fs "^4.0.0"
+ gulp-sourcemaps "^1.5.2"
+ is-valid-glob "^0.3.0"
+ lazystream "^1.0.0"
+ lodash.isequal "^4.0.0"
+ merge-stream "^1.0.0"
+ mkdirp "^0.5.0"
+ object-assign "^4.0.0"
+ readable-stream "^2.0.4"
+ strip-bom "^2.0.0"
+ strip-bom-stream "^1.0.0"
+ through2 "^2.0.0"
+ through2-filter "^2.0.0"
+ vali-date "^1.0.0"
+ vinyl "^1.0.0"
+
+vinyl@1.X, vinyl@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
+ integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=
+ dependencies:
+ clone "^1.0.0"
+ clone-stats "^0.0.1"
+ replace-ext "0.0.1"
+
+vuvuzela@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
+ integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws=
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ dependencies:
+ defaults "^1.0.3"
+
+web-encoding@^1.0.2, web-encoding@^1.0.6:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864"
+ integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==
+ dependencies:
+ util "^0.12.3"
+ optionalDependencies:
+ "@zxing/text-encoding" "0.9.0"
+
+web3-bzz@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.6.tgz#95f370aecc3ff6ad07f057e6c0c916ef09b04dde"
+ integrity sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.12.1"
+
+web3-core-helpers@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz#c478246a9abe4e5456acf42657dac2f7c330be74"
+ integrity sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==
+ dependencies:
+ underscore "1.12.1"
+ web3-eth-iban "1.3.6"
+ web3-utils "1.3.6"
+
+web3-core-method@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.6.tgz#4b0334edd94b03dfec729d113c69a4eb6ebc68ae"
+ integrity sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+ web3-core-promievent "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-utils "1.3.6"
+
+web3-core-promievent@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz#6c27dc79de8f71b74f5d17acaf9aaf593d3cb0c9"
+ integrity sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz#4fea269fe913fd4fca464b4f7c65cb94857b5b2a"
+ integrity sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==
+ dependencies:
+ underscore "1.12.1"
+ util "^0.12.0"
+ web3-core-helpers "1.3.6"
+ web3-providers-http "1.3.6"
+ web3-providers-ipc "1.3.6"
+ web3-providers-ws "1.3.6"
+
+web3-core-subscriptions@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz#ee24e7974d1d72ff6c992c599deba4ef9b308415"
+ integrity sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+
+web3-core@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.6.tgz#a6a761d1ff2f3ee462b8dab679229d2f8e267504"
+ integrity sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-requestmanager "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-abi@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz#4272ca48d817aa651bbf97b269f5ff10abc2b8a9"
+ integrity sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==
+ dependencies:
+ "@ethersproject/abi" "5.0.7"
+ underscore "1.12.1"
+ web3-utils "1.3.6"
+
+web3-eth-accounts@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz#f9fcb50b28ee58090ab292a10d996155caa2b474"
+ integrity sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.12.1"
+ uuid "3.3.2"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-contract@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz#cccf4d32dc56917fb6923e778498a9ba2a5ba866"
+ integrity sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.12.1"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-promievent "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-eth-abi "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-ens@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz#0d28c5d4ea7b4462ef6c077545a77956a6cdf175"
+ integrity sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.12.1"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-promievent "1.3.6"
+ web3-eth-abi "1.3.6"
+ web3-eth-contract "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth-iban@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz#0d6ba21fe78f190af8919e9cd5453882457209e0"
+ integrity sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.3.6"
+
+web3-eth-personal@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz#226137916754c498f0284f22c55924c87a2efcf0"
+ integrity sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-net "1.3.6"
+ web3-utils "1.3.6"
+
+web3-eth@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.6.tgz#2c650893d540a7a0eb1365dd5b2dca24ac919b7c"
+ integrity sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==
+ dependencies:
+ underscore "1.12.1"
+ web3-core "1.3.6"
+ web3-core-helpers "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-eth-abi "1.3.6"
+ web3-eth-accounts "1.3.6"
+ web3-eth-contract "1.3.6"
+ web3-eth-ens "1.3.6"
+ web3-eth-iban "1.3.6"
+ web3-eth-personal "1.3.6"
+ web3-net "1.3.6"
+ web3-utils "1.3.6"
+
+web3-net@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.6.tgz#a56492e2227475e38db29394f8bac305a2446e41"
+ integrity sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==
+ dependencies:
+ web3-core "1.3.6"
+ web3-core-method "1.3.6"
+ web3-utils "1.3.6"
+
+web3-providers-http@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.6.tgz#36e8724a7424d52827819d53fd75dbf31f5422c2"
+ integrity sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==
+ dependencies:
+ web3-core-helpers "1.3.6"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz#cef8d12c1ebb47adce5ebf597f553c623362cb4a"
+ integrity sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==
+ dependencies:
+ oboe "2.1.5"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+
+web3-providers-ws@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz#e1df617bc89d66165abdf2191da0014c505bfaac"
+ integrity sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.12.1"
+ web3-core-helpers "1.3.6"
+ websocket "^1.0.32"
+
+web3-shh@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.6.tgz#4e3486c7eca5cbdb87f88910948223a5b7ea6c20"
+ integrity sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==
+ dependencies:
+ web3-core "1.3.6"
+ web3-core-method "1.3.6"
+ web3-core-subscriptions "1.3.6"
+ web3-net "1.3.6"
+
+web3-utils@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.6.tgz#390bc9fa3a7179746963cfaca55bb80ac4d8dc10"
+ integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.6.tgz#599425461c3f9a8cbbefa70616438995f4a064cc"
+ integrity sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==
+ dependencies:
+ web3-bzz "1.3.6"
+ web3-core "1.3.6"
+ web3-eth "1.3.6"
+ web3-eth-personal "1.3.6"
+ web3-net "1.3.6"
+ web3-shh "1.3.6"
+ web3-utils "1.3.6"
+
+webidl-conversions@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506"
+ integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY=
+
+websocket@^1.0.31, websocket@^1.0.32:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+ integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+websql@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/websql/-/websql-1.0.0.tgz#1bd00b27392893134715d5dd6941fd89e730bab5"
+ integrity sha512-7iZ+u28Ljw5hCnMiq0BCOeSYf0vCFQe/ORY0HgscTiKjQed8WqugpBUggJ2NTnB9fahn1kEnPRX2jf8Px5PhJw==
+ dependencies:
+ argsarray "^0.0.1"
+ immediate "^3.2.2"
+ noop-fn "^1.0.0"
+ sqlite3 "^4.0.0"
+ tiny-queue "^0.2.1"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+whatwg-url-compat@~0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf"
+ integrity sha1-AImBEa9om7CXVBzVpFymyHmERb8=
+ dependencies:
+ tr46 "~0.0.1"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which-typed-array@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff"
+ integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==
+ dependencies:
+ available-typed-arrays "^1.0.2"
+ call-bind "^1.0.0"
+ es-abstract "^1.18.0-next.1"
+ foreach "^2.0.5"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.1"
+ is-typed-array "^1.1.3"
+
+which@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3, wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+wif@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704"
+ integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=
+ dependencies:
+ bs58check "<3.0.0"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+word-wrap@~1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+workerpool@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58"
+ integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^2.0.0:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
+ integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.2"
+
+write-stream@~0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1"
+ integrity sha1-g8yMA0fQr2BXqThitOOuAd5cgcE=
+ dependencies:
+ readable-stream "~0.0.2"
+
+ws@7.4.5:
+ version "7.4.5"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1"
+ integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1, ws@^5.2.2:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
+ integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.2.1, ws@^7.3.1, ws@^7.4.3, ws@^7.5.0:
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691"
+ integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==
+
+xdg-basedir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+ integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+"xml-name-validator@>= 2.0.1 < 3.0.0":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+ integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=
+
+xmlhttprequest@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
+ integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=
+
+xss@^1.0.8:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.9.tgz#3ffd565571ff60d2e40db7f3b80b4677bec770d2"
+ integrity sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ==
+ dependencies:
+ commander "^2.20.3"
+ cssfilter "0.0.10"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^15.0.1:
+ version "15.0.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115"
+ integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-unparser@1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f"
+ integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==
+ dependencies:
+ camelcase "^5.3.1"
+ decamelize "^1.2.0"
+ flat "^4.1.0"
+ is-plain-obj "^1.1.0"
+ yargs "^14.2.3"
+
+yargs@13.3.2:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.6.0.tgz#cb4050c0159bfb6bb649c0f4af550526a84619dc"
+ integrity sha1-y0BQwBWb+2u2ScD0r1UFJqhGGdw=
+ dependencies:
+ camelcase "^2.0.1"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ lodash.assign "^4.0.3"
+ os-locale "^1.4.0"
+ pkg-conf "^1.1.2"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+ string-width "^1.0.1"
+ window-size "^0.2.0"
+ y18n "^3.2.1"
+ yargs-parser "^2.4.0"
+
+yargs@^14.2.3:
+ version "14.2.3"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414"
+ integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==
+ dependencies:
+ cliui "^5.0.0"
+ decamelize "^1.2.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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 "^15.0.1"
+
+yargs@^15.3.1:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zen-observable-ts@^0.8.21:
+ version "0.8.21"
+ resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
+ integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==
+ dependencies:
+ tslib "^1.9.3"
+ zen-observable "^0.8.0"
+
+zen-observable@^0.8.0, zen-observable@^0.8.14:
+ version "0.8.15"
+ resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
+ integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
diff --git a/omgx_examples/waffle/.gitignore b/omgx_examples/waffle/.gitignore
new file mode 100644
index 000000000000..3632fc70587a
--- /dev/null
+++ b/omgx_examples/waffle/.gitignore
@@ -0,0 +1,2 @@
+build/
+build-ovm/
diff --git a/packages/batch-submitter/.prettierrc.json b/omgx_examples/waffle/.prettierrc.json
similarity index 100%
rename from packages/batch-submitter/.prettierrc.json
rename to omgx_examples/waffle/.prettierrc.json
diff --git a/omgx_examples/waffle/LICENSE b/omgx_examples/waffle/LICENSE
new file mode 100644
index 000000000000..6a7da5218bb2
--- /dev/null
+++ b/omgx_examples/waffle/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright 2020-2021 Optimism
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/omgx_examples/waffle/README.md b/omgx_examples/waffle/README.md
new file mode 100644
index 000000000000..dcd8e30bbfae
--- /dev/null
+++ b/omgx_examples/waffle/README.md
@@ -0,0 +1,21 @@
+
+## 1. Compiling, running, and deploying.
+
+For example, to compile, test, and then deploy the contract on a local L2:
+
+```bash
+$ yarn
+$ yarn compile:ovm
+$ yarn test:integration:ovm
+```
+
+NOTE: you can deploy the contract on OMGX Rinkeby by changing the `l2Url` target in `/test/erc20.spec.js` to `http://rinkeby.omgx.network`:
+
+```bash
+const config = {
+ l2Url: process.env.L2_URL || 'http://127.0.0.1:8545', // 'http://rinkeby.omgx.network'
+ l1Url: process.env.L1_URL || 'http://127.0.0.1:9545',
+ useL2: process.env.TARGET === 'OVM',
+ privateKey: process.env.PRIVATE_KEY || '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+}
+```
\ No newline at end of file
diff --git a/omgx_examples/waffle/contracts/ERC20.sol b/omgx_examples/waffle/contracts/ERC20.sol
new file mode 100644
index 000000000000..e997c4e97726
--- /dev/null
+++ b/omgx_examples/waffle/contracts/ERC20.sol
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: MIT LICENSE
+/*
+Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
+.*/
+
+pragma solidity ^0.7.6;
+
+import "./IERC20.sol";
+
+contract ERC20 is IERC20 {
+ uint256 private constant MAX_UINT256 = 2**256 - 1;
+ mapping(address => uint256) public balances;
+ mapping(address => mapping(address => uint256)) public allowed;
+ /*
+ NOTE:
+ The following variables are OPTIONAL vanities. One does not have to include them.
+ They allow one to customise the token contract & in no way influences the core functionality.
+ Some wallets/interfaces might not even bother to look at this information.
+ */
+ string public name; //fancy name: eg OVM Coin
+ uint8 public decimals; //How many decimals to show.
+ string public symbol; //An identifier: eg OVM
+ uint256 public override totalSupply;
+
+ constructor(
+ uint256 _initialAmount,
+ string memory _tokenName,
+ uint8 _decimalUnits,
+ string memory _tokenSymbol
+ ) {
+ balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
+ totalSupply = _initialAmount; // Update total supply
+ name = _tokenName; // Set the name for display purposes
+ decimals = _decimalUnits; // Amount of decimals for display purposes
+ symbol = _tokenSymbol; // Set the symbol for display purposes
+ }
+
+ function transfer(address _to, uint256 _value)
+ external
+ override
+ returns (bool success)
+ {
+ require(balances[msg.sender] >= _value);
+ balances[msg.sender] -= _value;
+ balances[_to] += _value;
+ emit Transfer(msg.sender, _to, _value);
+ return true;
+ }
+
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _value
+ ) external override returns (bool success) {
+ uint256 allowance_ = allowed[_from][msg.sender];
+ require(balances[_from] >= _value && allowance_ >= _value);
+ balances[_to] += _value;
+ balances[_from] -= _value;
+ if (allowance_ < MAX_UINT256) {
+ allowed[_from][msg.sender] -= _value;
+ }
+ emit Transfer(_from, _to, _value);
+ return true;
+ }
+
+ function balanceOf(address _owner)
+ external
+ view
+ override
+ returns (uint256 balance)
+ {
+ return balances[_owner];
+ }
+
+ function approve(address _spender, uint256 _value)
+ external
+ override
+ returns (bool success)
+ {
+ allowed[msg.sender][_spender] = _value;
+ emit Approval(msg.sender, _spender, _value);
+ return true;
+ }
+
+ function allowance(address _owner, address _spender)
+ external
+ view
+ override
+ returns (uint256 remaining)
+ {
+ return allowed[_owner][_spender];
+ }
+}
diff --git a/omgx_examples/waffle/contracts/IERC20.sol b/omgx_examples/waffle/contracts/IERC20.sol
new file mode 100644
index 000000000000..9a59163ef9f9
--- /dev/null
+++ b/omgx_examples/waffle/contracts/IERC20.sol
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: MIT LICENSE
+// Abstract contract for the full ERC 20 Token standard
+// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
+pragma solidity ^0.7.6;
+
+interface IERC20 {
+ /* This is a slight change to the ERC20 base standard.
+ function totalSupply() constant returns (uint256 supply);
+ is replaced with:
+ uint256 public totalSupply;
+ This automatically creates a getter function for the totalSupply.
+ This is moved to the base contract since public getter functions are not
+ currently recognised as an implementation of the matching abstract
+ function by the compiler.
+ */
+ /// total amount of tokens
+ function totalSupply() external view returns (uint256);
+
+ /// @param _owner The address from which the balance will be retrieved
+ /// @return balance
+ function balanceOf(address _owner) external view returns (uint256 balance);
+
+ /// @notice send `_value` token to `_to` from `msg.sender`
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return success Whether the transfer was successful or not
+ function transfer(address _to, uint256 _value)
+ external
+ returns (bool success);
+
+ /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
+ /// @param _from The address of the sender
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return success Whether the transfer was successful or not
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _value
+ ) external returns (bool success);
+
+ /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @param _value The amount of tokens to be approved for transfer
+ /// @return success Whether the approval was successful or not
+ function approve(address _spender, uint256 _value)
+ external
+ returns (bool success);
+
+ /// @param _owner The address of the account owning tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @return remaining Amount of remaining tokens allowed to spent
+ function allowance(address _owner, address _spender)
+ external
+ view
+ returns (uint256 remaining);
+
+ // solhint-disable-next-line no-simple-event-func-name
+ event Transfer(address indexed _from, address indexed _to, uint256 _value);
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+}
diff --git a/omgx_examples/waffle/package.json b/omgx_examples/waffle/package.json
new file mode 100644
index 000000000000..076e45e386c6
--- /dev/null
+++ b/omgx_examples/waffle/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "@omgx/ERC20-Example",
+ "version": "0.0.1-alpha.1",
+ "description": "Basic example of how to test a basic token contract with Waffle in the OVM",
+ "scripts": {
+ "clean": "rimraf build",
+ "compile": "waffle",
+ "compile:ovm": "waffle waffle-ovm.json",
+ "test:integration": "mocha 'test/*.spec.js' --timeout 10000",
+ "test:integration:ovm": "TARGET=OVM mocha 'test/*.spec.js' --timeout 50000"
+ },
+ "keywords": [
+ "optimism",
+ "rollup",
+ "optimistic",
+ "ethereum",
+ "virtual",
+ "machine",
+ "OVM",
+ "ERC20",
+ "waffle"
+ ],
+ "private": true,
+ "homepage": "https://github.com/ethereum-optimism/ERC20-Example#readme",
+ "license": "MIT",
+ "author": "Optimism PBC",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ethereum-optimism/ERC20-Example.git"
+ },
+ "devDependencies": {
+ "@types/chai": "^4.2.17",
+ "@types/mocha": "^7.0.2",
+ "@types/rimraf": "^3.0.0",
+ "chai": "^4.3.4",
+ "dotenv": "^8.2.0",
+ "ethereum-waffle": "^3.0.0",
+ "mocha": "^7.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "dependencies": {
+ "@eth-optimism/solc": "0.7.6-alpha.1",
+ "solc": "0.7.6"
+ }
+}
diff --git a/omgx_examples/waffle/test/erc20.spec.js b/omgx_examples/waffle/test/erc20.spec.js
new file mode 100644
index 000000000000..970c45d5546e
--- /dev/null
+++ b/omgx_examples/waffle/test/erc20.spec.js
@@ -0,0 +1,106 @@
+/* External imports */
+require('dotenv/config')
+const { use, expect } = require('chai')
+const { ethers } = require('ethers')
+const { solidity } = require('ethereum-waffle')
+
+/* Internal imports */
+const { getArtifact } = require('./getArtifact')
+
+use(solidity)
+
+const config = {
+ l2Url: process.env.L2_URL || 'http://127.0.0.1:8545', // 'http://rinkeby.omgx.network'
+ l1Url: process.env.L1_URL || 'http://127.0.0.1:9545',
+ useL2: process.env.TARGET === 'OVM',
+ privateKey: process.env.PRIVATE_KEY || '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+}
+
+describe('ERC20 smart contract', () => {
+ let ERC20,
+ provider
+
+ if (config.useL2) {
+ provider = new ethers.providers.JsonRpcProvider(config.l2Url)
+ provider.pollingInterval = 100
+ provider.getGasPrice = async () => ethers.BigNumber.from(0)
+ } else {
+ provider = new ethers.providers.JsonRpcProvider(config.l1Url)
+ }
+
+ const wallet = new ethers.Wallet(config.privateKey).connect(provider)
+
+ // parameters to use for our test coin
+ const COIN_NAME = 'OVM Test Coin'
+ const TICKER = 'OVM'
+ const NUM_DECIMALS = 1
+
+ describe('when using a deployed contract instance', () => {
+ before(async () => {
+ const Artifact__ERC20 = getArtifact(config.useL2)
+ const Factory__ERC20 = new ethers.ContractFactory(
+ Artifact__ERC20.abi,
+ Artifact__ERC20.bytecode,
+ wallet
+ )
+
+ // TODO: Remove this hardcoded gas limit
+ ERC20 = await Factory__ERC20.connect(wallet).deploy(
+ 1000,
+ COIN_NAME,
+ NUM_DECIMALS,
+ TICKER
+ )
+ await ERC20.deployTransaction.wait()
+ })
+
+ it('should assigns initial balance', async () => {
+ const address = await wallet.getAddress()
+ expect(await ERC20.balanceOf(address)).to.equal(1000)
+ })
+
+ it('should correctly set vanity information', async () => {
+ const name = await ERC20.name()
+ expect(name).to.equal(COIN_NAME)
+
+ const decimals = await ERC20.decimals()
+ expect(decimals).to.equal(NUM_DECIMALS)
+
+ const symbol = await ERC20.symbol()
+ expect(symbol).to.equal(TICKER)
+ })
+
+ it('should transfer amount to destination account', async () => {
+ const freshWallet = ethers.Wallet.createRandom()
+ const destination = await freshWallet.getAddress()
+ const tx = await ERC20.connect(wallet).transfer(destination, 7)
+ await tx.wait()
+ const walletToBalance = await ERC20.balanceOf(destination)
+ expect(walletToBalance.toString()).to.equal('7')
+ })
+
+ it('should emit Transfer event', async () => {
+ const address = await wallet.getAddress()
+ const tx = ERC20.connect(wallet).transfer(address, 7)
+ await expect(tx)
+ .to.emit(ERC20, 'Transfer')
+ .withArgs(address, address, 7)
+ })
+
+ it('should not transfer above the amount', async () => {
+ const address = await wallet.getAddress()
+ const walletToBalanceBefore = await ERC20.balanceOf(address)
+ await expect(ERC20.transfer(address, 1007)).to.be.reverted
+ const walletToBalanceAfter = await ERC20.balanceOf(address)
+ expect(walletToBalanceBefore).to.eq(walletToBalanceAfter)
+ })
+
+ it('should not transfer from empty account', async () => {
+ const emptyWallet = ethers.Wallet.createRandom()
+ const address = await emptyWallet.getAddress()
+ const ERC20FromOtherWallet = ERC20.connect(emptyWallet)
+ await expect(ERC20FromOtherWallet.transfer(address, 1)).to.be
+ .reverted
+ })
+ })
+})
diff --git a/omgx_examples/waffle/test/getArtifact.js b/omgx_examples/waffle/test/getArtifact.js
new file mode 100644
index 000000000000..9c4855a1095c
--- /dev/null
+++ b/omgx_examples/waffle/test/getArtifact.js
@@ -0,0 +1,7 @@
+const getArtifact = (useL2) => {
+ const buildFolder = useL2 ? 'build-ovm' : 'build'
+ const ERC20Artifact = require(`../${buildFolder}/ERC20.json`)
+ return ERC20Artifact
+}
+
+module.exports = { getArtifact }
diff --git a/omgx_examples/waffle/waffle-ovm.json b/omgx_examples/waffle/waffle-ovm.json
new file mode 100644
index 000000000000..ff5dd2cb9893
--- /dev/null
+++ b/omgx_examples/waffle/waffle-ovm.json
@@ -0,0 +1,5 @@
+{
+ "compilerVersion": "./node_modules/@eth-optimism/solc",
+ "sourceDirectory": "./contracts",
+ "outputDirectory": "./build-ovm"
+}
\ No newline at end of file
diff --git a/omgx_examples/waffle/waffle.json b/omgx_examples/waffle/waffle.json
new file mode 100644
index 000000000000..b8bb19420f45
--- /dev/null
+++ b/omgx_examples/waffle/waffle.json
@@ -0,0 +1,5 @@
+{
+ "compilerVersion": "./node_modules/solc",
+ "sourceDirectory": "./contracts",
+ "outputDirectory": "./build"
+}
\ No newline at end of file
diff --git a/omgx_examples/waffle/yarn.lock b/omgx_examples/waffle/yarn.lock
new file mode 100644
index 000000000000..10bfe713f705
--- /dev/null
+++ b/omgx_examples/waffle/yarn.lock
@@ -0,0 +1,7118 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ensdomains/ens@^0.4.4":
+ version "0.4.5"
+ resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz"
+ integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==
+ dependencies:
+ bluebird "^3.5.2"
+ eth-ens-namehash "^2.0.8"
+ solc "^0.4.20"
+ testrpc "0.0.1"
+ web3-utils "^1.0.0-beta.31"
+
+"@ensdomains/resolver@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz"
+ integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==
+
+"@eth-optimism/solc@0.7.6-alpha.1":
+ version "0.7.6-alpha.1"
+ resolved "https://registry.npmjs.org/@eth-optimism/solc/-/solc-0.7.6-alpha.1.tgz"
+ integrity sha512-tVYeBtjwNRUDmaTdJNlKI0lTM0yV1hez0jPFOtACoepBwBEZOuuFLBgQLBOWPaR95UU2ke1YjqB7rrpkE3oRDg==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+"@ethereum-waffle/chai@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.0.tgz"
+ integrity sha512-GVaFKuFbFUclMkhHtQTDnWBnBQMJc/pAbfbFj/nnIK237WPLsO3KDDslA7m+MNEyTAOFrcc0CyfruAGGXAQw3g==
+ dependencies:
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.0"
+
+"@ethereum-waffle/compiler@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz"
+ integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw==
+ dependencies:
+ "@resolver-engine/imports" "^0.3.3"
+ "@resolver-engine/imports-fs" "^0.3.3"
+ "@typechain/ethers-v5" "^2.0.0"
+ "@types/mkdirp" "^0.5.2"
+ "@types/node-fetch" "^2.5.5"
+ ethers "^5.0.1"
+ mkdirp "^0.5.1"
+ node-fetch "^2.6.1"
+ solc "^0.6.3"
+ ts-generator "^0.1.1"
+ typechain "^3.0.0"
+
+"@ethereum-waffle/ens@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.3.0.tgz"
+ integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw==
+ dependencies:
+ "@ensdomains/ens" "^0.4.4"
+ "@ensdomains/resolver" "^0.2.4"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/mock-contract@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz"
+ integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw==
+ dependencies:
+ "@ethersproject/abi" "^5.0.1"
+ ethers "^5.0.1"
+
+"@ethereum-waffle/provider@^3.4.0":
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.0.tgz"
+ integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ==
+ dependencies:
+ "@ethereum-waffle/ens" "^3.3.0"
+ ethers "^5.0.1"
+ ganache-core "^2.13.2"
+ patch-package "^6.2.2"
+ postinstall-postinstall "^2.1.0"
+
+"@ethersproject/abi@5.0.0-beta.153":
+ version "5.0.0-beta.153"
+ resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz"
+ integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==
+ dependencies:
+ "@ethersproject/address" ">=5.0.0-beta.128"
+ "@ethersproject/bignumber" ">=5.0.0-beta.130"
+ "@ethersproject/bytes" ">=5.0.0-beta.129"
+ "@ethersproject/constants" ">=5.0.0-beta.128"
+ "@ethersproject/hash" ">=5.0.0-beta.128"
+ "@ethersproject/keccak256" ">=5.0.0-beta.127"
+ "@ethersproject/logger" ">=5.0.0-beta.129"
+ "@ethersproject/properties" ">=5.0.0-beta.131"
+ "@ethersproject/strings" ">=5.0.0-beta.130"
+
+"@ethersproject/abi@5.3.1", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.3.0":
+ version "5.3.1"
+ resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.3.1.tgz"
+ integrity sha512-F98FWTJG7nWWAQ4DcV6R0cSlrj67MWK3ylahuFbzkumem5cLWg1p7fZ3vIdRoS1c7TEf55Lvyx0w7ICR47IImw==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz"
+ integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+
+"@ethersproject/abstract-provider@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d"
+ integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/networks" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/transactions" "^5.4.0"
+ "@ethersproject/web" "^5.4.0"
+
+"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz"
+ integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/abstract-signer@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65"
+ integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/address@5.3.0", "@ethersproject/address@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.3.0.tgz"
+ integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+
+"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
+ integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+
+"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.3.0.tgz"
+ integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+
+"@ethersproject/base64@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
+ integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+
+"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.3.0.tgz"
+ integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+
+"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.3.0.tgz"
+ integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9"
+ integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ bn.js "^4.11.9"
+
+"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.3.0.tgz"
+ integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
+ integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/constants@5.3.0", "@ethersproject/constants@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.3.0.tgz"
+ integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+
+"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
+ integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.4.0"
+
+"@ethersproject/contracts@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.3.0.tgz"
+ integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==
+ dependencies:
+ "@ethersproject/abi" "^5.3.0"
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+
+"@ethersproject/hash@5.3.0", "@ethersproject/hash@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.3.0.tgz"
+ integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/hash@>=5.0.0-beta.128":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
+ integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.4.0"
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.3.0.tgz"
+ integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz"
+ integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/pbkdf2" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.3.0.tgz"
+ integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
+ integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ js-sha3 "0.5.7"
+
+"@ethersproject/logger@5.3.0", "@ethersproject/logger@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.3.0.tgz"
+ integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==
+
+"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
+ integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
+
+"@ethersproject/networks@5.3.1", "@ethersproject/networks@^5.3.0":
+ version "5.3.1"
+ resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.3.1.tgz"
+ integrity sha512-6uQKHkYChlsfeiZhQ8IHIqGE/sQsf25o9ZxAYpMxi15dLPzz3IxOEF5KiSD32aHwsjXVBKBSlo+teAXLlYJybw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/networks@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.0.tgz#71eecd3ef3755118b42c1a5d2a44a7e07202e10a"
+ integrity sha512-5fywtKRDcnaVeA5SjxXH3DOQqe/IbeD/plwydi94SdPps1fbDUrnO6SzDExaruBZXxpxJcO9upG9UComsei4bg==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz"
+ integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+
+"@ethersproject/properties@5.3.0", "@ethersproject/properties@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.3.0.tgz"
+ integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==
+ dependencies:
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
+ integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==
+ dependencies:
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/providers@5.3.1":
+ version "5.3.1"
+ resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.3.1.tgz"
+ integrity sha512-HC63vENTrur6/JKEhcQbA8PRDj1FAesdpX98IW+xAAo3EAkf70ou5fMIA3KCGzJDLNTeYA4C2Bonz849tVLekg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/basex" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/networks" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/web" "^5.3.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.3.0", "@ethersproject/random@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.3.0.tgz"
+ integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.3.0.tgz"
+ integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/rlp@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
+ integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.3.0.tgz"
+ integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.3.0.tgz"
+ integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
+ integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ bn.js "^4.11.9"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.3.0.tgz"
+ integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/sha2" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/strings@5.3.0", "@ethersproject/strings@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.3.0.tgz"
+ integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
+ integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==
+ dependencies:
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.3.0.tgz"
+ integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==
+ dependencies:
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/rlp" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+
+"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
+ integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==
+ dependencies:
+ "@ethersproject/address" "^5.4.0"
+ "@ethersproject/bignumber" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/constants" "^5.4.0"
+ "@ethersproject/keccak256" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/rlp" "^5.4.0"
+ "@ethersproject/signing-key" "^5.4.0"
+
+"@ethersproject/units@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.3.0.tgz"
+ integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/constants" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+
+"@ethersproject/wallet@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.3.0.tgz"
+ integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.3.0"
+ "@ethersproject/abstract-signer" "^5.3.0"
+ "@ethersproject/address" "^5.3.0"
+ "@ethersproject/bignumber" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/hdnode" "^5.3.0"
+ "@ethersproject/json-wallets" "^5.3.0"
+ "@ethersproject/keccak256" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/random" "^5.3.0"
+ "@ethersproject/signing-key" "^5.3.0"
+ "@ethersproject/transactions" "^5.3.0"
+ "@ethersproject/wordlists" "^5.3.0"
+
+"@ethersproject/web@5.3.0", "@ethersproject/web@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.3.0.tgz"
+ integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==
+ dependencies:
+ "@ethersproject/base64" "^5.3.0"
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@ethersproject/web@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
+ integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==
+ dependencies:
+ "@ethersproject/base64" "^5.4.0"
+ "@ethersproject/bytes" "^5.4.0"
+ "@ethersproject/logger" "^5.4.0"
+ "@ethersproject/properties" "^5.4.0"
+ "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.3.0":
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.3.0.tgz"
+ integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.3.0"
+ "@ethersproject/hash" "^5.3.0"
+ "@ethersproject/logger" "^5.3.0"
+ "@ethersproject/properties" "^5.3.0"
+ "@ethersproject/strings" "^5.3.0"
+
+"@resolver-engine/core@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz"
+ integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==
+ dependencies:
+ debug "^3.1.0"
+ is-url "^1.2.4"
+ request "^2.85.0"
+
+"@resolver-engine/fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz"
+ integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports-fs@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz"
+ integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==
+ dependencies:
+ "@resolver-engine/fs" "^0.3.3"
+ "@resolver-engine/imports" "^0.3.3"
+ debug "^3.1.0"
+
+"@resolver-engine/imports@^0.3.3":
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz"
+ integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==
+ dependencies:
+ "@resolver-engine/core" "^0.3.3"
+ debug "^3.1.0"
+ hosted-git-info "^2.6.0"
+ path-browserify "^1.0.0"
+ url "^0.11.0"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@typechain/ethers-v5@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz"
+ integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==
+ dependencies:
+ ethers "^5.0.2"
+
+"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5":
+ version "4.11.6"
+ resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68"
+ integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai@^4.2.17":
+ version "4.2.19"
+ resolved "https://registry.npmjs.org/@types/chai/-/chai-4.2.19.tgz"
+ integrity sha512-jRJgpRBuY+7izT7/WNXP/LsMO9YonsstuL+xuvycDyESpoDoIAsMd7suwpB4h9oEWB+ZlPTqJJ8EHomzNhwTPQ==
+
+"@types/glob@*":
+ version "7.1.3"
+ resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz"
+ integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/minimatch@*":
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz"
+ integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==
+
+"@types/mkdirp@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz"
+ integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/mocha@^7.0.2":
+ version "7.0.2"
+ resolved "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz"
+ integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==
+
+"@types/node-fetch@^2.5.5":
+ version "2.5.10"
+ resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz"
+ integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "15.12.4"
+ resolved "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz"
+ integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==
+
+"@types/node@^12.12.6":
+ version "12.20.15"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.15.tgz#10ee6a6a3f971966fddfa3f6e89ef7a73ec622df"
+ integrity sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz"
+ integrity sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==
+
+"@types/resolve@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz"
+ integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/rimraf@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz"
+ integrity sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==
+ dependencies:
+ "@types/glob" "*"
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.2.tgz#20c29a87149d980f64464e56539bf4810fdb5d1d"
+ integrity sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==
+ dependencies:
+ "@types/node" "*"
+
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
+abstract-leveldown@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz"
+ integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz"
+ integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz"
+ integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==
+ dependencies:
+ xtend "~4.0.0"
+
+abstract-leveldown@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz"
+ integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
+ dependencies:
+ xtend "~4.0.0"
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz"
+ integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=
+
+aes-js@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@3.2.3:
+ version "3.2.3"
+ resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz"
+ integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ 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==
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@~3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ 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@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-back@^1.0.3, array-back@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz"
+ integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
+ dependencies:
+ typical "^2.6.0"
+
+array-back@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz"
+ integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
+ dependencies:
+ typical "^2.6.1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+async-eventemitter@^0.2.2:
+ version "0.2.4"
+ resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz"
+ integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
+ dependencies:
+ async "^2.4.0"
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@2.6.2, async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.npmjs.org/async/-/async-2.6.2.tgz"
+ integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==
+ dependencies:
+ lodash "^4.17.11"
+
+async@^1.4.2:
+ version "1.5.2"
+ resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ 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@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.14, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ 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"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ 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"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ 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=
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ 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=
+ dependencies:
+ 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@^6.24.1:
+ 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=
+ dependencies:
+ 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@^6.24.1:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz"
+ integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
+ dependencies:
+ 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@^6.24.1:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz"
+ integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ 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=
+ dependencies:
+ 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@^6.24.1:
+ 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=
+ dependencies:
+ 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@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz"
+ integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ 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-exponentiation-operator@^6.8.0:
+ 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-trailing-function-commas@^6.22.0:
+ 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-to-generator@^6.22.0:
+ 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=
+ dependencies:
+ 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@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ 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=
+ dependencies:
+ 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@^6.23.0:
+ 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=
+ dependencies:
+ 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@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ 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=
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ 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=
+ dependencies:
+ 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@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ 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==
+ dependencies:
+ 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@^6.23.0:
+ 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=
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ 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=
+ dependencies:
+ 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@^6.22.0:
+ 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=
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ 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=
+ dependencies:
+ 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@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ 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=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ 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=
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ 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=
+ dependencies:
+ 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@^6.22.0:
+ 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=
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ 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=
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ 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@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz"
+ integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+ dependencies:
+ 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@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ 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@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ 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@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babelify@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz"
+ integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=
+ dependencies:
+ babel-core "^6.0.14"
+ object-assign "^4.0.0"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz"
+ integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=
+ dependencies:
+ precond "0.2"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz"
+ integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ 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"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz"
+ integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bip39@2.5.0:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz"
+ integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==
+ dependencies:
+ create-hash "^1.1.0"
+ pbkdf2 "^3.0.9"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ unorm "^1.3.3"
+
+blakejs@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+ integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+bluebird@^3.5.0, bluebird@^3.5.2:
+ version "3.7.2"
+ resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz"
+ integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0:
+ version "4.12.0"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0, body-parser@^1.16.0:
+ version "1.19.0"
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ 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"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ 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"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ 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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ 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@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz"
+ integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer-xor@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz"
+ integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+bytewise-core@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz"
+ integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=
+ dependencies:
+ typewise-core "^1.2"
+
+bytewise@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz"
+ integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=
+ dependencies:
+ bytewise-core "^1.2.2"
+ typewise "^1.0.3"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ 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"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+cachedown@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz"
+ integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=
+ dependencies:
+ abstract-leveldown "^2.4.1"
+ lru-cache "^3.2.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30001240"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz#ec15d125b590602c8731545c5351ff054ad2d52f"
+ integrity sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chai@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz"
+ integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.1"
+ type-detect "^4.0.5"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ 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"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
+checkpoint-store@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz"
+ integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=
+ dependencies:
+ functional-red-black-tree "^1.0.1"
+
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@2.1.2, clone@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz"
+ integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
+ dependencies:
+ array-back "^2.0.0"
+ find-replace "^1.0.3"
+ typical "^2.6.1"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.1:
+ version "1.6.2"
+ resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.5.1:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookiejar@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-pure@^3.0.1:
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.1.tgz#8356f6576fa2aa8e54ca6fe02620968ff010eed7"
+ integrity sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA==
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ 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-fetch@^2.1.0, cross-fetch@^2.1.1:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz"
+ integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==
+ dependencies:
+ node-fetch "2.1.2"
+ whatwg-fetch "2.0.4"
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@3.12.0:
+ version "3.12.0"
+ resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ 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"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@3.2.6, debug@^3.1.0:
+ version "3.2.6"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^1.1.1, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+deferred-leveldown@~1.2.1:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz"
+ integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
+ dependencies:
+ abstract-leveldown "~2.6.0"
+
+deferred-leveldown@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz"
+ integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ inherits "^2.0.3"
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotenv@^8.2.0:
+ version "8.6.0"
+ resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz"
+ integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
+
+dotignore@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz"
+ integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
+ dependencies:
+ minimatch "^3.0.4"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.47:
+ version "1.3.760"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.760.tgz#cf19c9ae9ff23c0ac6bb289e3b71c09b7c3f8de1"
+ integrity sha512-XPKwjX6pHezJWB4FLVuSil9gGmU6XYl27ahUwEHODXF4KjCEB8RuIT05MkU1au2Tdye57o49yY0uCMK+bwUt+A==
+
+elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding-down@5.0.4, encoding-down@~5.0.0:
+ version "5.0.4"
+ resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz"
+ integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==
+ dependencies:
+ abstract-leveldown "^5.0.0"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+ xtend "^4.0.1"
+
+encoding@^0.1.11:
+ version "0.1.13"
+ resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.18.0-next.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.53"
+ resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz"
+ integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.3"
+ next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz"
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eth-block-tracker@^3.0.0:
+ 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==
+ dependencies:
+ 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-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz"
+ integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz"
+ integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==
+ dependencies:
+ cross-fetch "^2.1.1"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ 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==
+ dependencies:
+ 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"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz"
+ integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=
+ dependencies:
+ json-rpc-random-id "^1.0.0"
+ xtend "^4.0.1"
+
+eth-sig-util@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.0.tgz"
+ integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==
+ dependencies:
+ 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-sig-util@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
+ integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=
+ dependencies:
+ ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
+ ethereumjs-util "^5.1.1"
+
+eth-tx-summary@^3.1.2:
+ version "3.2.4"
+ resolved "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz"
+ integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
+ dependencies:
+ 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"
+
+ethashjs@~0.0.7:
+ version "0.0.8"
+ resolved "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz"
+ integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==
+ dependencies:
+ async "^2.1.2"
+ buffer-xor "^2.0.1"
+ ethereumjs-util "^7.0.2"
+ miller-rabin "^4.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-common@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz"
+ integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
+
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-waffle@^3.0.0:
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz"
+ integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ==
+ dependencies:
+ "@ethereum-waffle/chai" "^3.4.0"
+ "@ethereum-waffle/compiler" "^3.4.0"
+ "@ethereum-waffle/mock-contract" "^3.3.0"
+ "@ethereum-waffle/provider" "^3.4.0"
+ ethers "^5.0.1"
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-abi@0.6.8:
+ version "0.6.8"
+ resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
+ version "0.6.8"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz"
+ integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==
+ dependencies:
+ ethereumjs-util "^6.0.0"
+ rlp "^2.2.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-account@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz"
+ integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
+ dependencies:
+ ethereumjs-util "^5.0.0"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2:
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz"
+ integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
+ dependencies:
+ async "^2.0.1"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.1"
+ ethereumjs-util "^5.0.0"
+ merkle-patricia-tree "^2.1.2"
+
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz"
+ integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
+ dependencies:
+ 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-blockchain@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz"
+ integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==
+ dependencies:
+ async "^2.6.1"
+ ethashjs "~0.0.7"
+ ethereumjs-block "~2.2.2"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.1.0"
+ flow-stoplight "^1.0.0"
+ level-mem "^3.0.1"
+ lru-cache "^5.1.1"
+ rlp "^2.2.2"
+ semaphore "^1.1.0"
+
+ethereumjs-common@1.5.0, ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz"
+ integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==
+
+ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz"
+ integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ dependencies:
+ ethereumjs-common "^1.5.0"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3:
+ version "1.3.7"
+ resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.1"
+ resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz"
+ integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.0.0"
+
+ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz"
+ integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "^0.1.3"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+
+ethereumjs-util@^7.0.2:
+ version "7.0.10"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
+ integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.4"
+
+ethereumjs-vm@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz"
+ integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ core-js-pure "^3.0.1"
+ ethereumjs-account "^3.0.0"
+ ethereumjs-block "^2.2.2"
+ ethereumjs-blockchain "^4.0.3"
+ ethereumjs-common "^1.5.0"
+ ethereumjs-tx "^2.1.2"
+ ethereumjs-util "^6.2.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"
+ util.promisify "^1.0.0"
+
+ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0:
+ 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==
+ dependencies:
+ 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"
+
+ethereumjs-wallet@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz"
+ integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==
+ dependencies:
+ aes-js "^3.1.1"
+ bs58check "^2.1.2"
+ ethereum-cryptography "^0.1.3"
+ ethereumjs-util "^6.0.0"
+ randombytes "^2.0.6"
+ safe-buffer "^5.1.2"
+ scryptsy "^1.2.1"
+ utf8 "^3.0.0"
+ uuid "^3.3.2"
+
+ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2:
+ version "5.3.1"
+ resolved "https://registry.npmjs.org/ethers/-/ethers-5.3.1.tgz"
+ integrity sha512-xCKmC0gsZ9gks89ZfK3B1y6LlPdvX5fxDtu9SytnpdDJR1M7pmJI+4H0AxQPMgUYr7GtQdmECLR0gWdJQ+lZYw==
+ dependencies:
+ "@ethersproject/abi" "5.3.1"
+ "@ethersproject/abstract-provider" "5.3.0"
+ "@ethersproject/abstract-signer" "5.3.0"
+ "@ethersproject/address" "5.3.0"
+ "@ethersproject/base64" "5.3.0"
+ "@ethersproject/basex" "5.3.0"
+ "@ethersproject/bignumber" "5.3.0"
+ "@ethersproject/bytes" "5.3.0"
+ "@ethersproject/constants" "5.3.0"
+ "@ethersproject/contracts" "5.3.0"
+ "@ethersproject/hash" "5.3.0"
+ "@ethersproject/hdnode" "5.3.0"
+ "@ethersproject/json-wallets" "5.3.0"
+ "@ethersproject/keccak256" "5.3.0"
+ "@ethersproject/logger" "5.3.0"
+ "@ethersproject/networks" "5.3.1"
+ "@ethersproject/pbkdf2" "5.3.0"
+ "@ethersproject/properties" "5.3.0"
+ "@ethersproject/providers" "5.3.1"
+ "@ethersproject/random" "5.3.0"
+ "@ethersproject/rlp" "5.3.0"
+ "@ethersproject/sha2" "5.3.0"
+ "@ethersproject/signing-key" "5.3.0"
+ "@ethersproject/solidity" "5.3.0"
+ "@ethersproject/strings" "5.3.0"
+ "@ethersproject/transactions" "5.3.0"
+ "@ethersproject/units" "5.3.0"
+ "@ethersproject/wallet" "5.3.0"
+ "@ethersproject/web" "5.3.0"
+ "@ethersproject/wordlists" "5.3.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz"
+ integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ 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"
+
+express@^4.14.0:
+ version "4.17.1"
+ resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ 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"
+
+ext@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz"
+ integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+ dependencies:
+ type "^2.0.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ 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"
+
+extsprintf@1.3.0, extsprintf@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+fake-merkle-patricia-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz"
+ integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM=
+ dependencies:
+ checkpoint-store "^1.1.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-ponyfill@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz"
+ integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=
+ dependencies:
+ node-fetch "~1.7.1"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ 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"
+
+find-replace@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz"
+ integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
+ dependencies:
+ array-back "^1.0.4"
+ test-value "^2.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
+flat@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
+ integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flow-stoplight@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz"
+ integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=
+
+follow-redirects@^1.12.1:
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz"
+ integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+for-each@^0.3.3, for-each@~0.3.3:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^4.0.2, fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
+function-bind@^1.1.1, function-bind@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+ganache-core@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz"
+ integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==
+ dependencies:
+ abstract-leveldown "3.0.0"
+ async "2.6.2"
+ bip39 "2.5.0"
+ cachedown "1.0.0"
+ clone "2.1.2"
+ debug "3.2.6"
+ encoding-down "5.0.4"
+ eth-sig-util "3.0.0"
+ ethereumjs-abi "0.6.8"
+ ethereumjs-account "3.0.0"
+ ethereumjs-block "2.2.2"
+ ethereumjs-common "1.5.0"
+ ethereumjs-tx "2.1.2"
+ ethereumjs-util "6.2.1"
+ ethereumjs-vm "4.2.0"
+ heap "0.2.6"
+ keccak "3.0.1"
+ level-sublevel "6.6.4"
+ levelup "3.1.1"
+ lodash "4.17.20"
+ lru-cache "5.1.1"
+ merkle-patricia-tree "3.0.0"
+ patch-package "6.2.2"
+ seedrandom "3.0.1"
+ source-map-support "0.5.12"
+ tmp "0.1.0"
+ web3-provider-engine "14.2.1"
+ websocket "1.0.32"
+ optionalDependencies:
+ ethereumjs-wallet "0.6.5"
+ web3 "1.2.11"
+
+get-caller-file@^1.0.1:
+ 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-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz"
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.3, glob@^7.1.2:
+ version "7.1.3"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ 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@^7.1.3, glob@~7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ 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"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+got@9.6.0:
+ version "9.6.0"
+ resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+got@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/got/-/got-7.1.0.tgz"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ 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@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.2.6"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-symbol-support-x@^1.4.1:
+ 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==
+
+has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-to-string-tag-x@^1.2.0:
+ 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==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3, has@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz"
+ integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
+ version "2.8.9"
+ resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2, http-errors@~1.7.2:
+ version "1.7.2"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz"
+ integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@^3.2.3, immediate@~3.2.3:
+ version "3.2.3"
+ resolved "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz"
+ integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ 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@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arguments@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@~2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz"
+ integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ 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==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-regex@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz"
+ integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+ dependencies:
+ has "^1.0.3"
+
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-stream@^1.0.0, is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
+js-sha3@0.5.7, js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz"
+ integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
+ version "3.8.0"
+ resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz"
+ integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==
+ dependencies:
+ 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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz"
+ integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI=
+ dependencies:
+ inherits "^2.0.1"
+
+json-rpc-random-id@^1.0.0:
+ 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-traverse@^0.4.1:
+ 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-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stable-stringify@^1.0.1:
+ 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=
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+keccak@3.0.1, keccak@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz"
+ integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-codec@~7.0.0:
+ 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@^1.0.3, level-errors@~1.0.3:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz"
+ integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
+ dependencies:
+ errno "~0.1.1"
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@^2.0.3:
+ 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==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.5"
+ xtend "^4.0.0"
+
+level-iterator-stream@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz"
+ integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=
+ dependencies:
+ inherits "^2.0.1"
+ level-errors "^1.0.3"
+ readable-stream "^1.0.33"
+ xtend "^4.0.0"
+
+level-iterator-stream@~3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz"
+ integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ xtend "^4.0.0"
+
+level-mem@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz"
+ integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==
+ dependencies:
+ level-packager "~4.0.0"
+ memdown "~3.0.0"
+
+level-packager@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz"
+ integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==
+ dependencies:
+ encoding-down "~5.0.0"
+ levelup "^3.0.0"
+
+level-post@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz"
+ integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==
+ dependencies:
+ ltgt "^2.1.2"
+
+level-sublevel@6.6.4:
+ 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==
+ dependencies:
+ 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"
+
+level-ws@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz"
+ integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=
+ dependencies:
+ readable-stream "~1.0.15"
+ xtend "~2.1.1"
+
+level-ws@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz"
+ integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.8"
+ xtend "^4.0.1"
+
+levelup@3.1.1, levelup@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz"
+ integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==
+ dependencies:
+ deferred-leveldown "~4.0.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~3.0.0"
+ xtend "~4.0.0"
+
+levelup@^1.2.1:
+ version "1.3.9"
+ resolved "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz"
+ integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
+ dependencies:
+ 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"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+lodash.assign@^4.0.3, lodash.assign@^4.0.6:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz"
+ integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
+
+lodash@4.17.20, lodash@^4.17.11, lodash@^4.17.4:
+ version "4.17.20"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lodash@^4.17.15:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+looper@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz"
+ integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=
+
+looper@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz"
+ integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@5.1.1, lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz"
+ integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=
+ dependencies:
+ pseudomap "^1.0.1"
+
+ltgt@^2.1.2, ltgt@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz"
+ integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=
+
+ltgt@~2.2.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memdown@^1.0.0:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz"
+ integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=
+ dependencies:
+ 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"
+
+memdown@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz"
+ integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==
+ dependencies:
+ abstract-leveldown "~5.0.0"
+ functional-red-black-tree "~1.0.1"
+ immediate "~3.2.3"
+ inherits "~2.0.1"
+ ltgt "~2.2.0"
+ safe-buffer "~5.1.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz"
+ integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merkle-patricia-tree@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz"
+ integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==
+ dependencies:
+ async "^2.6.1"
+ ethereumjs-util "^5.2.0"
+ level-mem "^3.0.1"
+ level-ws "^1.0.0"
+ readable-stream "^3.0.6"
+ rlp "^2.0.0"
+ semaphore ">=1.0.1"
+
+merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
+ 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==
+ dependencies:
+ 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"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ 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"
+
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.48.0:
+ version "1.48.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz"
+ integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.31"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz"
+ integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+ dependencies:
+ mime-db "1.48.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz"
+ integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*, mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mocha@^7.0.1:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
+ dependencies:
+ ansi-colors "3.2.3"
+ browser-stdout "1.3.1"
+ chokidar "3.3.0"
+ debug "3.2.6"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ find-up "3.0.0"
+ glob "7.1.3"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ mkdirp "0.5.5"
+ ms "2.1.1"
+ node-environment-flags "1.0.6"
+ object.assign "4.1.0"
+ strip-json-comments "2.0.1"
+ supports-color "6.0.0"
+ which "1.3.1"
+ wide-align "1.1.3"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz"
+ integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ 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"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+next-tick@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz"
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
+ dependencies:
+ object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
+
+node-fetch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz"
+ integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=
+
+node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-fetch@~1.7.1:
+ version "1.7.3"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+normalize-package-data@^2.3.2:
+ 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==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+number-is-nan@^1.0.0:
+ 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@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz"
+ integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.10.3:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-inspect@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz"
+ integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz"
+ integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+oboe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz"
+ integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ 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@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^3.0.0:
+ 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==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz"
+ integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-headers@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz"
+ integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+patch-package@6.2.2:
+ version "6.2.2"
+ resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+patch-package@^6.2.2:
+ version "6.4.7"
+ resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz"
+ integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
+path-browserify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+posix-character-classes@^0.1.0:
+ 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=
+
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz"
+ integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=
+
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.1.2:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz"
+ integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-to-callback@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz"
+ integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=
+ dependencies:
+ is-fn "^1.0.0"
+ set-immediate-shim "^1.0.1"
+
+proxy-addr@~2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ 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@^1.1.9:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz"
+ integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs=
+
+pull-defer@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz"
+ integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==
+
+pull-level@^2.0.3:
+ 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==
+ dependencies:
+ 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@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz"
+ integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=
+ dependencies:
+ pull-cat "^1.1.9"
+ pull-stream "^3.4.0"
+
+pull-pushable@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz"
+ integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
+
+pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
+ version "3.6.14"
+ resolved "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz"
+ integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==
+
+pull-window@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz"
+ integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=
+ dependencies:
+ looper "^2.0.0"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@2.1.0, punycode@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz"
+ integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=
+
+punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@~6.5.2:
+ 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@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^1.0.33:
+ version "1.1.14"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ 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"
+
+readable-stream@^3.0.6, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~1.0.15:
+ version "1.0.34"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
+regenerate@^1.2.1:
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz"
+ integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz"
+ integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz"
+ integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
+ dependencies:
+ jsesc "~0.5.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0, request@^2.85.0:
+ version "2.88.2"
+ resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ 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.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.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-from-string@^1.1.0:
+ 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-from-string@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ 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-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.0, resolve@^1.8.1:
+ version "1.20.0"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+resolve@~1.17.0:
+ version "1.17.0"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+resumer@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz"
+ integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
+ dependencies:
+ through "~2.3.4"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^2.2.8, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.6"
+ resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz"
+ integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==
+ dependencies:
+ bn.js "^4.11.1"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+safe-buffer@5.1.2, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-event-emitter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz"
+ integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
+ dependencies:
+ events "^3.0.0"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+scryptsy@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz"
+ integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
+ dependencies:
+ pbkdf2 "^3.0.3"
+
+secp256k1@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz"
+ integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==
+ dependencies:
+ elliptic "^6.5.2"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+seedrandom@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz"
+ integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
+
+semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz"
+ integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@~5.4.1:
+ version "5.4.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz"
+ integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ 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"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@^1.0.1:
+ 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@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz"
+ integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz"
+ integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ 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"
+
+solc@0.7.6:
+ version "0.7.6"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.6.tgz#21fc5dc11b85fcc518c181578b454f3271c27252"
+ integrity sha512-WsR/W7CXwh2VnmZapB4JrsDeLlshoKBz5Pz/zYNulB6LBsOEHI2Zj/GeKLMFcvv57OHiXHvxq5ZOQB+EdqxlxQ==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solc@^0.4.20:
+ version "0.4.26"
+ resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz"
+ integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
+
+solc@^0.6.3:
+ version "0.6.12"
+ resolved "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz"
+ integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.5.12:
+ 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==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ 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==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ 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"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-to-pull-stream@^1.7.1:
+ version "1.7.3"
+ resolved "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz"
+ integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==
+ dependencies:
+ looper "^3.0.0"
+ pull-stream "^3.2.3"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string.prototype.trim@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz#6014689baf5efaf106ad031a5fa45157666ed1bd"
+ integrity sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.1.1, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+supports-color@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz"
+ integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+swarm-js@^0.1.40:
+ version "0.1.40"
+ resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz"
+ integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^7.1.0"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+tape@^4.6.3:
+ version "4.13.3"
+ resolved "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz"
+ integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==
+ dependencies:
+ deep-equal "~1.1.1"
+ defined "~1.0.0"
+ dotignore "~0.1.2"
+ for-each "~0.3.3"
+ function-bind "~1.1.1"
+ glob "~7.1.6"
+ has "~1.0.3"
+ inherits "~2.0.4"
+ is-regex "~1.0.5"
+ minimist "~1.2.5"
+ object-inspect "~1.7.0"
+ resolve "~1.17.0"
+ resumer "~0.0.0"
+ string.prototype.trim "~1.2.1"
+ through "~2.3.8"
+
+tar@^4.0.2:
+ version "4.4.13"
+ resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz"
+ integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.8.6"
+ minizlib "^1.2.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.3"
+
+test-value@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz"
+ integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
+ dependencies:
+ array-back "^1.0.3"
+ typical "^2.6.0"
+
+testrpc@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz"
+ integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==
+
+through2@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@~2.3.4, through@~2.3.8:
+ version "2.3.8"
+ resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz"
+ integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
+
+tmp@0.0.33, tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
+to-fast-properties@^1.0.3:
+ 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@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+ts-essentials@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz"
+ integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
+
+ts-essentials@^6.0.3:
+ version "6.0.7"
+ resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz"
+ integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
+
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
+ dependencies:
+ "@types/mkdirp" "^0.5.2"
+ "@types/prettier" "^2.1.1"
+ "@types/resolve" "^0.0.8"
+ chalk "^2.4.1"
+ glob "^7.1.2"
+ mkdirp "^0.5.1"
+ prettier "^2.1.2"
+ resolve "^1.8.1"
+ ts-essentials "^1.0.0"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.0:
+ version "0.15.1"
+ resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+tweetnacl@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-detect@^4.0.0, type-detect@^4.0.5:
+ 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==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+ integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typechain@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz"
+ integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==
+ dependencies:
+ command-line-args "^4.0.7"
+ debug "^4.1.1"
+ fs-extra "^7.0.0"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ ts-essentials "^6.0.3"
+ ts-generator "^0.1.1"
+
+typedarray-to-buffer@^3.1.5:
+ 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==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typewise-core@^1.2, typewise-core@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz"
+ integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=
+
+typewise@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz"
+ integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=
+ dependencies:
+ typewise-core "^1.2.0"
+
+typewiselite@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz"
+ integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4=
+
+typical@^2.6.0, typical@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz"
+ integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+underscore@1.9.1:
+ 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==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unorm@^1.3.3:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz"
+ integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
+
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz"
+ integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+utf8@3.0.0, utf8@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz"
+ integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ for-each "^0.3.3"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.1"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ 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==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz"
+ integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "9.6.0"
+ swarm-js "^0.1.40"
+ underscore "1.9.1"
+
+web3-core-helpers@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz"
+ integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==
+ dependencies:
+ underscore "1.9.1"
+ web3-eth-iban "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-method@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz"
+ integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==
+ dependencies:
+ "@ethersproject/transactions" "^5.0.0-beta.135"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-utils "1.2.11"
+
+web3-core-promievent@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz"
+ integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz"
+ integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==
+ dependencies:
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ web3-providers-http "1.2.11"
+ web3-providers-ipc "1.2.11"
+ web3-providers-ws "1.2.11"
+
+web3-core-subscriptions@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz"
+ integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-core@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz"
+ integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-requestmanager "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-abi@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz"
+ integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==
+ dependencies:
+ "@ethersproject/abi" "5.0.0-beta.153"
+ underscore "1.9.1"
+ web3-utils "1.2.11"
+
+web3-eth-accounts@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz"
+ integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==
+ dependencies:
+ crypto-browserify "3.12.0"
+ eth-lib "0.2.8"
+ ethereumjs-common "^1.3.2"
+ ethereumjs-tx "^2.1.1"
+ scrypt-js "^3.0.1"
+ underscore "1.9.1"
+ uuid "3.3.2"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-contract@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz"
+ integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==
+ dependencies:
+ "@types/bn.js" "^4.11.5"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-ens@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz"
+ integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==
+ dependencies:
+ content-hash "^2.5.2"
+ eth-ens-namehash "2.0.8"
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-promievent "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth-iban@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz"
+ integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==
+ dependencies:
+ bn.js "^4.11.9"
+ web3-utils "1.2.11"
+
+web3-eth-personal@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz"
+ integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-eth@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz"
+ integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==
+ dependencies:
+ underscore "1.9.1"
+ web3-core "1.2.11"
+ web3-core-helpers "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-eth-abi "1.2.11"
+ web3-eth-accounts "1.2.11"
+ web3-eth-contract "1.2.11"
+ web3-eth-ens "1.2.11"
+ web3-eth-iban "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-utils "1.2.11"
+
+web3-net@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz"
+ integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-utils "1.2.11"
+
+web3-provider-engine@14.2.1:
+ version "14.2.1"
+ resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz"
+ integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==
+ dependencies:
+ 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"
+
+web3-providers-http@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz"
+ integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==
+ dependencies:
+ web3-core-helpers "1.2.11"
+ xhr2-cookies "1.1.0"
+
+web3-providers-ipc@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz"
+ integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==
+ dependencies:
+ oboe "2.1.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+
+web3-providers-ws@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz"
+ integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==
+ dependencies:
+ eventemitter3 "4.0.4"
+ underscore "1.9.1"
+ web3-core-helpers "1.2.11"
+ websocket "^1.0.31"
+
+web3-shh@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz"
+ integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==
+ dependencies:
+ web3-core "1.2.11"
+ web3-core-method "1.2.11"
+ web3-core-subscriptions "1.2.11"
+ web3-net "1.2.11"
+
+web3-utils@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz"
+ integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.9.1"
+ utf8 "3.0.0"
+
+web3-utils@^1.0.0-beta.31:
+ version "1.3.6"
+ resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz"
+ integrity sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==
+ dependencies:
+ bn.js "^4.11.9"
+ eth-lib "0.2.8"
+ ethereum-bloom-filters "^1.0.6"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ underscore "1.12.1"
+ utf8 "3.0.0"
+
+web3@1.2.11:
+ version "1.2.11"
+ resolved "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz"
+ integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==
+ dependencies:
+ web3-bzz "1.2.11"
+ web3-core "1.2.11"
+ web3-eth "1.2.11"
+ web3-eth-personal "1.2.11"
+ web3-net "1.2.11"
+ web3-shh "1.2.11"
+ web3-utils "1.2.11"
+
+websocket@1.0.32, websocket@^1.0.31:
+ version "1.0.32"
+ resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-fetch@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz"
+ integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1.3.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz"
+ integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^5.1.1:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
+ integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ 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"
+
+xhr2-cookies@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz"
+ integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=
+ dependencies:
+ cookiejar "^2.1.1"
+
+xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xtend@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz"
+ integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os=
+ dependencies:
+ object-keys "~0.4.0"
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz"
+ integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=
+ dependencies:
+ camelcase "^3.0.0"
+ lodash.assign "^4.0.6"
+
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
+
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ 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.2"
+
+yargs@^4.7.1:
+ version "4.8.1"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz"
+ integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA=
+ dependencies:
+ 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"
diff --git a/omgx_utilities/contracts-analyzer/.env.example b/omgx_utilities/contracts-analyzer/.env.example
new file mode 100644
index 000000000000..c82d8889ea4f
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/.env.example
@@ -0,0 +1,7 @@
+L2_NODE_WEB3_URL=http://localhost:8545
+DEPLOYER_PRIVATE_KEY=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_1=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_2=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
+TEST_PRIVATE_KEY_3=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+TEST_PRIVATE_KEY_4=0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
+TEST_PRIVATE_KEY_5=0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/.prettierrc.js b/omgx_utilities/contracts-analyzer/.prettierrc.js
new file mode 100644
index 000000000000..6b3fa8e2ce23
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ ...require('../../.prettierrc.js'),
+};
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/PORTING.md b/omgx_utilities/contracts-analyzer/PORTING.md
new file mode 100644
index 000000000000..715249c64980
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/PORTING.md
@@ -0,0 +1,162 @@
+# Porting to OMGX and Optimism - A case study.
+
+- [Porting to OMGX and Optimism - A case study.](#porting-to-omgx-and-optimism---a-case-study)
+ * [SUSHI](#sushi)
+ * [0. Basics](#0-basics)
+ * [1. No native ETH](#1-no-native-eth)
+ * [2. Timing, `now`, and `block.timestamp`](#2-timing---now---and--blocktimestamp)
+ * [3. Replace `chainid()` with `uint256 chainId = ___`](#3-replace--chainid----with--uint256-chainid)
+ * [4. Update Depreciated Syntax](#5-update-depreciated-syntax)
+ * [5. No tx.origin](#6-no-txorigin)
+ * [6. TEST RESULTS: evm_increaseTime and evm_mine](#7-tests-results--all-good-except-evm-increasetime-and-evm-mine---workaround-pending)
+
+## SUSHI
+
+SUSHI is a DeFi exchange that supports token swapping and many other actions. We started by copying SUSHI's smart contracts into the `/contracts` folder. Then, we ran:
+
+```bash
+yarn install
+yarn build
+yarn analyze
+yarn deploy
+```
+
+We then addressed the warnings and errors one by one. Let's now take that all, step by step.
+
+## 0. Basics
+
+**Your contracts.** As noted, run `yarn install` and drop your contracts into a folder called `contracts`. That's what solc and hardhat will look at, compile, and deploy. Then, run:
+
+```bash
+yarn build
+```
+
+The first time you do this, you will see dozens of errors.
+
+**Missing libraries.** The provided `package.json` is generic and you will see HH411 errors such as
+
+```
+Error HH411: The library foo, imported from contracts/something.sol, is not installed. Try installing it using npm.
+```
+
+This means that you have to install the foo library:
+
+```bash
+yarn add foo
+```
+
+**Solidity Versions.** Once all the missing libraries have been installed, you will see `HH606` errors:
+
+```
+Error HH606: The project cannot be compiled, see reasons below.
+
+The Solidity version pragma statement in these files don't match any of the configured compilers in your config. Change the pragma or configure additional compiler versions in your hardhat config.
+
+ * contracts/something.sol (^0.6.0)
+```
+
+The optimism solc compiler supports Solidity versions 0.5.16, 0.6.12, and 0.7.6. This value is set in `hardhat.config.js`. The first time you run `yarn build` you will typically see many errors relating to your pragmas. If most of your pragmas are around 0.6 you would chose 0.6.12, and so forth. In general, small modifications (such as replacing `^0.5.17` with `^0.5.16` or specifying a broader range such as `pragma solidity >= 0.5.16 < 0.6.5;`) will not affect your code and your unit and integration tests will pick up any exceptions.
+
+At this point, solc and hardhat have all the information they need to get started. Now, you will see actual code issues, such as:
+
+```
+OVM Compiler Error (insert "// @unsupported: ovm" if you don't want this file to be compiled for the OVM):
+ contracts/foo.sol:72:31: ParserError: OVM: ORIGIN is not implemented in the OVM.
+ require(msg.sender == tx.origin, "not eoa");
+
+OVM Compiler Error (insert "// @unsupported: ovm" if you don't want this file to be compiled for the OVM):
+ contracts/WETH.sol:51:16: ParserError: OVM: SELFBALANCE is not implemented in the OVM. (We have no native ETH -- use deposited WETH instead!)
+ return address(this).balance;
+ ^-------------------^
+
+Error HH600: Compilation failed
+```
+
+Let's now tackle those one by one.
+
+## 1. No native ETH
+
+In many smart contracts, ETH is handled slightly differently than ERC20 tokens, but on L2, there is no native ETH. Instead, L2s use an ERC20 representation of ETH such as wETH or oETH. This means that all ETH-specific functions can be deleted, since there are no longer needed. For example:
+
+```diff
+
+contracts/uniswapv2/interfaces/IUniswapV2Router01.sol
+@@ -16,14 +17,15 @@ interface IUniswapV2Router01 {
+ ...
+- function addLiquidityETH(
+- address token,
+- uint amountTokenDesired,
+- uint amountTokenMin,
+- uint amountETHMin,
+- address to,
+- uint deadline
+- ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
++ // CHANGE_OMGX
++ // function addLiquidityETH(
++ // address token,
++ // uint amountTokenDesired,
++ // uint amountTokenMin,
++ // uint amountETHMin,
++ // address to,
++ // uint deadline
++ // ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
+
+```
+
+From a UI/Frontend perspective, 'native' ETH functions are no longer needed and integration test code will also need any ETH-specific tests to be commented out. In the case of the SUSHI port, among other changes, `contracts/mocks/WETH9Mock.sol` can be deleted entirely and many functions in `contracts/uniswapv2/UniswapV2Router02.sol` can also be deleted, such as `removeLiquidityETH` and `swapExactETHForTokens` etc. Removing functions in the contracts also affects the interfaces, of course, e.g. `contracts/uniswapv2/interfaces/IUniswapV2Router01.sol`.
+
+## 2. Timing, `now`, and `block.timestamp`
+
+The L2 does not have traditional blocks. Control over time, and manipulation of apparent time, is critical for L2, since during a fraud proof, the L1 contacts will need to replay the L2 contracts at specific times _in the past_ to check their correctness. `block.timestamp` returns the last L1 block in which a rollup batch was posted. This means that the `block.timestamp` returned on L2 can lag as many as 10 minutes behind L1. Depending on how `block.timestamp` is being used, this 1-10 min lag could have **serious unexpected implications**. See [OVM-vs-EVM-Block-Timestamps](https://hackmd.io/@scopelift/Hy853dTsP#OVM-vs-EVM-Block-Timestamps) for a more extensive discussion. Briefly, consider:
+
+1. The OVM timestamp lags behind the EVM, so it’s possible that e.g. OVM trades execute up 10 minutes after your specified deadline.
+2. `permit` method signatures contain a deadline, and the approval must be sent before that deadline. In certain cases, the approval could take place after the deadline.
+3. Bid and auction duration. If you are trying to run an auction with minute scale bid duration, then a 1-10 minute lag relative to L1 could throw that off completely.
+
+## 3. Replace `chainid()` with `uint256 chainId = ___`
+
+```diff
+
+contracts/SushiToken.sol
+@@ -239,8 +241,8 @@ contract SushiToken is ERC20("SushiToken", "SUSHI"), Ownable {
+ ...
+ function getChainId() internal pure returns (uint) {
+- uint256 chainId;
++ uint256 chainId = 28; //or whatever the L2 ChainID is...
++ //assembly { chainId := chainid() }
+
+```
+
+## 4. Update Depreciated Syntax
+
+Not strictly L2 related, but updated it to help with future maintainability.
+
+```diff
+
+contracts/governance/Timelock.sol
+- (bool success, bytes memory returnData) = target.call.value(value)(callData);
++ (bool success, bytes memory returnData) = target.call{value:value}(callData);
+
+// The following syntax is deprecated:
+// f.gas(...)(), f.value(...)() and (new C).value(...)().
+// Replace with:
+// f{gas: ..., value: ...}() and (new C){value: ...}().
+
+```
+
+## 5. No tx.origin
+
+L2 does not support `tx.origin`. This is typically a non-issue, since `tx.origin` is deprecated anyway and will be removed from L1 at some point. See [Vitalik's answer](https://ethereum.stackexchange.com/questions/196/how-do-i-make-my-dapp-serenity-proof). Secondly, only allowing txs from an EOA is considered an anti-pattern. It breaks composability, it prevents multisig wallets from using your product, and in general it's probably a hack to cover up some underlying security issues in the contracts. There is no easy/obvious one-line replacement for `tx.origin` - any attempt to try to detect the codesize or something of the calling contract would be spoofable. For Compound's use of `msg.sender == tx.origin`, as for Sushi, the best approach is to remove that restriction and make sure the contracts can safely handle calls from other contracts (which involves writing new code). For now, we just commented out the `require`.
+
+```diff
+
+contracts/SushiMaker.sol
+ // Try to make flash-loan exploit harder to do by only allowing externally owned addresses.
+- require(msg.sender == tx.origin, "SushiMaker: must use EOA");
++ //require(msg.sender == tx.origin, "SushiMaker: must use EOA");
+
+```
+
+## 6. TESTS RESULTS: All good EXCEPT evm_increaseTime and evm_mine
+
+All tests clear EXCEPT things related to `evm_increaseTime` and `evm_mine`. Note that this does not affect the contracts _per se_ but affects testing.
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/README.md b/omgx_utilities/contracts-analyzer/README.md
new file mode 100644
index 000000000000..61e7bfa54f9e
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/README.md
@@ -0,0 +1,120 @@
+- [The Contracts Analyzer](#the-contract-analyzer)
+ * [Prerequisites](#prerequisites)
+ * [Setting Up](#setting-up)
+ * [Add Contracts](#add-contracts)
+ * [Notes](#notes)
+ * [Deploying Contracts to LOCAL L2](#deploying-contracts-to-local-l2)
+ * [Deploying Contracts to OMGX RINKEBY](#deploying-contracts-to-omgx-rinkeby)
+ * [Test](#test)
+
+# The Contracts Analyzer
+
+This repo is used to analyze contracts written for L1, as a starting point for evaluating potential code changes needed to deploy them to L2.
+
+## Prerequisites
+
+Please make sure you've installed:
+
+- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+- [Node.js](https://nodejs.org/en/download/)
+- [Yarn](https://classic.yarnpkg.com/en/docs/install#mac-stable)
+
+## Setting Up
+
+Set up the project by running:
+
+```bash
+yarn install
+cd packages/omgx/contracts-analyzer
+```
+
+## Add Contracts
+
+Copy your contracts into `/contracts` and run:
+
+```bash
+yarn build #build the smart contracts with optimistic solc
+yarn analyze
+```
+
+You will probably have to `yarn add` multiple packages, and change/update pragmas, such as, to `pragma solidity 0.6.12;`
+
+## Notes
+
+The code compliles the contracts, which will typically provide extensive debug information and warnings/errors, and also checks for contract size and inline assembly. The second contract size check is superfluous, since the compiler already does that.
+
+## Deploying Contracts to LOCAL L2
+
+First, make sure you have a `.env` in `packages/omgx/contracts-analyzer`. The five TEST_PRIVATE_KEYs are used for testing. The DEPLOYER_PRIVATE_KEY is used to deploy contracts. Since (right now) we don't charge oWETH to deploy contracts on L2, the wallets do not need any funds in them.
+
+```javascript
+L2_NODE_WEB3_URL=http://localhost:8545
+DEPLOYER_PRIVATE_KEY=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_1=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_2=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
+TEST_PRIVATE_KEY_3=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+TEST_PRIVATE_KEY_4=0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
+TEST_PRIVATE_KEY_5=0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
+```
+
+Then, deploy:
+
+```bash
+yarn deploy
+```
+
+You should then see a list of contract addresses.
+
+## Deploying Contracts to OMGX RINKEBY
+
+Make sure you have a `.env` in `packages/omgx/contracts-analyzer`. Then, set your variables similar to this:
+
+```javascript
+L2_NODE_WEB3_URL=https://rinkeby.omgx.network
+DEPLOYER_PRIVATE_KEY=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_1=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
+TEST_PRIVATE_KEY_2=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
+TEST_PRIVATE_KEY_3=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+TEST_PRIVATE_KEY_4=0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
+TEST_PRIVATE_KEY_5=0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
+```
+
+Next, comment out `{gasPrice: 0, gasLimit: 800000}` in three places - they are not needed for now:
+
+```
+GitHub/optimism/packages/omgx/contracts-analyzer/scripts/deploy.js:
+ 66 // Transfer Sushi Ownership to Chef
+ 67 console.log(" 🔑 Transfer Sushi Ownership to Chef")
+ 68: await (await SushiToken.transferOwnership(MasterChef.address, { gasLimit: 800000, gasPrice: 0 })).wait()
+ 69 }
+ 70
+ ..
+ 72 // Transfer ownership of MasterChef to Dev
+ 73 console.log(" 🔑 Transfer ownership of MasterChef to Dev")
+ 74: await (await MasterChef.transferOwnership(deployAddress, { gasLimit: 800000, gasPrice: 0 })).wait()
+ 75 }
+ 76
+
+GitHub/optimism/packages/omgx/contracts-analyzer/scripts/utils.js:
+ 30
+ 31 const nonce = await signerProvider.getTransactionCount()
+ 32: const deployed = await contractArtifacts.deploy(...contractArgs, { nonce, ...overrides, gasPrice: 0, gasLimit: 800000 });
+ 33 await deployed.deployTransaction.wait()
+ 34
+```
+
+Finally, deploy:
+
+```bash
+yarn deploy
+```
+
+You should then see a list of contract addresses.
+
+## Testing
+
+```bash
+yarn test:contracts
+```
+
+If you get `Error: insufficient funds for intrinsic transaction cost`, this means you need to explicitely set `{gasPrice: 0, gasLimit: 800000}` when you call contracts, such as in `await this.Factory__MasterChef.deploy`.
diff --git a/omgx_utilities/contracts-analyzer/contracts/MasterChef.sol b/omgx_utilities/contracts-analyzer/contracts/MasterChef.sol
new file mode 100644
index 000000000000..e82548a582c6
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/MasterChef.sol
@@ -0,0 +1,297 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+import "@openzeppelin/contracts/utils/EnumerableSet.sol";
+import "@openzeppelin/contracts/math/SafeMath.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+import "./SushiToken.sol";
+
+interface IMigratorChef {
+ // Perform LP token migration from legacy UniswapV2 to SushiSwap.
+ // Take the current LP token address and return the new LP token address.
+ // Migrator should have full access to the caller's LP token.
+ // Return the new LP token address.
+ //
+ // XXX Migrator must have allowance access to UniswapV2 LP tokens.
+ // SushiSwap must mint EXACTLY the same amount of SushiSwap LP tokens or
+ // else something bad will happen. Traditional UniswapV2 does not
+ // do that so be careful!
+ function migrate(IERC20 token) external returns (IERC20);
+}
+
+// MasterChef is the master of Sushi. He can make Sushi and he is a fair guy.
+//
+// Note that it's ownable and the owner wields tremendous power. The ownership
+// will be transferred to a governance smart contract once SUSHI is sufficiently
+// distributed and the community can show to govern itself.
+//
+// Have fun reading it. Hopefully it's bug-free. God bless.
+contract MasterChef is Ownable {
+ using SafeMath for uint256;
+ using SafeERC20 for IERC20;
+ // Info of each user.
+ struct UserInfo {
+ uint256 amount; // How many LP tokens the user has provided.
+ uint256 rewardDebt; // Reward debt. See explanation below.
+ //
+ // We do some fancy math here. Basically, any point in time, the amount of SUSHIs
+ // entitled to a user but is pending to be distributed is:
+ //
+ // pending reward = (user.amount * pool.accSushiPerShare) - user.rewardDebt
+ //
+ // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
+ // 1. The pool's `accSushiPerShare` (and `lastRewardBlock`) gets updated.
+ // 2. User receives the pending reward sent to his/her address.
+ // 3. User's `amount` gets updated.
+ // 4. User's `rewardDebt` gets updated.
+ }
+ // Info of each pool.
+ struct PoolInfo {
+ IERC20 lpToken; // Address of LP token contract.
+ uint256 allocPoint; // How many allocation points assigned to this pool. SUSHIs to distribute per block.
+ uint256 lastRewardBlock; // Last block number that SUSHIs distribution occurs.
+ uint256 accSushiPerShare; // Accumulated SUSHIs per share, times 1e12. See below.
+ }
+ // The SUSHI TOKEN!
+ SushiToken public sushi;
+ // Dev address.
+ address public devaddr;
+ // Block number when bonus SUSHI period ends.
+ uint256 public bonusEndBlock;
+ // SUSHI tokens created per block.
+ uint256 public sushiPerBlock;
+ // Bonus muliplier for early sushi makers.
+ uint256 public constant BONUS_MULTIPLIER = 10;
+ // The migrator contract. It has a lot of power. Can only be set through governance (owner).
+ IMigratorChef public migrator;
+ // Info of each pool.
+ PoolInfo[] public poolInfo;
+ // Info of each user that stakes LP tokens.
+ mapping(uint256 => mapping(address => UserInfo)) public userInfo;
+ // Total allocation poitns. Must be the sum of all allocation points in all pools.
+ uint256 public totalAllocPoint = 0;
+ // The block number when SUSHI mining starts.
+ uint256 public startBlock;
+ event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
+ event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
+ event EmergencyWithdraw(
+ address indexed user,
+ uint256 indexed pid,
+ uint256 amount
+ );
+
+ constructor(
+ SushiToken _sushi,
+ address _devaddr,
+ uint256 _sushiPerBlock,
+ uint256 _startBlock,
+ uint256 _bonusEndBlock
+ ) public {
+ sushi = _sushi;
+ devaddr = _devaddr;
+ sushiPerBlock = _sushiPerBlock;
+ bonusEndBlock = _bonusEndBlock;
+ startBlock = _startBlock;
+ }
+
+ function poolLength() external view returns (uint256) {
+ return poolInfo.length;
+ }
+
+ // Add a new lp to the pool. Can only be called by the owner.
+ // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ function add(
+ uint256 _allocPoint,
+ IERC20 _lpToken,
+ bool _withUpdate
+ ) public onlyOwner {
+ if (_withUpdate) {
+ massUpdatePools();
+ }
+ uint256 lastRewardBlock =
+ block.number > startBlock ? block.number : startBlock;
+ totalAllocPoint = totalAllocPoint.add(_allocPoint);
+ poolInfo.push(
+ PoolInfo({
+ lpToken: _lpToken,
+ allocPoint: _allocPoint,
+ lastRewardBlock: lastRewardBlock,
+ accSushiPerShare: 0
+ })
+ );
+ }
+
+ // Update the given pool's SUSHI allocation point. Can only be called by the owner.
+ function set(
+ uint256 _pid,
+ uint256 _allocPoint,
+ bool _withUpdate
+ ) public onlyOwner {
+ if (_withUpdate) {
+ massUpdatePools();
+ }
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(
+ _allocPoint
+ );
+ poolInfo[_pid].allocPoint = _allocPoint;
+ }
+
+ // Set the migrator contract. Can only be called by the owner.
+ function setMigrator(IMigratorChef _migrator) public onlyOwner {
+ migrator = _migrator;
+ }
+
+ // Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good.
+ function migrate(uint256 _pid) public {
+ require(address(migrator) != address(0), "migrate: no migrator");
+ PoolInfo storage pool = poolInfo[_pid];
+ IERC20 lpToken = pool.lpToken;
+ uint256 bal = lpToken.balanceOf(address(this));
+ lpToken.safeApprove(address(migrator), bal);
+ IERC20 newLpToken = migrator.migrate(lpToken);
+ require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
+ pool.lpToken = newLpToken;
+ }
+
+ // Return reward multiplier over the given _from to _to block.
+ function getMultiplier(uint256 _from, uint256 _to)
+ public
+ view
+ returns (uint256)
+ {
+ if (_to <= bonusEndBlock) {
+ return _to.sub(_from).mul(BONUS_MULTIPLIER);
+ } else if (_from >= bonusEndBlock) {
+ return _to.sub(_from);
+ } else {
+ return
+ bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
+ _to.sub(bonusEndBlock)
+ );
+ }
+ }
+
+ // View function to see pending SUSHIs on frontend.
+ function pendingSushi(uint256 _pid, address _user)
+ external
+ view
+ returns (uint256)
+ {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = pool.lpToken.balanceOf(address(this));
+ if (block.number > pool.lastRewardBlock && lpSupply != 0) {
+ uint256 multiplier =
+ getMultiplier(pool.lastRewardBlock, block.number);
+ uint256 sushiReward =
+ multiplier.mul(sushiPerBlock).mul(pool.allocPoint).div(
+ totalAllocPoint
+ );
+ accSushiPerShare = accSushiPerShare.add(
+ sushiReward.mul(1e12).div(lpSupply)
+ );
+ }
+ return user.amount.mul(accSushiPerShare).div(1e12).sub(user.rewardDebt);
+ }
+
+ // Update reward vairables for all pools. Be careful of gas spending!
+ function massUpdatePools() public {
+ uint256 length = poolInfo.length;
+ for (uint256 pid = 0; pid < length; ++pid) {
+ updatePool(pid);
+ }
+ }
+
+ // Update reward variables of the given pool to be up-to-date.
+ function updatePool(uint256 _pid) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ if (block.number <= pool.lastRewardBlock) {
+ return;
+ }
+ uint256 lpSupply = pool.lpToken.balanceOf(address(this));
+ if (lpSupply == 0) {
+ pool.lastRewardBlock = block.number;
+ return;
+ }
+ uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
+ uint256 sushiReward =
+ multiplier.mul(sushiPerBlock).mul(pool.allocPoint).div(
+ totalAllocPoint
+ );
+ sushi.mint(devaddr, sushiReward.div(10));
+ sushi.mint(address(this), sushiReward);
+ pool.accSushiPerShare = pool.accSushiPerShare.add(
+ sushiReward.mul(1e12).div(lpSupply)
+ );
+ pool.lastRewardBlock = block.number;
+ }
+
+ // Deposit LP tokens to MasterChef for SUSHI allocation.
+ function deposit(uint256 _pid, uint256 _amount) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][msg.sender];
+ updatePool(_pid);
+ if (user.amount > 0) {
+ uint256 pending =
+ user.amount.mul(pool.accSushiPerShare).div(1e12).sub(
+ user.rewardDebt
+ );
+ safeSushiTransfer(msg.sender, pending);
+ }
+ pool.lpToken.safeTransferFrom(
+ address(msg.sender),
+ address(this),
+ _amount
+ );
+ user.amount = user.amount.add(_amount);
+ user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12);
+ emit Deposit(msg.sender, _pid, _amount);
+ }
+
+ // Withdraw LP tokens from MasterChef.
+ function withdraw(uint256 _pid, uint256 _amount) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][msg.sender];
+ require(user.amount >= _amount, "withdraw: not good");
+ updatePool(_pid);
+ uint256 pending =
+ user.amount.mul(pool.accSushiPerShare).div(1e12).sub(
+ user.rewardDebt
+ );
+ safeSushiTransfer(msg.sender, pending);
+ user.amount = user.amount.sub(_amount);
+ user.rewardDebt = user.amount.mul(pool.accSushiPerShare).div(1e12);
+ pool.lpToken.safeTransfer(address(msg.sender), _amount);
+ emit Withdraw(msg.sender, _pid, _amount);
+ }
+
+ // Withdraw without caring about rewards. EMERGENCY ONLY.
+ function emergencyWithdraw(uint256 _pid) public {
+ PoolInfo storage pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][msg.sender];
+ pool.lpToken.safeTransfer(address(msg.sender), user.amount);
+ emit EmergencyWithdraw(msg.sender, _pid, user.amount);
+ user.amount = 0;
+ user.rewardDebt = 0;
+ }
+
+ // Safe sushi transfer function, just in case if rounding error causes pool to not have enough SUSHIs.
+ function safeSushiTransfer(address _to, uint256 _amount) internal {
+ uint256 sushiBal = sushi.balanceOf(address(this));
+ if (_amount > sushiBal) {
+ sushi.transfer(_to, sushiBal);
+ } else {
+ sushi.transfer(_to, _amount);
+ }
+ }
+
+ // Update dev address by the previous dev.
+ function dev(address _devaddr) public {
+ require(msg.sender == devaddr, "dev: wut?");
+ devaddr = _devaddr;
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/MasterChefV2.sol b/omgx_utilities/contracts-analyzer/contracts/MasterChefV2.sol
new file mode 100644
index 000000000000..d1ed2db01f5d
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/MasterChefV2.sol
@@ -0,0 +1,328 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "./libraries/SignedSafeMath.sol";
+import "./interfaces/IRewarder.sol";
+import "./interfaces/IMasterChef.sol";
+
+interface IMigratorChef {
+ // Take the current LP token address and return the new LP token address.
+ // Migrator should have full access to the caller's LP token.
+ function migrate(IERC20 token) external returns (IERC20);
+}
+
+/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.
+/// It is the only address with minting rights for SUSHI.
+/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token
+/// that is deposited into the MasterChef V1 (MCV1) contract.
+/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.
+contract MasterChefV2 is BoringOwnable, BoringBatchable {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+ using SignedSafeMath for int256;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ int256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardBlock;
+ uint64 allocPoint;
+ }
+
+ /// @notice Address of MCV1 contract.
+ IMasterChef public immutable MASTER_CHEF;
+ /// @notice Address of SUSHI contract.
+ IERC20 public immutable SUSHI;
+ /// @notice The index of MCV2 master pool in MCV1.
+ uint256 public immutable MASTER_PID;
+ // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).
+ IMigratorChef public migrator;
+
+ /// @notice Info of each MCV2 pool.
+ PoolInfo[] public poolInfo;
+ /// @notice Address of the LP token for each MCV2 pool.
+ IERC20[] public lpToken;
+ /// @notice Address of each `IRewarder` contract in MCV2.
+ IRewarder[] public rewarder;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 public totalAllocPoint;
+
+ uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20;
+ uint256 private constant ACC_SUSHI_PRECISION = 1e12;
+
+ event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogInit();
+
+ /// @param _MASTER_CHEF The SushiSwap MCV1 contract address.
+ /// @param _sushi The SUSHI token contract address.
+ /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract.
+ constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public {
+ MASTER_CHEF = _MASTER_CHEF;
+ SUSHI = _sushi;
+ MASTER_PID = _MASTER_PID;
+ }
+
+ /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.
+ /// Any balance of transaction sender in `dummyToken` is transferred.
+ /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.
+ /// @param dummyToken The address of the ERC-20 token to deposit into MCV1.
+ function init(IERC20 dummyToken) external {
+ uint256 balance = dummyToken.balanceOf(msg.sender);
+ require(balance != 0, "MasterChefV2: Balance must exceed 0");
+ dummyToken.safeTransferFrom(msg.sender, address(this), balance);
+ dummyToken.approve(address(MASTER_CHEF), balance);
+ MASTER_CHEF.deposit(MASTER_PID, balance);
+ emit LogInit();
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolInfo.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _lpToken Address of the LP ERC-20 token.
+ /// @param _rewarder Address of the rewarder delegate.
+ function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {
+ uint256 lastRewardBlock = block.number;
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+ lpToken.push(_lpToken);
+ rewarder.push(_rewarder);
+
+ poolInfo.push(PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardBlock: lastRewardBlock.to64(),
+ accSushiPerShare: 0
+ }));
+ emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ /// @param _rewarder Address of the rewarder delegate.
+ /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
+ function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ if (overwrite) { rewarder[_pid] = _rewarder; }
+ emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
+ }
+
+ /// @notice Set the `migrator` contract. Can only be called by the owner.
+ /// @param _migrator The contract address to set.
+ function setMigrator(IMigratorChef _migrator) public onlyOwner {
+ migrator = _migrator;
+ }
+
+ /// @notice Migrate LP token to another LP contract through the `migrator` contract.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ function migrate(uint256 _pid) public {
+ require(address(migrator) != address(0), "MasterChefV2: no migrator set");
+ IERC20 _lpToken = lpToken[_pid];
+ uint256 bal = _lpToken.balanceOf(address(this));
+ _lpToken.approve(address(migrator), bal);
+ IERC20 newLpToken = migrator.migrate(_lpToken);
+ require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match");
+ lpToken[_pid] = newLpToken;
+ }
+
+ /// @notice View function to see pending SUSHI on frontend.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
+ if (block.number > pool.lastRewardBlock && lpSupply != 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);
+ }
+ pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Calculates and returns the `amount` of SUSHI per block.
+ function sushiPerBlock() public view returns (uint256 amount) {
+ amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK)
+ .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint();
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.number > pool.lastRewardBlock) {
+ uint256 lpSupply = lpToken[pid].balanceOf(address(this));
+ if (lpSupply > 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardBlock = block.number.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+ /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to deposit.
+ /// @param to The receiver of `amount` deposit benefit.
+ function deposit(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][to];
+
+ // Effects
+ user.amount = user.amount.add(amount);
+ user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, to, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);
+
+ emit Deposit(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens.
+ function withdraw(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+
+ // Effects
+ user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of SUSHI rewards.
+ function harvest(uint256 pid, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi;
+
+ // Interactions
+ if (_pendingSushi != 0) {
+ SUSHI.safeTransfer(to, _pendingSushi);
+ }
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens and SUSHI rewards.
+ function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ SUSHI.safeTransfer(to, _pendingSushi);
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.
+ function harvestFromMasterChef() public {
+ MASTER_CHEF.deposit(MASTER_PID, 0);
+ }
+
+ /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of the LP tokens.
+ function emergencyWithdraw(uint256 pid, address to) public {
+ UserInfo storage user = userInfo[pid][msg.sender];
+ uint256 amount = user.amount;
+ user.amount = 0;
+ user.rewardDebt = 0;
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);
+ }
+
+ // Note: transfer can fail or succeed if `amount` is zero.
+ lpToken[pid].safeTransfer(to, amount);
+ emit EmergencyWithdraw(msg.sender, pid, amount, to);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/Migrator.sol b/omgx_utilities/contracts-analyzer/contracts/Migrator.sol
new file mode 100644
index 000000000000..4fc535ca70c5
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/Migrator.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+
+
+contract Migrator {
+ address public chef;
+ address public oldFactory;
+ IUniswapV2Factory public factory;
+ uint256 public notBeforeBlock;
+ uint256 public desiredLiquidity = uint256(-1);
+
+ constructor(
+ address _chef,
+ address _oldFactory,
+ IUniswapV2Factory _factory,
+ uint256 _notBeforeBlock
+ ) public {
+ chef = _chef;
+ oldFactory = _oldFactory;
+ factory = _factory;
+ notBeforeBlock = _notBeforeBlock;
+ }
+
+ function migrate(IUniswapV2Pair orig) public returns (IUniswapV2Pair) {
+ require(msg.sender == chef, "not from master chef");
+ require(block.number >= notBeforeBlock, "too early to migrate");
+ require(orig.factory() == oldFactory, "not from old factory");
+ address token0 = orig.token0();
+ address token1 = orig.token1();
+ IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(token0, token1));
+ if (pair == IUniswapV2Pair(address(0))) {
+ pair = IUniswapV2Pair(factory.createPair(token0, token1));
+ }
+ uint256 lp = orig.balanceOf(msg.sender);
+ if (lp == 0) return pair;
+ desiredLiquidity = lp;
+ orig.transferFrom(msg.sender, address(orig), lp);
+ orig.burn(address(pair));
+ pair.mint(msg.sender);
+ desiredLiquidity = uint256(-1);
+ return pair;
+ }
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/MiniChefV2.sol b/omgx_utilities/contracts-analyzer/contracts/MiniChefV2.sol
new file mode 100644
index 000000000000..536cd9e81fbf
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/MiniChefV2.sol
@@ -0,0 +1,302 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "./libraries/SignedSafeMath.sol";
+import "./interfaces/IRewarder.sol";
+import "./interfaces/IMasterChef.sol";
+
+interface IMigratorChef {
+ // Take the current LP token address and return the new LP token address.
+ // Migrator should have full access to the caller's LP token.
+ function migrate(IERC20 token) external returns (IERC20);
+}
+
+/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.
+/// It is the only address with minting rights for SUSHI.
+/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token
+/// that is deposited into the MasterChef V1 (MCV1) contract.
+/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.
+contract MiniChefV2 is BoringOwnable, BoringBatchable {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+ using SignedSafeMath for int256;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ int256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardTime;
+ uint64 allocPoint;
+ }
+
+ /// @notice Address of SUSHI contract.
+ IERC20 public immutable SUSHI;
+ // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).
+ IMigratorChef public migrator;
+
+ /// @notice Info of each MCV2 pool.
+ PoolInfo[] public poolInfo;
+ /// @notice Address of the LP token for each MCV2 pool.
+ IERC20[] public lpToken;
+ /// @notice Address of each `IRewarder` contract in MCV2.
+ IRewarder[] public rewarder;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 public totalAllocPoint;
+
+ uint256 public sushiPerSecond;
+ uint256 private constant ACC_SUSHI_PRECISION = 1e12;
+
+ event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogSushiPerSecond(uint256 sushiPerSecond);
+
+ /// @param _sushi The SUSHI token contract address.
+ constructor(IERC20 _sushi) public {
+ SUSHI = _sushi;
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolInfo.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _lpToken Address of the LP ERC-20 token.
+ /// @param _rewarder Address of the rewarder delegate.
+ function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+ lpToken.push(_lpToken);
+ rewarder.push(_rewarder);
+
+ poolInfo.push(PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardTime: block.timestamp.to64(),
+ accSushiPerShare: 0
+ }));
+ emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ /// @param _rewarder Address of the rewarder delegate.
+ /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
+ function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ if (overwrite) { rewarder[_pid] = _rewarder; }
+ emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
+ }
+
+ /// @notice Sets the sushi per second to be distributed. Can only be called by the owner.
+ /// @param _sushiPerSecond The amount of Sushi to be distributed per second.
+ function setSushiPerSecond(uint256 _sushiPerSecond) public onlyOwner {
+ sushiPerSecond = _sushiPerSecond;
+ emit LogSushiPerSecond(_sushiPerSecond);
+ }
+
+ /// @notice Set the `migrator` contract. Can only be called by the owner.
+ /// @param _migrator The contract address to set.
+ function setMigrator(IMigratorChef _migrator) public onlyOwner {
+ migrator = _migrator;
+ }
+
+ /// @notice Migrate LP token to another LP contract through the `migrator` contract.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ function migrate(uint256 _pid) public {
+ require(address(migrator) != address(0), "MasterChefV2: no migrator set");
+ IERC20 _lpToken = lpToken[_pid];
+ uint256 bal = _lpToken.balanceOf(address(this));
+ _lpToken.approve(address(migrator), bal);
+ IERC20 newLpToken = migrator.migrate(_lpToken);
+ require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match");
+ lpToken[_pid] = newLpToken;
+ }
+
+ /// @notice View function to see pending SUSHI on frontend.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
+ if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(sushiPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);
+ }
+ pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.timestamp > pool.lastRewardTime) {
+ uint256 lpSupply = lpToken[pid].balanceOf(address(this));
+ if (lpSupply > 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(sushiPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardTime = block.timestamp.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+ /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to deposit.
+ /// @param to The receiver of `amount` deposit benefit.
+ function deposit(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][to];
+
+ // Effects
+ user.amount = user.amount.add(amount);
+ user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, to, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);
+
+ emit Deposit(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens.
+ function withdraw(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+
+ // Effects
+ user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ }
+
+ /// @notice Harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of SUSHI rewards.
+ function harvest(uint256 pid, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi;
+
+ // Interactions
+ if (_pendingSushi != 0) {
+ SUSHI.safeTransfer(to, _pendingSushi);
+ }
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param amount LP token amount to withdraw.
+ /// @param to Receiver of the LP tokens and SUSHI rewards.
+ function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][msg.sender];
+ int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
+ uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();
+
+ // Effects
+ user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
+ user.amount = user.amount.sub(amount);
+
+ // Interactions
+ SUSHI.safeTransfer(to, _pendingSushi);
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);
+ }
+
+ lpToken[pid].safeTransfer(to, amount);
+
+ emit Withdraw(msg.sender, pid, amount, to);
+ emit Harvest(msg.sender, pid, _pendingSushi);
+ }
+
+ /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @param to Receiver of the LP tokens.
+ function emergencyWithdraw(uint256 pid, address to) public {
+ UserInfo storage user = userInfo[pid][msg.sender];
+ uint256 amount = user.amount;
+ user.amount = 0;
+ user.rewardDebt = 0;
+
+ IRewarder _rewarder = rewarder[pid];
+ if (address(_rewarder) != address(0)) {
+ _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);
+ }
+
+ // Note: transfer can fail or succeed if `amount` is zero.
+ lpToken[pid].safeTransfer(to, amount);
+ emit EmergencyWithdraw(msg.sender, pid, amount, to);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/Ownable.sol b/omgx_utilities/contracts-analyzer/contracts/Ownable.sol
new file mode 100644
index 000000000000..4ae686f466b1
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/Ownable.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+// Audit on 5-Jan-2021 by Keno and BoringCrypto
+
+// P1 - P3: OK
+pragma solidity 0.6.12;
+
+// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
+// Edited by BoringCrypto
+
+// T1 - T4: OK
+contract OwnableData {
+ // V1 - V5: OK
+ address public owner;
+ // V1 - V5: OK
+ address public pendingOwner;
+}
+
+// T1 - T4: OK
+contract Ownable is OwnableData {
+ // E1: OK
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ constructor () internal {
+ owner = msg.sender;
+ emit OwnershipTransferred(address(0), msg.sender);
+ }
+
+ // F1 - F9: OK
+ // C1 - C21: OK
+ function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {
+ if (direct) {
+ // Checks
+ require(newOwner != address(0) || renounce, "Ownable: zero address");
+
+ // Effects
+ emit OwnershipTransferred(owner, newOwner);
+ owner = newOwner;
+ } else {
+ // Effects
+ pendingOwner = newOwner;
+ }
+ }
+
+ // F1 - F9: OK
+ // C1 - C21: OK
+ function claimOwnership() public {
+ address _pendingOwner = pendingOwner;
+
+ // Checks
+ require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
+
+ // Effects
+ emit OwnershipTransferred(owner, _pendingOwner);
+ owner = _pendingOwner;
+ pendingOwner = address(0);
+ }
+
+ // M1 - M5: OK
+ // C1 - C21: OK
+ modifier onlyOwner() {
+ require(msg.sender == owner, "Ownable: caller is not the owner");
+ _;
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/SushiBar.sol b/omgx_utilities/contracts-analyzer/contracts/SushiBar.sol
new file mode 100644
index 000000000000..5115523135f1
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/SushiBar.sol
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "@openzeppelin/contracts/math/SafeMath.sol";
+
+// SushiBar is the coolest bar in town. You come in with some Sushi, and leave with more! The longer you stay, the more Sushi you get.
+//
+// This contract handles swapping to and from xSushi, SushiSwap's staking token.
+contract SushiBar is ERC20("SushiBar", "xSUSHI"){
+ using SafeMath for uint256;
+ IERC20 public sushi;
+
+ // Define the Sushi token contract
+ constructor(IERC20 _sushi) public {
+ sushi = _sushi;
+ }
+
+ // Enter the bar. Pay some SUSHIs. Earn some shares.
+ // Locks Sushi and mints xSushi
+ function enter(uint256 _amount) public {
+ // Gets the amount of Sushi locked in the contract
+ uint256 totalSushi = sushi.balanceOf(address(this));
+ // Gets the amount of xSushi in existence
+ uint256 totalShares = totalSupply();
+ // If no xSushi exists, mint it 1:1 to the amount put in
+ if (totalShares == 0 || totalSushi == 0) {
+ _mint(msg.sender, _amount);
+ }
+ // Calculate and mint the amount of xSushi the Sushi is worth. The ratio will change overtime, as xSushi is burned/minted and Sushi deposited + gained from fees / withdrawn.
+ else {
+ uint256 what = _amount.mul(totalShares).div(totalSushi);
+ _mint(msg.sender, what);
+ }
+ // Lock the Sushi in the contract
+ sushi.transferFrom(msg.sender, address(this), _amount);
+ }
+
+ // Leave the bar. Claim back your SUSHIs.
+ // Unlocks the staked + gained Sushi and burns xSushi
+ function leave(uint256 _share) public {
+ // Gets the amount of xSushi in existence
+ uint256 totalShares = totalSupply();
+ // Calculates the amount of Sushi the xSushi is worth
+ uint256 what = _share.mul(sushi.balanceOf(address(this))).div(totalShares);
+ _burn(msg.sender, _share);
+ sushi.transfer(msg.sender, what);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/SushiMaker.sol b/omgx_utilities/contracts-analyzer/contracts/SushiMaker.sol
new file mode 100644
index 000000000000..f2edbdacb5ee
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/SushiMaker.sol
@@ -0,0 +1,265 @@
+// SPDX-License-Identifier: MIT
+
+// P1 - P3: OK
+pragma solidity 0.6.12;
+import "./libraries/SafeMath.sol";
+import "./libraries/SafeERC20.sol";
+
+import "./uniswapv2/interfaces/IUniswapV2ERC20.sol";
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+
+import "./Ownable.sol";
+
+// SushiMaker is MasterChef's left hand and kinda a wizard. He can cook up Sushi from pretty much anything!
+// This contract handles "serving up" rewards for xSushi holders by trading tokens collected from fees for Sushi.
+
+// T1 - T4: OK
+contract SushiMaker is Ownable {
+ using SafeMath for uint256;
+ using SafeERC20 for IERC20;
+
+ // V1 - V5: OK
+ IUniswapV2Factory public immutable factory;
+ //0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac
+ // V1 - V5: OK
+ address public immutable bar;
+ //0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272
+ // V1 - V5: OK
+ address private immutable sushi;
+ //0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
+ // V1 - V5: OK
+ address private immutable weth;
+ //0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
+
+ // V1 - V5: OK
+ mapping(address => address) internal _bridges;
+
+ // E1: OK
+ event LogBridgeSet(address indexed token, address indexed bridge);
+ // E1: OK
+ event LogConvert(
+ address indexed server,
+ address indexed token0,
+ address indexed token1,
+ uint256 amount0,
+ uint256 amount1,
+ uint256 amountSUSHI
+ );
+
+ constructor(
+ address _factory,
+ address _bar,
+ address _sushi,
+ address _weth
+ ) public {
+ factory = IUniswapV2Factory(_factory);
+ bar = _bar;
+ sushi = _sushi;
+ weth = _weth;
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ function bridgeFor(address token) public view returns (address bridge) {
+ bridge = _bridges[token];
+ if (bridge == address(0)) {
+ bridge = weth;
+ }
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ function setBridge(address token, address bridge) external onlyOwner {
+ // Checks
+ require(
+ token != sushi && token != weth && token != bridge,
+ "SushiMaker: Invalid bridge"
+ );
+
+ // Effects
+ _bridges[token] = bridge;
+ emit LogBridgeSet(token, bridge);
+ }
+
+ // M1 - M5: OK
+ // C1 - C24: OK
+ // C6: It's not a fool proof solution, but it prevents flash loans, so here it's ok to use tx.origin
+ modifier onlyEOA() {
+ // Try to make flash-loan exploit harder to do by only allowing externally owned addresses.
+ // CHANGE_OMGX
+ //require(msg.sender == tx.origin, "SushiMaker: must use EOA");
+ _;
+ }
+
+ // F1 - F10: OK
+ // F3: _convert is separate to save gas by only checking the 'onlyEOA' modifier once in case of convertMultiple
+ // F6: There is an exploit to add lots of SUSHI to the bar, run convert, then remove the SUSHI again.
+ // As the size of the SushiBar has grown, this requires large amounts of funds and isn't super profitable anymore
+ // The onlyEOA modifier prevents this being done with a flash loan.
+ // C1 - C24: OK
+ function convert(address token0, address token1) external onlyEOA() {
+ _convert(token0, token1);
+ }
+
+ // F1 - F10: OK, see convert
+ // C1 - C24: OK
+ // C3: Loop is under control of the caller
+ function convertMultiple(
+ address[] calldata token0,
+ address[] calldata token1
+ ) external onlyEOA() {
+ // TODO: This can be optimized a fair bit, but this is safer and simpler for now
+ uint256 len = token0.length;
+ for (uint256 i = 0; i < len; i++) {
+ _convert(token0[i], token1[i]);
+ }
+ }
+
+ // F1 - F10: OK
+ // C1- C24: OK
+ function _convert(address token0, address token1) internal {
+ // Interactions
+ // S1 - S4: OK
+ IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(token0, token1));
+ require(address(pair) != address(0), "SushiMaker: Invalid pair");
+ // balanceOf: S1 - S4: OK
+ // transfer: X1 - X5: OK
+ IERC20(address(pair)).safeTransfer(
+ address(pair),
+ pair.balanceOf(address(this))
+ );
+ // X1 - X5: OK
+ (uint256 amount0, uint256 amount1) = pair.burn(address(this));
+ if (token0 != pair.token0()) {
+ (amount0, amount1) = (amount1, amount0);
+ }
+ emit LogConvert(
+ msg.sender,
+ token0,
+ token1,
+ amount0,
+ amount1,
+ _convertStep(token0, token1, amount0, amount1)
+ );
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ // All safeTransfer, _swap, _toSUSHI, _convertStep: X1 - X5: OK
+ function _convertStep(
+ address token0,
+ address token1,
+ uint256 amount0,
+ uint256 amount1
+ ) internal returns (uint256 sushiOut) {
+ // Interactions
+ if (token0 == token1) {
+ uint256 amount = amount0.add(amount1);
+ if (token0 == sushi) {
+ IERC20(sushi).safeTransfer(bar, amount);
+ sushiOut = amount;
+ } else if (token0 == weth) {
+ sushiOut = _toSUSHI(weth, amount);
+ } else {
+ address bridge = bridgeFor(token0);
+ amount = _swap(token0, bridge, amount, address(this));
+ sushiOut = _convertStep(bridge, bridge, amount, 0);
+ }
+ } else if (token0 == sushi) {
+ // eg. SUSHI - ETH
+ IERC20(sushi).safeTransfer(bar, amount0);
+ sushiOut = _toSUSHI(token1, amount1).add(amount0);
+ } else if (token1 == sushi) {
+ // eg. USDT - SUSHI
+ IERC20(sushi).safeTransfer(bar, amount1);
+ sushiOut = _toSUSHI(token0, amount0).add(amount1);
+ } else if (token0 == weth) {
+ // eg. ETH - USDC
+ sushiOut = _toSUSHI(
+ weth,
+ _swap(token1, weth, amount1, address(this)).add(amount0)
+ );
+ } else if (token1 == weth) {
+ // eg. USDT - ETH
+ sushiOut = _toSUSHI(
+ weth,
+ _swap(token0, weth, amount0, address(this)).add(amount1)
+ );
+ } else {
+ // eg. MIC - USDT
+ address bridge0 = bridgeFor(token0);
+ address bridge1 = bridgeFor(token1);
+ if (bridge0 == token1) {
+ // eg. MIC - USDT - and bridgeFor(MIC) = USDT
+ sushiOut = _convertStep(
+ bridge0,
+ token1,
+ _swap(token0, bridge0, amount0, address(this)),
+ amount1
+ );
+ } else if (bridge1 == token0) {
+ // eg. WBTC - DSD - and bridgeFor(DSD) = WBTC
+ sushiOut = _convertStep(
+ token0,
+ bridge1,
+ amount0,
+ _swap(token1, bridge1, amount1, address(this))
+ );
+ } else {
+ sushiOut = _convertStep(
+ bridge0,
+ bridge1, // eg. USDT - DSD - and bridgeFor(DSD) = WBTC
+ _swap(token0, bridge0, amount0, address(this)),
+ _swap(token1, bridge1, amount1, address(this))
+ );
+ }
+ }
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ // All safeTransfer, swap: X1 - X5: OK
+ function _swap(
+ address fromToken,
+ address toToken,
+ uint256 amountIn,
+ address to
+ ) internal returns (uint256 amountOut) {
+ // Checks
+ // X1 - X5: OK
+ IUniswapV2Pair pair =
+ IUniswapV2Pair(factory.getPair(fromToken, toToken));
+ require(address(pair) != address(0), "SushiMaker: Cannot convert");
+
+ // Interactions
+ // X1 - X5: OK
+ (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
+ uint256 amountInWithFee = amountIn.mul(997);
+ if (fromToken == pair.token0()) {
+ amountOut =
+ amountIn.mul(997).mul(reserve1) /
+ reserve0.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(0, amountOut, to, new bytes(0));
+ // TODO: Add maximum slippage?
+ } else {
+ amountOut =
+ amountIn.mul(997).mul(reserve0) /
+ reserve1.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(amountOut, 0, to, new bytes(0));
+ // TODO: Add maximum slippage?
+ }
+ }
+
+ // F1 - F10: OK
+ // C1 - C24: OK
+ function _toSUSHI(address token, uint256 amountIn)
+ internal
+ returns (uint256 amountOut)
+ {
+ // X1 - X5: OK
+ amountOut = _swap(token, sushi, amountIn, bar);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/SushiMakerKashi.sol b/omgx_utilities/contracts-analyzer/contracts/SushiMakerKashi.sol
new file mode 100644
index 000000000000..80912224ea3c
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/SushiMakerKashi.sol
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "./libraries/SafeMath.sol";
+import "./libraries/SafeERC20.sol";
+
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+
+import "./Ownable.sol";
+
+interface IBentoBoxWithdraw {
+ function withdraw(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) external returns (uint256 amountOut, uint256 shareOut);
+}
+
+interface IKashiWithdrawFee {
+ function asset() external view returns (address);
+ function balanceOf(address account) external view returns (uint256);
+ function withdrawFees() external;
+ function removeAsset(address to, uint256 fraction) external returns (uint256 share);
+}
+
+// SushiMakerKashi is MasterChef's left hand and kinda a wizard. He can cook up Sushi from pretty much anything!
+// This contract handles "serving up" rewards for xSushi holders by trading tokens collected from Kashi fees for Sushi.
+contract SushiMakerKashi is Ownable {
+ using SafeMath for uint256;
+ using SafeERC20 for IERC20;
+
+ IUniswapV2Factory private immutable factory;
+ //0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac
+ address private immutable bar;
+ //0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272
+ IBentoBoxWithdraw private immutable bentoBox;
+ //0xF5BCE5077908a1b7370B9ae04AdC565EBd643966
+ address private immutable sushi;
+ //0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
+ address private immutable weth;
+ //0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
+ bytes32 private immutable pairCodeHash;
+ //0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303
+
+ mapping(address => address) private _bridges;
+
+ event LogBridgeSet(address indexed token, address indexed bridge);
+ event LogConvert(
+ address indexed server,
+ address indexed token0,
+ uint256 amount0,
+ uint256 amountBENTO,
+ uint256 amountSUSHI
+ );
+
+ constructor(
+ IUniswapV2Factory _factory,
+ address _bar,
+ IBentoBoxWithdraw _bentoBox,
+ address _sushi,
+ address _weth,
+ bytes32 _pairCodeHash
+ ) public {
+ factory = _factory;
+ bar = _bar;
+ bentoBox = _bentoBox;
+ sushi = _sushi;
+ weth = _weth;
+ pairCodeHash = _pairCodeHash;
+ }
+
+ function setBridge(address token, address bridge) external onlyOwner {
+ // Checks
+ require(
+ token != sushi && token != weth && token != bridge,
+ "Maker: Invalid bridge"
+ );
+ // Effects
+ _bridges[token] = bridge;
+ emit LogBridgeSet(token, bridge);
+ }
+
+ modifier onlyEOA() {
+ // Try to make flash-loan exploit harder to do by only allowing externally-owned addresses.
+ // CHANGE_OMGX
+ //require(msg.sender == tx.origin, "Maker: Must use EOA");
+ _;
+ }
+
+ function convert(IKashiWithdrawFee kashiPair) external onlyEOA {
+ _convert(kashiPair);
+ }
+
+ function convertMultiple(IKashiWithdrawFee[] calldata kashiPair) external onlyEOA {
+ for (uint256 i = 0; i < kashiPair.length; i++) {
+ _convert(kashiPair[i]);
+ }
+ }
+
+ function _convert(IKashiWithdrawFee kashiPair) private {
+ // update Kashi fees for this Maker contract (`feeTo`)
+ kashiPair.withdrawFees();
+
+ // convert updated Kashi balance to Bento shares
+ uint256 bentoShares = kashiPair.removeAsset(address(this), kashiPair.balanceOf(address(this)));
+
+ // convert Bento shares to underlying Kashi asset (`token0`) balance (`amount0`) for Maker
+ address token0 = kashiPair.asset();
+ (uint256 amount0, ) = bentoBox.withdraw(IERC20(token0), address(this), address(this), 0, bentoShares);
+
+ emit LogConvert(
+ msg.sender,
+ token0,
+ amount0,
+ bentoShares,
+ _convertStep(token0, amount0)
+ );
+ }
+
+ function _convertStep(address token0, uint256 amount0) private returns (uint256 sushiOut) {
+ if (token0 == sushi) {
+ IERC20(token0).safeTransfer(bar, amount0);
+ sushiOut = amount0;
+ } else if (token0 == weth) {
+ sushiOut = _swap(token0, sushi, amount0, bar);
+ } else {
+ address bridge = _bridges[token0];
+ if (bridge == address(0)) {
+ bridge = weth;
+ }
+ uint256 amountOut = _swap(token0, bridge, amount0, address(this));
+ sushiOut = _convertStep(bridge, amountOut);
+ }
+ }
+
+ function _swap(
+ address fromToken,
+ address toToken,
+ uint256 amountIn,
+ address to
+ ) private returns (uint256 amountOut) {
+ (address token0, address token1) = fromToken < toToken ? (fromToken, toToken) : (toToken, fromToken);
+ IUniswapV2Pair pair =
+ IUniswapV2Pair(
+ uint256(
+ keccak256(abi.encodePacked(hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), pairCodeHash))
+ )
+ );
+
+ (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
+ uint256 amountInWithFee = amountIn.mul(997);
+
+ if (toToken > fromToken) {
+ amountOut =
+ amountInWithFee.mul(reserve1) /
+ reserve0.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(0, amountOut, to, "");
+ } else {
+ amountOut =
+ amountInWithFee.mul(reserve0) /
+ reserve1.mul(1000).add(amountInWithFee);
+ IERC20(fromToken).safeTransfer(address(pair), amountIn);
+ pair.swap(amountOut, 0, to, "");
+ }
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/SushiRoll.sol b/omgx_utilities/contracts-analyzer/contracts/SushiRoll.sol
new file mode 100644
index 000000000000..7becfb69d697
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/SushiRoll.sol
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+import "./uniswapv2/interfaces/IUniswapV2Pair.sol";
+import "./uniswapv2/interfaces/IUniswapV2Router01.sol";
+import "./uniswapv2/interfaces/IUniswapV2Factory.sol";
+import "./uniswapv2/libraries/UniswapV2Library.sol";
+
+// SushiRoll helps your migrate your existing Uniswap LP tokens to SushiSwap LP ones
+contract SushiRoll {
+ using SafeERC20 for IERC20;
+
+ IUniswapV2Router01 public oldRouter;
+ IUniswapV2Router01 public router;
+
+ constructor(IUniswapV2Router01 _oldRouter, IUniswapV2Router01 _router) public {
+ oldRouter = _oldRouter;
+ router = _router;
+ }
+
+ function migrateWithPermit(
+ address tokenA,
+ address tokenB,
+ uint256 liquidity,
+ uint256 amountAMin,
+ uint256 amountBMin,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public {
+ IUniswapV2Pair pair = IUniswapV2Pair(pairForOldRouter(tokenA, tokenB));
+ pair.permit(msg.sender, address(this), liquidity, deadline, v, r, s);
+
+ migrate(tokenA, tokenB, liquidity, amountAMin, amountBMin, deadline);
+ }
+
+ // msg.sender should have approved 'liquidity' amount of LP token of 'tokenA' and 'tokenB'
+ function migrate(
+ address tokenA,
+ address tokenB,
+ uint256 liquidity,
+ uint256 amountAMin,
+ uint256 amountBMin,
+ uint256 deadline
+ ) public {
+ require(deadline >= block.timestamp, 'SushiSwap: EXPIRED');
+
+ // Remove liquidity from the old router with permit
+ (uint256 amountA, uint256 amountB) = removeLiquidity(
+ tokenA,
+ tokenB,
+ liquidity,
+ amountAMin,
+ amountBMin,
+ deadline
+ );
+
+ // Add liquidity to the new router
+ (uint256 pooledAmountA, uint256 pooledAmountB) = addLiquidity(tokenA, tokenB, amountA, amountB);
+
+ // Send remaining tokens to msg.sender
+ if (amountA > pooledAmountA) {
+ IERC20(tokenA).safeTransfer(msg.sender, amountA - pooledAmountA);
+ }
+ if (amountB > pooledAmountB) {
+ IERC20(tokenB).safeTransfer(msg.sender, amountB - pooledAmountB);
+ }
+ }
+
+ function removeLiquidity(
+ address tokenA,
+ address tokenB,
+ uint256 liquidity,
+ uint256 amountAMin,
+ uint256 amountBMin,
+ uint256 deadline
+ ) internal returns (uint256 amountA, uint256 amountB) {
+ IUniswapV2Pair pair = IUniswapV2Pair(pairForOldRouter(tokenA, tokenB));
+ pair.transferFrom(msg.sender, address(pair), liquidity);
+ (uint256 amount0, uint256 amount1) = pair.burn(address(this));
+ (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
+ (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
+ require(amountA >= amountAMin, 'SushiRoll: INSUFFICIENT_A_AMOUNT');
+ require(amountB >= amountBMin, 'SushiRoll: INSUFFICIENT_B_AMOUNT');
+ }
+
+ // calculates the CREATE2 address for a pair without making any external calls
+ function pairForOldRouter(address tokenA, address tokenB) internal view returns (address pair) {
+ (address token0, address token1) = UniswapV2Library.sortTokens(tokenA, tokenB);
+ pair = address(uint(keccak256(abi.encodePacked(
+ hex'ff',
+ oldRouter.factory(),
+ keccak256(abi.encodePacked(token0, token1)),
+ hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
+ ))));
+ }
+
+ function addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint256 amountADesired,
+ uint256 amountBDesired
+ ) internal returns (uint amountA, uint amountB) {
+ (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired);
+ address pair = UniswapV2Library.pairFor(router.factory(), tokenA, tokenB);
+ IERC20(tokenA).safeTransfer(pair, amountA);
+ IERC20(tokenB).safeTransfer(pair, amountB);
+ IUniswapV2Pair(pair).mint(msg.sender);
+ }
+
+ function _addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint256 amountADesired,
+ uint256 amountBDesired
+ ) internal returns (uint256 amountA, uint256 amountB) {
+ // create the pair if it doesn't exist yet
+ IUniswapV2Factory factory = IUniswapV2Factory(router.factory());
+ if (factory.getPair(tokenA, tokenB) == address(0)) {
+ factory.createPair(tokenA, tokenB);
+ }
+ (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(address(factory), tokenA, tokenB);
+ if (reserveA == 0 && reserveB == 0) {
+ (amountA, amountB) = (amountADesired, amountBDesired);
+ } else {
+ uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
+ if (amountBOptimal <= amountBDesired) {
+ (amountA, amountB) = (amountADesired, amountBOptimal);
+ } else {
+ uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
+ assert(amountAOptimal <= amountADesired);
+ (amountA, amountB) = (amountAOptimal, amountBDesired);
+ }
+ }
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/SushiToken.sol b/omgx_utilities/contracts-analyzer/contracts/SushiToken.sol
new file mode 100644
index 000000000000..c57abe96260b
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/SushiToken.sol
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+
+
+// SushiToken with Governance.
+contract SushiToken is ERC20("SushiToken", "SUSHI"), Ownable {
+ /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef).
+ function mint(address _to, uint256 _amount) public onlyOwner {
+ _mint(_to, _amount);
+ _moveDelegates(address(0), _delegates[_to], _amount);
+ }
+
+ // Copied and modified from YAM code:
+ // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
+ // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
+ // Which is copied and modified from COMPOUND:
+ // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol
+
+ // @notice A record of each accounts delegate
+ mapping (address => address) internal _delegates;
+
+ /// @notice A checkpoint for marking number of votes from a given block
+ struct Checkpoint {
+ uint32 fromBlock;
+ uint256 votes;
+ }
+
+ /// @notice A record of votes checkpoints for each account, by index
+ mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
+
+ /// @notice The number of checkpoints for each account
+ mapping (address => uint32) public numCheckpoints;
+
+ /// @notice The EIP-712 typehash for the contract's domain
+ bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
+
+ /// @notice The EIP-712 typehash for the delegation struct used by the contract
+ bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
+
+ /// @notice A record of states for signing / validating signatures
+ mapping (address => uint) public nonces;
+
+ /// @notice An event thats emitted when an account changes its delegate
+ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
+
+ /// @notice An event thats emitted when a delegate account's vote balance changes
+ event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
+
+ /**
+ * @notice Delegate votes from `msg.sender` to `delegatee`
+ * @param delegator The address to get delegatee for
+ */
+ function delegates(address delegator)
+ external
+ view
+ returns (address)
+ {
+ return _delegates[delegator];
+ }
+
+ /**
+ * @notice Delegate votes from `msg.sender` to `delegatee`
+ * @param delegatee The address to delegate votes to
+ */
+ function delegate(address delegatee) external {
+ return _delegate(msg.sender, delegatee);
+ }
+
+ /**
+ * @notice Delegates votes from signatory to `delegatee`
+ * @param delegatee The address to delegate votes to
+ * @param nonce The contract state required to match the signature
+ * @param expiry The time at which to expire the signature
+ * @param v The recovery byte of the signature
+ * @param r Half of the ECDSA signature pair
+ * @param s Half of the ECDSA signature pair
+ */
+ function delegateBySig(
+ address delegatee,
+ uint nonce,
+ uint expiry,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ )
+ external
+ {
+ bytes32 domainSeparator = keccak256(
+ abi.encode(
+ DOMAIN_TYPEHASH,
+ keccak256(bytes(name())),
+ getChainId(),
+ address(this)
+ )
+ );
+
+ bytes32 structHash = keccak256(
+ abi.encode(
+ DELEGATION_TYPEHASH,
+ delegatee,
+ nonce,
+ expiry
+ )
+ );
+
+ bytes32 digest = keccak256(
+ abi.encodePacked(
+ "\x19\x01",
+ domainSeparator,
+ structHash
+ )
+ );
+
+ address signatory = ecrecover(digest, v, r, s);
+ require(signatory != address(0), "SUSHI::delegateBySig: invalid signature");
+ require(nonce == nonces[signatory]++, "SUSHI::delegateBySig: invalid nonce");
+ require(block.timestamp <= expiry, "SUSHI::delegateBySig: signature expired");
+ return _delegate(signatory, delegatee);
+ }
+
+ /**
+ * @notice Gets the current votes balance for `account`
+ * @param account The address to get votes balance
+ * @return The number of current votes for `account`
+ */
+ function getCurrentVotes(address account)
+ external
+ view
+ returns (uint256)
+ {
+ uint32 nCheckpoints = numCheckpoints[account];
+ return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
+ }
+
+ /**
+ * @notice Determine the prior number of votes for an account as of a block number
+ * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
+ * @param account The address of the account to check
+ * @param blockNumber The block number to get the vote balance at
+ * @return The number of votes the account had as of the given block
+ */
+ function getPriorVotes(address account, uint blockNumber)
+ external
+ view
+ returns (uint256)
+ {
+ require(blockNumber < block.number, "SUSHI::getPriorVotes: not yet determined");
+
+ uint32 nCheckpoints = numCheckpoints[account];
+ if (nCheckpoints == 0) {
+ return 0;
+ }
+
+ // First check most recent balance
+ if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
+ return checkpoints[account][nCheckpoints - 1].votes;
+ }
+
+ // Next check implicit zero balance
+ if (checkpoints[account][0].fromBlock > blockNumber) {
+ return 0;
+ }
+
+ uint32 lower = 0;
+ uint32 upper = nCheckpoints - 1;
+ while (upper > lower) {
+ uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
+ Checkpoint memory cp = checkpoints[account][center];
+ if (cp.fromBlock == blockNumber) {
+ return cp.votes;
+ } else if (cp.fromBlock < blockNumber) {
+ lower = center;
+ } else {
+ upper = center - 1;
+ }
+ }
+ return checkpoints[account][lower].votes;
+ }
+
+ function _delegate(address delegator, address delegatee)
+ internal
+ {
+ address currentDelegate = _delegates[delegator];
+ uint256 delegatorBalance = balanceOf(delegator); // balance of underlying SUSHIs (not scaled);
+ _delegates[delegator] = delegatee;
+
+ emit DelegateChanged(delegator, currentDelegate, delegatee);
+
+ _moveDelegates(currentDelegate, delegatee, delegatorBalance);
+ }
+
+ function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
+ if (srcRep != dstRep && amount > 0) {
+ if (srcRep != address(0)) {
+ // decrease old representative
+ uint32 srcRepNum = numCheckpoints[srcRep];
+ uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
+ uint256 srcRepNew = srcRepOld.sub(amount);
+ _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
+ }
+
+ if (dstRep != address(0)) {
+ // increase new representative
+ uint32 dstRepNum = numCheckpoints[dstRep];
+ uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
+ uint256 dstRepNew = dstRepOld.add(amount);
+ _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
+ }
+ }
+ }
+
+ function _writeCheckpoint(
+ address delegatee,
+ uint32 nCheckpoints,
+ uint256 oldVotes,
+ uint256 newVotes
+ )
+ internal
+ {
+ uint32 blockNumber = safe32(block.number, "SUSHI::_writeCheckpoint: block number exceeds 32 bits");
+
+ if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
+ checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
+ } else {
+ checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
+ numCheckpoints[delegatee] = nCheckpoints + 1;
+ }
+
+ emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
+ }
+
+ function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
+ require(n < 2**32, errorMessage);
+ return uint32(n);
+ }
+
+ function getChainId() internal pure returns (uint) {
+ // CHANGE_OMGX
+ uint256 chainId = 420;
+ return chainId;
+ }
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/bentobox/BentoBoxV1.sol b/omgx_utilities/contracts-analyzer/contracts/bentobox/BentoBoxV1.sol
new file mode 100644
index 000000000000..a0c9e194eef0
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/bentobox/BentoBoxV1.sol
@@ -0,0 +1,1153 @@
+// SPDX-License-Identifier: UNLICENSED
+// The BentoBox
+
+// ▄▄▄▄· â–„â–„â–„ . â– â–„ â–„â–„â–„â–„â–„ ▄▄▄▄· â–▄• â–„
+// â–â–ˆ ▀█▪▀▄.▀·█▌â–█•██ â–ª â–â–ˆ ▀█▪▪ █▌█▌▪
+// â–█▀▀█▄â–▀▀▪▄â–â–ˆâ–â–â–Œ â–â–ˆ.â–ª ▄█▀▄ â–█▀▀█▄ ▄█▀▄ ·██·
+// ██▄▪â–â–ˆâ–█▄▄▌██â–█▌ â–█▌·â–█▌.â–▌██▄▪â–â–ˆâ–█▌.â–▌▪â–█·█▌
+// ·▀▀▀▀ ▀▀▀ ▀▀ █▪ ▀▀▀ ▀█▄▀▪·▀▀▀▀ ▀█▄▀▪•▀▀ ▀▀
+
+// This contract stores funds, handles their transfers, supports flash loans and strategies.
+
+// Copyright (c) 2021 BoringCrypto - All rights reserved
+// Twitter: @Boring_Crypto
+
+// Special thanks to Keno for all his hard work and support
+
+// Version 22-Mar-2021
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+// solhint-disable avoid-low-level-calls
+// solhint-disable not-rely-on-time
+// solhint-disable no-inline-assembly
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IERC20 {
+ function totalSupply() external view returns (uint256);
+
+ function balanceOf(address account) external view returns (uint256);
+
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice EIP 2612
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+}
+
+// File contracts/interfaces/IFlashLoan.sol
+// License-Identifier: MIT
+
+interface IFlashBorrower {
+ /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.
+ /// @param sender The address of the invoker of this flashloan.
+ /// @param token The address of the token that is loaned.
+ /// @param amount of the `token` that is loaned.
+ /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.
+ /// @param data Additional data that was passed to the flashloan function.
+ function onFlashLoan(
+ address sender,
+ IERC20 token,
+ uint256 amount,
+ uint256 fee,
+ bytes calldata data
+ ) external;
+}
+
+interface IBatchFlashBorrower {
+ /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.
+ /// @param sender The address of the invoker of this flashloan.
+ /// @param tokens Array of addresses for ERC-20 tokens that is loaned.
+ /// @param amounts A one-to-one map to `tokens` that is loaned.
+ /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.
+ /// @param data Additional data that was passed to the flashloan function.
+ function onBatchFlashLoan(
+ address sender,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ uint256[] calldata fees,
+ bytes calldata data
+ ) external;
+}
+
+// File contracts/interfaces/IWETH.sol
+// License-Identifier: MIT
+
+interface IWETH {
+ function deposit() external payable;
+
+ function withdraw(uint256) external;
+}
+
+// File contracts/interfaces/IStrategy.sol
+// License-Identifier: MIT
+
+interface IStrategy {
+ /// @notice Send the assets to the Strategy and call skim to invest them.
+ /// @param amount The amount of tokens to invest.
+ function skim(uint256 amount) external;
+
+ /// @notice Harvest any profits made converted to the asset and pass them to the caller.
+ /// @param balance The amount of tokens the caller thinks it has invested.
+ /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.
+ /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.
+ function harvest(uint256 balance, address sender) external returns (int256 amountAdded);
+
+ /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.
+ /// @dev The `actualAmount` should be very close to the amount.
+ /// The difference should NOT be used to report a loss. That's what harvest is for.
+ /// @param amount The requested amount the caller wants to withdraw.
+ /// @return actualAmount The real amount that is withdrawn.
+ function withdraw(uint256 amount) external returns (uint256 actualAmount);
+
+ /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.
+ /// @param balance The amount of tokens the caller thinks it has invested.
+ /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.
+ function exit(uint256 balance) external returns (int256 amountAdded);
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+library BoringERC20 {
+ bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
+ bytes4 private constant SIG_NAME = 0x06fdde03; // name()
+ bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
+ bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
+ bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)
+
+ /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
+ /// Reverts on a failed transfer.
+ /// @param token The address of the ERC-20 token.
+ /// @param to Transfer tokens to.
+ /// @param amount The token amount.
+ function safeTransfer(
+ IERC20 token,
+ address to,
+ uint256 amount
+ ) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
+ }
+
+ /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
+ /// Reverts on a failed transfer.
+ /// @param token The address of the ERC-20 token.
+ /// @param from Transfer tokens from.
+ /// @param to Transfer tokens to.
+ /// @param amount The token amount.
+ function safeTransferFrom(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 amount
+ ) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0
+// License-Identifier: MIT
+
+/// @notice A library for performing overflow-/underflow-safe math,
+/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).
+library BoringMath {
+ function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+
+ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow");
+ }
+
+ function to128(uint256 a) internal pure returns (uint128 c) {
+ require(a <= uint128(-1), "BoringMath: uint128 Overflow");
+ c = uint128(a);
+ }
+
+ function to64(uint256 a) internal pure returns (uint64 c) {
+ require(a <= uint64(-1), "BoringMath: uint64 Overflow");
+ c = uint64(a);
+ }
+
+ function to32(uint256 a) internal pure returns (uint32 c) {
+ require(a <= uint32(-1), "BoringMath: uint32 Overflow");
+ c = uint32(a);
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.
+library BoringMath128 {
+ function add(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.
+library BoringMath64 {
+ function add(uint64 a, uint64 b) internal pure returns (uint64 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.
+library BoringMath32 {
+ function add(uint32 a, uint32 b) internal pure returns (uint32 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0
+// License-Identifier: MIT
+
+struct Rebase {
+ uint128 elastic;
+ uint128 base;
+}
+
+/// @notice A rebasing library using overflow-/underflow-safe math.
+library RebaseLibrary {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+
+ /// @notice Calculates the base value in relationship to `elastic` and `total`.
+ function toBase(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (uint256 base) {
+ if (total.elastic == 0) {
+ base = elastic;
+ } else {
+ base = elastic.mul(total.base) / total.elastic;
+ if (roundUp && base.mul(total.elastic) / total.base < elastic) {
+ base = base.add(1);
+ }
+ }
+ }
+
+ /// @notice Calculates the elastic value in relationship to `base` and `total`.
+ function toElastic(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (uint256 elastic) {
+ if (total.base == 0) {
+ elastic = base;
+ } else {
+ elastic = base.mul(total.elastic) / total.base;
+ if (roundUp && elastic.mul(total.base) / total.elastic < base) {
+ elastic = elastic.add(1);
+ }
+ }
+ }
+
+ /// @notice Add `elastic` to `total` and doubles `total.base`.
+ /// @return (Rebase) The new total.
+ /// @return base in relationship to `elastic`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 base) {
+ base = toBase(total, elastic, roundUp);
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return (total, base);
+ }
+
+ /// @notice Sub `base` from `total` and update `total.elastic`.
+ /// @return (Rebase) The new total.
+ /// @return elastic in relationship to `base`.
+ function sub(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 elastic) {
+ elastic = toElastic(total, base, roundUp);
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return (total, elastic);
+ }
+
+ /// @notice Add `elastic` and `base` to `total`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return total;
+ }
+
+ /// @notice Subtract `elastic` and `base` to `total`.
+ function sub(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return total;
+ }
+
+ /// @notice Add `elastic` to `total` and update storage.
+ /// @return newElastic Returns updated `elastic`.
+ function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {
+ newElastic = total.elastic = total.elastic.add(elastic.to128());
+ }
+
+ /// @notice Subtract `elastic` from `total` and update storage.
+ /// @return newElastic Returns updated `elastic`.
+ function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {
+ newElastic = total.elastic = total.elastic.sub(elastic.to128());
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0
+// License-Identifier: MIT
+
+// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
+// Edited by BoringCrypto
+
+contract BoringOwnableData {
+ address public owner;
+ address public pendingOwner;
+}
+
+contract BoringOwnable is BoringOwnableData {
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ /// @notice `owner` defaults to msg.sender on construction.
+ constructor() public {
+ owner = msg.sender;
+ emit OwnershipTransferred(address(0), msg.sender);
+ }
+
+ /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
+ /// Can only be invoked by the current `owner`.
+ /// @param newOwner Address of the new owner.
+ /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
+ /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
+ function transferOwnership(
+ address newOwner,
+ bool direct,
+ bool renounce
+ ) public onlyOwner {
+ if (direct) {
+ // Checks
+ require(newOwner != address(0) || renounce, "Ownable: zero address");
+
+ // Effects
+ emit OwnershipTransferred(owner, newOwner);
+ owner = newOwner;
+ pendingOwner = address(0);
+ } else {
+ // Effects
+ pendingOwner = newOwner;
+ }
+ }
+
+ /// @notice Needs to be called by `pendingOwner` to claim ownership.
+ function claimOwnership() public {
+ address _pendingOwner = pendingOwner;
+
+ // Checks
+ require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
+
+ // Effects
+ emit OwnershipTransferred(owner, _pendingOwner);
+ owner = _pendingOwner;
+ pendingOwner = address(0);
+ }
+
+ /// @notice Only allows the `owner` to execute the function.
+ modifier onlyOwner() {
+ require(msg.sender == owner, "Ownable: caller is not the owner");
+ _;
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IMasterContract {
+ /// @notice Init function that gets called from `BoringFactory.deploy`.
+ /// Also kown as the constructor for cloned contracts.
+ /// Any ETH send to `BoringFactory.deploy` ends up here.
+ /// @param data Can be abi encoded arguments or anything else.
+ function init(bytes calldata data) external payable;
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0
+// License-Identifier: MIT
+
+contract BoringFactory {
+ event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);
+
+ /// @notice Mapping from clone contracts to their masterContract.
+ mapping(address => address) public masterContractOf;
+
+ /// @notice Deploys a given master Contract as a clone.
+ /// Any ETH transferred with this call is forwarded to the new clone.
+ /// Emits `LogDeploy`.
+ /// @param masterContract The address of the contract to clone.
+ /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.
+ /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.
+ /// @return cloneAddress Address of the created clone contract.
+ function deploy(
+ address masterContract,
+ bytes calldata data,
+ bool useCreate2
+ ) public payable returns (address cloneAddress) {
+ require(masterContract != address(0), "BoringFactory: No masterContract");
+ bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address
+
+ if (useCreate2) {
+ // each masterContract has different code already. So clones are distinguished by their data only.
+ bytes32 salt = keccak256(data);
+
+ // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/
+ assembly {
+ let clone := mload(0x40)
+ mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
+ mstore(add(clone, 0x14), targetBytes)
+ mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
+ cloneAddress := create2(0, clone, 0x37, salt)
+ }
+ } else {
+ assembly {
+ let clone := mload(0x40)
+ mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
+ mstore(add(clone, 0x14), targetBytes)
+ mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
+ cloneAddress := create(0, clone, 0x37)
+ }
+ }
+ masterContractOf[cloneAddress] = masterContract;
+
+ IMasterContract(cloneAddress).init{value: msg.value}(data);
+
+ emit LogDeploy(masterContract, data, cloneAddress);
+ }
+}
+
+// File contracts/MasterContractManager.sol
+// License-Identifier: UNLICENSED
+
+contract MasterContractManager is BoringOwnable, BoringFactory {
+ event LogWhiteListMasterContract(address indexed masterContract, bool approved);
+ event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);
+ event LogRegisterProtocol(address indexed protocol);
+
+ /// @notice masterContract to user to approval state
+ mapping(address => mapping(address => bool)) public masterContractApproved;
+ /// @notice masterContract to whitelisted state for approval without signed message
+ mapping(address => bool) public whitelistedMasterContracts;
+ /// @notice user nonces for masterContract approvals
+ mapping(address => uint256) public nonces;
+
+ bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
+ // See https://eips.ethereum.org/EIPS/eip-191
+ string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";
+ bytes32 private constant APPROVAL_SIGNATURE_HASH =
+ keccak256("SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)");
+
+ // solhint-disable-next-line var-name-mixedcase
+ bytes32 private immutable _DOMAIN_SEPARATOR;
+ // solhint-disable-next-line var-name-mixedcase
+ uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;
+
+ constructor() public {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);
+ }
+
+ function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
+ return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256("BentoBox V1"), chainId, address(this)));
+ }
+
+ // solhint-disable-next-line func-name-mixedcase
+ function DOMAIN_SEPARATOR() public view returns (bytes32) {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
+ }
+
+ /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.
+ function registerProtocol() public {
+ masterContractOf[msg.sender] = msg.sender;
+ emit LogRegisterProtocol(msg.sender);
+ }
+
+ /// @notice Enables or disables a contract for approval without signed message.
+ function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {
+ // Checks
+ require(masterContract != address(0), "MasterCMgr: Cannot approve 0");
+
+ // Effects
+ whitelistedMasterContracts[masterContract] = approved;
+ emit LogWhiteListMasterContract(masterContract, approved);
+ }
+
+ /// @notice Approves or revokes a `masterContract` access to `user` funds.
+ /// @param user The address of the user that approves or revokes access.
+ /// @param masterContract The address who gains or loses access.
+ /// @param approved If True approves access. If False revokes access.
+ /// @param v Part of the signature. (See EIP-191)
+ /// @param r Part of the signature. (See EIP-191)
+ /// @param s Part of the signature. (See EIP-191)
+ // F4 - Check behaviour for all function arguments when wrong or extreme
+ // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.
+ // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails
+ function setMasterContractApproval(
+ address user,
+ address masterContract,
+ bool approved,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public {
+ // Checks
+ require(masterContract != address(0), "MasterCMgr: masterC not set"); // Important for security
+
+ // If no signature is provided, the fallback is executed
+ if (r == 0 && s == 0 && v == 0) {
+ require(user == msg.sender, "MasterCMgr: user not sender");
+ require(masterContractOf[user] == address(0), "MasterCMgr: user is clone");
+ require(whitelistedMasterContracts[masterContract], "MasterCMgr: not whitelisted");
+ } else {
+ // Important for security - any address without masterContract has address(0) as masterContract
+ // So approving address(0) would approve every address, leading to full loss of funds
+ // Also, ecrecover returns address(0) on failure. So we check this:
+ require(user != address(0), "MasterCMgr: User cannot be 0");
+
+ // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)
+ // C10: nonce + chainId are used to prevent replays
+ // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)
+ // C11: signature is EIP-712 compliant
+ // C12 - abi.encodePacked can't contain variable length user input (SWC-133)
+ // C12: abi.encodePacked has fixed length parameters
+ bytes32 digest =
+ keccak256(
+ abi.encodePacked(
+ EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,
+ DOMAIN_SEPARATOR(),
+ keccak256(
+ abi.encode(
+ APPROVAL_SIGNATURE_HASH,
+ approved
+ ? keccak256("Give FULL access to funds in (and approved to) BentoBox?")
+ : keccak256("Revoke access to BentoBox?"),
+ user,
+ masterContract,
+ approved,
+ nonces[user]++
+ )
+ )
+ )
+ );
+ address recoveredAddress = ecrecover(digest, v, r, s);
+ require(recoveredAddress == user, "MasterCMgr: Invalid Signature");
+ }
+
+ // Effects
+ masterContractApproved[masterContract][user] = approved;
+ emit LogSetMasterContractApproval(masterContract, user, approved);
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0
+// License-Identifier: MIT
+
+contract BaseBoringBatchable {
+ /// @dev Helper function to extract a useful revert message from a failed call.
+ /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.
+ function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
+ // If the _res length is less than 68, then the transaction failed silently (without a revert message)
+ if (_returnData.length < 68) return "Transaction reverted silently";
+
+ assembly {
+ // Slice the sighash.
+ _returnData := add(_returnData, 0x04)
+ }
+ return abi.decode(_returnData, (string)); // All that remains is the revert string
+ }
+
+ /// @notice Allows batched call to self (this contract).
+ /// @param calls An array of inputs for each call.
+ /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.
+ /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.
+ /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.
+ // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
+ // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
+ // C3: The length of the loop is fully under user control, so can't be exploited
+ // C7: Delegatecall is only used on the same contract, so it's safe
+ function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {
+ successes = new bool[](calls.length);
+ results = new bytes[](calls.length);
+ for (uint256 i = 0; i < calls.length; i++) {
+ (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
+ require(success || !revertOnFail, _getRevertMsg(result));
+ successes[i] = success;
+ results[i] = result;
+ }
+ }
+}
+
+contract BoringBatchable is BaseBoringBatchable {
+ /// @notice Call wrapper that performs `ERC20.permit` on `token`.
+ /// Lookup `IERC20.permit`.
+ // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
+ // if part of a batch this could be used to grief once as the second call would not need the permit
+ function permitToken(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) public {
+ token.permit(from, to, amount, deadline, v, r, s);
+ }
+}
+
+// File contracts/BentoBox.sol
+// License-Identifier: UNLICENSED
+
+/// @title BentoBox
+/// @author BoringCrypto, Keno
+/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.
+/// Yield from this will go to the token depositors.
+/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.
+/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.
+contract BentoBoxV1 is MasterContractManager, BoringBatchable {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+ using RebaseLibrary for Rebase;
+
+ // ************** //
+ // *** EVENTS *** //
+ // ************** //
+
+ event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);
+
+ event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);
+
+ event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);
+ event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);
+ event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);
+ event LogStrategyInvest(IERC20 indexed token, uint256 amount);
+ event LogStrategyDivest(IERC20 indexed token, uint256 amount);
+ event LogStrategyProfit(IERC20 indexed token, uint256 amount);
+ event LogStrategyLoss(IERC20 indexed token, uint256 amount);
+
+ // *************** //
+ // *** STRUCTS *** //
+ // *************** //
+
+ struct StrategyData {
+ uint64 strategyStartDate;
+ uint64 targetPercentage;
+ uint128 balance; // the balance of the strategy that BentoBox thinks is in there
+ }
+
+ // ******************************** //
+ // *** CONSTANTS AND IMMUTABLES *** //
+ // ******************************** //
+
+ // V2 - Can they be private?
+ // V2: Private to save gas, to verify it's correct, check the constructor arguments
+ IERC20 private immutable wethToken;
+
+ IERC20 private constant USE_ETHEREUM = IERC20(0);
+ uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%
+ uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;
+ uint256 private constant STRATEGY_DELAY = 2 weeks;
+ uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%
+ uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off
+
+ // ***************** //
+ // *** VARIABLES *** //
+ // ***************** //
+
+ // Balance per token per address/contract in shares
+ mapping(IERC20 => mapping(address => uint256)) public balanceOf;
+
+ // Rebase from amount to share
+ mapping(IERC20 => Rebase) public totals;
+
+ mapping(IERC20 => IStrategy) public strategy;
+ mapping(IERC20 => IStrategy) public pendingStrategy;
+ mapping(IERC20 => StrategyData) public strategyData;
+
+ // ******************* //
+ // *** CONSTRUCTOR *** //
+ // ******************* //
+
+ constructor(IERC20 wethToken_) public {
+ wethToken = wethToken_;
+ }
+
+ // ***************** //
+ // *** MODIFIERS *** //
+ // ***************** //
+
+ /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.
+ /// If 'from' is msg.sender, it's allowed.
+ /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances
+ /// can be taken by anyone.
+ /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.
+ /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.
+ modifier allowed(address from) {
+ if (from != msg.sender && from != address(this)) {
+ // From is sender or you are skimming
+ address masterContract = masterContractOf[msg.sender];
+ require(masterContract != address(0), "BentoBox: no masterContract");
+ require(masterContractApproved[masterContract][from], "BentoBox: Transfer not approved");
+ }
+ _;
+ }
+
+ // ************************** //
+ // *** INTERNAL FUNCTIONS *** //
+ // ************************** //
+
+ /// @dev Returns the total balance of `token` this contracts holds,
+ /// plus the total amount this contract thinks the strategy holds.
+ function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {
+ amount = token.balanceOf(address(this)).add(strategyData[token].balance);
+ }
+
+ // ************************ //
+ // *** PUBLIC FUNCTIONS *** //
+ // ************************ //
+
+ /// @dev Helper function to represent an `amount` of `token` in shares.
+ /// @param token The ERC-20 token.
+ /// @param amount The `token` amount.
+ /// @param roundUp If the result `share` should be rounded up.
+ /// @return share The token amount represented in shares.
+ function toShare(
+ IERC20 token,
+ uint256 amount,
+ bool roundUp
+ ) external view returns (uint256 share) {
+ share = totals[token].toBase(amount, roundUp);
+ }
+
+ /// @dev Helper function represent shares back into the `token` amount.
+ /// @param token The ERC-20 token.
+ /// @param share The amount of shares.
+ /// @param roundUp If the result should be rounded up.
+ /// @return amount The share amount back into native representation.
+ function toAmount(
+ IERC20 token,
+ uint256 share,
+ bool roundUp
+ ) external view returns (uint256 amount) {
+ amount = totals[token].toElastic(share, roundUp);
+ }
+
+ /// @notice Deposit an amount of `token` represented in either `amount` or `share`.
+ /// @param token_ The ERC-20 token to deposit.
+ /// @param from which account to pull the tokens.
+ /// @param to which account to push the tokens.
+ /// @param amount Token amount in native representation to deposit.
+ /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.
+ /// @return amountOut The amount deposited.
+ /// @return shareOut The deposited amount repesented in shares.
+ function deposit(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {
+ // Checks
+ require(to != address(0), "BentoBox: to not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;
+ Rebase memory total = totals[token];
+
+ // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.
+ require(total.elastic != 0 || token.totalSupply() > 0, "BentoBox: No tokens");
+ if (share == 0) {
+ // value of the share may be lower than the amount due to rounding, that's ok
+ share = total.toBase(amount, false);
+ // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)
+ if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {
+ return (0, 0);
+ }
+ } else {
+ // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)
+ amount = total.toElastic(share, true);
+ }
+
+ // In case of skimming, check that only the skimmable amount is taken.
+ // For ETH, the full balance is available, so no need to check.
+ // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.
+ require(
+ from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),
+ "BentoBox: Skim too much"
+ );
+
+ balanceOf[token][to] = balanceOf[token][to].add(share);
+ total.base = total.base.add(share.to128());
+ total.elastic = total.elastic.add(amount.to128());
+ totals[token] = total;
+
+ // Interactions
+ // During the first deposit, we check that this token is 'real'
+ if (token_ == USE_ETHEREUM) {
+ // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)
+ // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)
+ IWETH(address(wethToken)).deposit{value: amount}();
+ } else if (from != address(this)) {
+ // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)
+ // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.
+ token.safeTransferFrom(from, address(this), amount);
+ }
+ emit LogDeposit(token, from, to, amount, share);
+ amountOut = amount;
+ shareOut = share;
+ }
+
+ /// @notice Withdraws an amount of `token` from a user account.
+ /// @param token_ The ERC-20 token to withdraw.
+ /// @param from which user to pull the tokens.
+ /// @param to which user to push the tokens.
+ /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.
+ /// @param share Like above, but `share` takes precedence over `amount`.
+ function withdraw(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {
+ // Checks
+ require(to != address(0), "BentoBox: to not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;
+ Rebase memory total = totals[token];
+ if (share == 0) {
+ // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)
+ share = total.toBase(amount, true);
+ } else {
+ // amount may be lower than the value of share due to rounding, that's ok
+ amount = total.toElastic(share, false);
+ }
+
+ balanceOf[token][from] = balanceOf[token][from].sub(share);
+ total.elastic = total.elastic.sub(amount.to128());
+ total.base = total.base.sub(share.to128());
+ // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)
+ require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, "BentoBox: cannot empty");
+ totals[token] = total;
+
+ // Interactions
+ if (token_ == USE_ETHEREUM) {
+ // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.
+ IWETH(address(wethToken)).withdraw(amount);
+ // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.
+ (bool success, ) = to.call{value: amount}("");
+ require(success, "BentoBox: ETH transfer failed");
+ } else {
+ // X2, X3: A malicious token could block withdrawal of just THAT token.
+ // masterContracts may want to take care not to rely on withdraw always succeeding.
+ token.safeTransfer(to, amount);
+ }
+ emit LogWithdraw(token, from, to, amount, share);
+ amountOut = amount;
+ shareOut = share;
+ }
+
+ /// @notice Transfer shares from a user account to another one.
+ /// @param token The ERC-20 token to transfer.
+ /// @param from which user to pull the tokens.
+ /// @param to which user to push the tokens.
+ /// @param share The amount of `token` in shares.
+ // Clones of master contracts can transfer from any account that has approved them
+ // F3 - Can it be combined with another similar function?
+ // F3: This isn't combined with transferMultiple for gas optimization
+ function transfer(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 share
+ ) public allowed(from) {
+ // Checks
+ require(to != address(0), "BentoBox: to not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ balanceOf[token][from] = balanceOf[token][from].sub(share);
+ balanceOf[token][to] = balanceOf[token][to].add(share);
+
+ emit LogTransfer(token, from, to, share);
+ }
+
+ /// @notice Transfer shares from a user account to multiple other ones.
+ /// @param token The ERC-20 token to transfer.
+ /// @param from which user to pull the tokens.
+ /// @param tos The receivers of the tokens.
+ /// @param shares The amount of `token` in shares for each receiver in `tos`.
+ // F3 - Can it be combined with another similar function?
+ // F3: This isn't combined with transfer for gas optimization
+ function transferMultiple(
+ IERC20 token,
+ address from,
+ address[] calldata tos,
+ uint256[] calldata shares
+ ) public allowed(from) {
+ // Checks
+ require(tos[0] != address(0), "BentoBox: to[0] not set"); // To avoid a bad UI from burning funds
+
+ // Effects
+ uint256 totalAmount;
+ uint256 len = tos.length;
+ for (uint256 i = 0; i < len; i++) {
+ address to = tos[i];
+ balanceOf[token][to] = balanceOf[token][to].add(shares[i]);
+ totalAmount = totalAmount.add(shares[i]);
+ emit LogTransfer(token, from, to, shares[i]);
+ }
+ balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);
+ }
+
+ /// @notice Flashloan ability.
+ /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.
+ /// @param receiver Address of the token receiver.
+ /// @param token The address of the token to receive.
+ /// @param amount of the tokens to receive.
+ /// @param data The calldata to pass to the `borrower` contract.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Not possible to follow this here, reentrancy has been reviewed
+ // F6 - Check for front-running possibilities, such as the approve function (SWC-114)
+ // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.
+ function flashLoan(
+ IFlashBorrower borrower,
+ address receiver,
+ IERC20 token,
+ uint256 amount,
+ bytes calldata data
+ ) public {
+ uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;
+ token.safeTransfer(receiver, amount);
+
+ borrower.onFlashLoan(msg.sender, token, amount, fee, data);
+
+ require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), "BentoBox: Wrong amount");
+ emit LogFlashLoan(address(borrower), token, amount, fee, receiver);
+ }
+
+ /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.
+ /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.
+ /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.
+ /// @param tokens The addresses of the tokens.
+ /// @param amounts of the tokens for each receiver.
+ /// @param data The calldata to pass to the `borrower` contract.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Not possible to follow this here, reentrancy has been reviewed
+ // F6 - Check for front-running possibilities, such as the approve function (SWC-114)
+ // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.
+ function batchFlashLoan(
+ IBatchFlashBorrower borrower,
+ address[] calldata receivers,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ bytes calldata data
+ ) public {
+ uint256[] memory fees = new uint256[](tokens.length);
+
+ uint256 len = tokens.length;
+ for (uint256 i = 0; i < len; i++) {
+ uint256 amount = amounts[i];
+ fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;
+
+ tokens[i].safeTransfer(receivers[i], amounts[i]);
+ }
+
+ borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);
+
+ for (uint256 i = 0; i < len; i++) {
+ IERC20 token = tokens[i];
+ require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), "BentoBox: Wrong amount");
+ emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);
+ }
+ }
+
+ /// @notice Sets the target percentage of the strategy for `token`.
+ /// @dev Only the owner of this contract is allowed to change this.
+ /// @param token The address of the token that maps to a strategy to change.
+ /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.
+ function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {
+ // Checks
+ require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, "StrategyManager: Target too high");
+
+ // Effects
+ strategyData[token].targetPercentage = targetPercentage_;
+ emit LogStrategyTargetPercentage(token, targetPercentage_);
+ }
+
+ /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.
+ /// Must be called twice with the same arguments.
+ /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.
+ /// @dev Only the owner of this contract is allowed to change this.
+ /// @param token The address of the token that maps to a strategy to change.
+ /// @param newStrategy The address of the contract that conforms to `IStrategy`.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Total amount is updated AFTER interaction. But strategy is under our control.
+ // C4 - Use block.timestamp only for long intervals (SWC-116)
+ // C4: block.timestamp is used for a period of 2 weeks, which is long enough
+ function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {
+ StrategyData memory data = strategyData[token];
+ IStrategy pending = pendingStrategy[token];
+ if (data.strategyStartDate == 0 || pending != newStrategy) {
+ pendingStrategy[token] = newStrategy;
+ // C1 - All math done through BoringMath (SWC-101)
+ // C1: Our sun will swallow the earth well before this overflows
+ data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();
+ emit LogStrategyQueued(token, newStrategy);
+ } else {
+ require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, "StrategyManager: Too early");
+ if (address(strategy[token]) != address(0)) {
+ int256 balanceChange = strategy[token].exit(data.balance);
+ // Effects
+ if (balanceChange > 0) {
+ uint256 add = uint256(balanceChange);
+ totals[token].addElastic(add);
+ emit LogStrategyProfit(token, add);
+ } else if (balanceChange < 0) {
+ uint256 sub = uint256(-balanceChange);
+ totals[token].subElastic(sub);
+ emit LogStrategyLoss(token, sub);
+ }
+
+ emit LogStrategyDivest(token, data.balance);
+ }
+ strategy[token] = pending;
+ data.strategyStartDate = 0;
+ data.balance = 0;
+ pendingStrategy[token] = IStrategy(0);
+ emit LogStrategySet(token, newStrategy);
+ }
+ strategyData[token] = data;
+ }
+
+ /// @notice The actual process of yield farming. Executes the strategy of `token`.
+ /// Optionally does housekeeping if `balance` is true.
+ /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.
+ /// @param token The address of the token for which a strategy is deployed.
+ /// @param balance True if housekeeping should be done.
+ /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.
+ // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)
+ // F5: Total amount is updated AFTER interaction. But strategy is under our control.
+ // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?
+ function harvest(
+ IERC20 token,
+ bool balance,
+ uint256 maxChangeAmount
+ ) public {
+ StrategyData memory data = strategyData[token];
+ IStrategy _strategy = strategy[token];
+ int256 balanceChange = _strategy.harvest(data.balance, msg.sender);
+ if (balanceChange == 0 && !balance) {
+ return;
+ }
+
+ uint256 totalElastic = totals[token].elastic;
+
+ if (balanceChange > 0) {
+ uint256 add = uint256(balanceChange);
+ totalElastic = totalElastic.add(add);
+ totals[token].elastic = totalElastic.to128();
+ emit LogStrategyProfit(token, add);
+ } else if (balanceChange < 0) {
+ // C1 - All math done through BoringMath (SWC-101)
+ // C1: balanceChange could overflow if it's max negative int128.
+ // But tokens with balances that large are not supported by the BentoBox.
+ uint256 sub = uint256(-balanceChange);
+ totalElastic = totalElastic.sub(sub);
+ totals[token].elastic = totalElastic.to128();
+ data.balance = data.balance.sub(sub.to128());
+ emit LogStrategyLoss(token, sub);
+ }
+
+ if (balance) {
+ uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;
+ // if data.balance == targetBalance there is nothing to update
+ if (data.balance < targetBalance) {
+ uint256 amountOut = targetBalance.sub(data.balance);
+ if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {
+ amountOut = maxChangeAmount;
+ }
+ token.safeTransfer(address(_strategy), amountOut);
+ data.balance = data.balance.add(amountOut.to128());
+ _strategy.skim(amountOut);
+ emit LogStrategyInvest(token, amountOut);
+ } else if (data.balance > targetBalance) {
+ uint256 amountIn = data.balance.sub(targetBalance.to128());
+ if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {
+ amountIn = maxChangeAmount;
+ }
+
+ uint256 actualAmountIn = _strategy.withdraw(amountIn);
+
+ data.balance = data.balance.sub(actualAmountIn.to128());
+ emit LogStrategyDivest(token, actualAmountIn);
+ }
+ }
+
+ strategyData[token] = data;
+ }
+
+ // Contract should be able to receive ETH deposits to support deposit & skim
+ // solhint-disable-next-line no-empty-blocks
+ receive() external payable {}
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/bentobox/KashiPairMediumRiskV1.sol b/omgx_utilities/contracts-analyzer/contracts/bentobox/KashiPairMediumRiskV1.sol
new file mode 100644
index 000000000000..fb2d7a5b8684
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/bentobox/KashiPairMediumRiskV1.sol
@@ -0,0 +1,1437 @@
+// SPDX-License-Identifier: UNLICENSED
+// Kashi Lending Medium Risk
+
+// __ __ __ __ _____ __ __
+// | |/ .---.-.-----| |--|__| | |_.-----.-----.--| |__.-----.-----.
+// | <| _ |__ --| | | | | -__| | _ | | | _ |
+// |__|\__|___._|_____|__|__|__| |_______|_____|__|__|_____|__|__|__|___ |
+// |_____|
+
+// Copyright (c) 2021 BoringCrypto - All rights reserved
+// Twitter: @Boring_Crypto
+
+// Special thanks to:
+// @0xKeno - for all his invaluable contributions
+// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations
+
+// Version: 22-Feb-2021
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+
+// solhint-disable avoid-low-level-calls
+// solhint-disable no-inline-assembly
+// solhint-disable not-rely-on-time
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0
+// License-Identifier: MIT
+
+/// @notice A library for performing overflow-/underflow-safe math,
+/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).
+library BoringMath {
+ function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+
+ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
+ require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow");
+ }
+
+ function to128(uint256 a) internal pure returns (uint128 c) {
+ require(a <= uint128(-1), "BoringMath: uint128 Overflow");
+ c = uint128(a);
+ }
+
+ function to64(uint256 a) internal pure returns (uint64 c) {
+ require(a <= uint64(-1), "BoringMath: uint64 Overflow");
+ c = uint64(a);
+ }
+
+ function to32(uint256 a) internal pure returns (uint32 c) {
+ require(a <= uint32(-1), "BoringMath: uint32 Overflow");
+ c = uint32(a);
+ }
+}
+
+/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.
+library BoringMath128 {
+ function add(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a + b) >= b, "BoringMath: Add Overflow");
+ }
+
+ function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {
+ require((c = a - b) <= a, "BoringMath: Underflow");
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0
+// License-Identifier: MIT
+
+// Audit on 5-Jan-2021 by Keno and BoringCrypto
+// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
+// Edited by BoringCrypto
+
+contract BoringOwnableData {
+ address public owner;
+ address public pendingOwner;
+}
+
+contract BoringOwnable is BoringOwnableData {
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ /// @notice `owner` defaults to msg.sender on construction.
+ constructor() public {
+ owner = msg.sender;
+ emit OwnershipTransferred(address(0), msg.sender);
+ }
+
+ /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
+ /// Can only be invoked by the current `owner`.
+ /// @param newOwner Address of the new owner.
+ /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
+ /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
+ function transferOwnership(
+ address newOwner,
+ bool direct,
+ bool renounce
+ ) public onlyOwner {
+ if (direct) {
+ // Checks
+ require(newOwner != address(0) || renounce, "Ownable: zero address");
+
+ // Effects
+ emit OwnershipTransferred(owner, newOwner);
+ owner = newOwner;
+ pendingOwner = address(0);
+ } else {
+ // Effects
+ pendingOwner = newOwner;
+ }
+ }
+
+ /// @notice Needs to be called by `pendingOwner` to claim ownership.
+ function claimOwnership() public {
+ address _pendingOwner = pendingOwner;
+
+ // Checks
+ require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
+
+ // Effects
+ emit OwnershipTransferred(owner, _pendingOwner);
+ owner = _pendingOwner;
+ pendingOwner = address(0);
+ }
+
+ /// @notice Only allows the `owner` to execute the function.
+ modifier onlyOwner() {
+ require(msg.sender == owner, "Ownable: caller is not the owner");
+ _;
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/Domain.sol@v1.2.0
+// License-Identifier: MIT
+// Based on code and smartness by Ross Campbell and Keno
+// Uses immutable to store the domain separator to reduce gas usage
+// If the chain id changes due to a fork, the forked chain will calculate on the fly.
+
+contract Domain {
+ bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(uint256 chainId,address verifyingContract)");
+ // See https://eips.ethereum.org/EIPS/eip-191
+ string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";
+
+ // solhint-disable var-name-mixedcase
+ bytes32 private immutable _DOMAIN_SEPARATOR;
+ uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;
+
+ /// @dev Calculate the DOMAIN_SEPARATOR
+ function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
+ return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));
+ }
+
+ constructor() public {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);
+ }
+
+ /// @dev Return the DOMAIN_SEPARATOR
+ // It's named internal to allow making it public from the contract that uses it by creating a simple view function
+ // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.
+ // solhint-disable-next-line func-name-mixedcase
+ function DOMAIN_SEPARATOR() public view returns (bytes32) {
+ uint256 chainId;
+ assembly {
+ chainId := chainid()
+ }
+ return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
+ }
+
+ function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {
+ digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+// solhint-disable no-inline-assembly
+// solhint-disable not-rely-on-time
+
+// Data part taken out for building of contracts that receive delegate calls
+contract ERC20Data {
+ /// @notice owner > balance mapping.
+ mapping(address => uint256) public balanceOf;
+ /// @notice owner > spender > allowance mapping.
+ mapping(address => mapping(address => uint256)) public allowance;
+ /// @notice owner > nonce mapping. Used in `permit`.
+ mapping(address => uint256) public nonces;
+}
+
+contract ERC20 is ERC20Data, Domain {
+ event Transfer(address indexed _from, address indexed _to, uint256 _value);
+ event Approval(address indexed _owner, address indexed _spender, uint256 _value);
+
+ /// @notice Transfers `amount` tokens from `msg.sender` to `to`.
+ /// @param to The address to move the tokens.
+ /// @param amount of the tokens to move.
+ /// @return (bool) Returns True if succeeded.
+ function transfer(address to, uint256 amount) public returns (bool) {
+ // If `amount` is 0, or `msg.sender` is `to` nothing happens
+ if (amount != 0) {
+ uint256 srcBalance = balanceOf[msg.sender];
+ require(srcBalance >= amount, "ERC20: balance too low");
+ if (msg.sender != to) {
+ require(to != address(0), "ERC20: no zero address"); // Moved down so low balance calls safe some gas
+
+ balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked
+ balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1
+ }
+ }
+ emit Transfer(msg.sender, to, amount);
+ return true;
+ }
+
+ /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.
+ /// @param from Address to draw tokens from.
+ /// @param to The address to move the tokens.
+ /// @param amount The token amount to move.
+ /// @return (bool) Returns True if succeeded.
+ function transferFrom(
+ address from,
+ address to,
+ uint256 amount
+ ) public returns (bool) {
+ // If `amount` is 0, or `from` is `to` nothing happens
+ if (amount != 0) {
+ uint256 srcBalance = balanceOf[from];
+ require(srcBalance >= amount, "ERC20: balance too low");
+
+ if (from != to) {
+ uint256 spenderAllowance = allowance[from][msg.sender];
+ // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).
+ if (spenderAllowance != type(uint256).max) {
+ require(spenderAllowance >= amount, "ERC20: allowance too low");
+ allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked
+ }
+ require(to != address(0), "ERC20: no zero address"); // Moved down so other failed calls safe some gas
+
+ balanceOf[from] = srcBalance - amount; // Underflow is checked
+ balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1
+ }
+ }
+ emit Transfer(from, to, amount);
+ return true;
+ }
+
+ /// @notice Approves `amount` from sender to be spend by `spender`.
+ /// @param spender Address of the party that can draw from msg.sender's account.
+ /// @param amount The maximum collective amount that `spender` can draw.
+ /// @return (bool) Returns True if approved.
+ function approve(address spender, uint256 amount) public returns (bool) {
+ allowance[msg.sender][spender] = amount;
+ emit Approval(msg.sender, spender, amount);
+ return true;
+ }
+
+ // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
+ bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
+
+ /// @notice Approves `value` from `owner_` to be spend by `spender`.
+ /// @param owner_ Address of the owner.
+ /// @param spender The address of the spender that gets approved to draw from `owner_`.
+ /// @param value The maximum collective amount that `spender` can draw.
+ /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).
+ function permit(
+ address owner_,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external {
+ require(owner_ != address(0), "ERC20: Owner cannot be 0");
+ require(block.timestamp < deadline, "ERC20: Expired");
+ require(
+ ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==
+ owner_,
+ "ERC20: Invalid Signature"
+ );
+ allowance[owner_][spender] = value;
+ emit Approval(owner_, spender, value);
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IMasterContract {
+ /// @notice Init function that gets called from `BoringFactory.deploy`.
+ /// Also kown as the constructor for cloned contracts.
+ /// Any ETH send to `BoringFactory.deploy` ends up here.
+ /// @param data Can be abi encoded arguments or anything else.
+ function init(bytes calldata data) external payable;
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0
+// License-Identifier: MIT
+
+struct Rebase {
+ uint128 elastic;
+ uint128 base;
+}
+
+/// @notice A rebasing library using overflow-/underflow-safe math.
+library RebaseLibrary {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+
+ /// @notice Calculates the base value in relationship to `elastic` and `total`.
+ function toBase(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (uint256 base) {
+ if (total.elastic == 0) {
+ base = elastic;
+ } else {
+ base = elastic.mul(total.base) / total.elastic;
+ if (roundUp && base.mul(total.elastic) / total.base < elastic) {
+ base = base.add(1);
+ }
+ }
+ }
+
+ /// @notice Calculates the elastic value in relationship to `base` and `total`.
+ function toElastic(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (uint256 elastic) {
+ if (total.base == 0) {
+ elastic = base;
+ } else {
+ elastic = base.mul(total.elastic) / total.base;
+ if (roundUp && elastic.mul(total.base) / total.elastic < base) {
+ elastic = elastic.add(1);
+ }
+ }
+ }
+
+ /// @notice Add `elastic` to `total` and doubles `total.base`.
+ /// @return (Rebase) The new total.
+ /// @return base in relationship to `elastic`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 base) {
+ base = toBase(total, elastic, roundUp);
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return (total, base);
+ }
+
+ /// @notice Sub `base` from `total` and update `total.elastic`.
+ /// @return (Rebase) The new total.
+ /// @return elastic in relationship to `base`.
+ function sub(
+ Rebase memory total,
+ uint256 base,
+ bool roundUp
+ ) internal pure returns (Rebase memory, uint256 elastic) {
+ elastic = toElastic(total, base, roundUp);
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return (total, elastic);
+ }
+
+ /// @notice Add `elastic` and `base` to `total`.
+ function add(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.add(elastic.to128());
+ total.base = total.base.add(base.to128());
+ return total;
+ }
+
+ /// @notice Subtract `elastic` and `base` to `total`.
+ function sub(
+ Rebase memory total,
+ uint256 elastic,
+ uint256 base
+ ) internal pure returns (Rebase memory) {
+ total.elastic = total.elastic.sub(elastic.to128());
+ total.base = total.base.sub(base.to128());
+ return total;
+ }
+}
+
+// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+interface IERC20 {
+ function totalSupply() external view returns (uint256);
+
+ function balanceOf(address account) external view returns (uint256);
+
+ function allowance(address owner, address spender) external view returns (uint256);
+
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ /// @notice EIP 2612
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+}
+
+// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0
+// License-Identifier: MIT
+
+library BoringERC20 {
+ bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
+ bytes4 private constant SIG_NAME = 0x06fdde03; // name()
+ bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
+ bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
+ bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)
+
+ function returnDataToString(bytes memory data) internal pure returns (string memory) {
+ if (data.length >= 64) {
+ return abi.decode(data, (string));
+ } else if (data.length == 32) {
+ uint8 i = 0;
+ while (i < 32 && data[i] != 0) {
+ i++;
+ }
+ bytes memory bytesArray = new bytes(i);
+ for (i = 0; i < 32 && data[i] != 0; i++) {
+ bytesArray[i] = data[i];
+ }
+ return string(bytesArray);
+ } else {
+ return "???";
+ }
+ }
+
+ /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
+ /// @param token The address of the ERC-20 token contract.
+ /// @return (string) Token symbol.
+ function safeSymbol(IERC20 token) internal view returns (string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));
+ return success ? returnDataToString(data) : "???";
+ }
+
+ /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
+ /// @param token The address of the ERC-20 token contract.
+ /// @return (string) Token name.
+ function safeName(IERC20 token) internal view returns (string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));
+ return success ? returnDataToString(data) : "???";
+ }
+
+ /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
+ /// @param token The address of the ERC-20 token contract.
+ /// @return (uint8) Token decimals.
+ function safeDecimals(IERC20 token) internal view returns (uint8) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));
+ return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
+ }
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IBatchFlashBorrower {
+ function onBatchFlashLoan(
+ address sender,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ uint256[] calldata fees,
+ bytes calldata data
+ ) external;
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IFlashBorrower {
+ function onFlashLoan(
+ address sender,
+ IERC20 token,
+ uint256 amount,
+ uint256 fee,
+ bytes calldata data
+ ) external;
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IStrategy {
+ // Send the assets to the Strategy and call skim to invest them
+ function skim(uint256 amount) external;
+
+ // Harvest any profits made converted to the asset and pass them to the caller
+ function harvest(uint256 balance, address sender) external returns (int256 amountAdded);
+
+ // Withdraw assets. The returned amount can differ from the requested amount due to rounding.
+ // The actualAmount should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for.
+ function withdraw(uint256 amount) external returns (uint256 actualAmount);
+
+ // Withdraw all assets in the safest way possible. This shouldn't fail.
+ function exit(uint256 balance) external returns (int256 amountAdded);
+}
+
+// File @sushiswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1
+// License-Identifier: MIT
+
+interface IBentoBoxV1 {
+ event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);
+ event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);
+ event LogRegisterProtocol(address indexed protocol);
+ event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);
+ event LogStrategyDivest(address indexed token, uint256 amount);
+ event LogStrategyInvest(address indexed token, uint256 amount);
+ event LogStrategyLoss(address indexed token, uint256 amount);
+ event LogStrategyProfit(address indexed token, uint256 amount);
+ event LogStrategyQueued(address indexed token, address indexed strategy);
+ event LogStrategySet(address indexed token, address indexed strategy);
+ event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);
+ event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);
+ event LogWhiteListMasterContract(address indexed masterContract, bool approved);
+ event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ function balanceOf(IERC20, address) external view returns (uint256);
+
+ function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);
+
+ function batchFlashLoan(
+ IBatchFlashBorrower borrower,
+ address[] calldata receivers,
+ IERC20[] calldata tokens,
+ uint256[] calldata amounts,
+ bytes calldata data
+ ) external;
+
+ function claimOwnership() external;
+
+ function deploy(
+ address masterContract,
+ bytes calldata data,
+ bool useCreate2
+ ) external payable;
+
+ function deposit(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) external payable returns (uint256 amountOut, uint256 shareOut);
+
+ function flashLoan(
+ IFlashBorrower borrower,
+ address receiver,
+ IERC20 token,
+ uint256 amount,
+ bytes calldata data
+ ) external;
+
+ function harvest(
+ IERC20 token,
+ bool balance,
+ uint256 maxChangeAmount
+ ) external;
+
+ function masterContractApproved(address, address) external view returns (bool);
+
+ function masterContractOf(address) external view returns (address);
+
+ function nonces(address) external view returns (uint256);
+
+ function owner() external view returns (address);
+
+ function pendingOwner() external view returns (address);
+
+ function pendingStrategy(IERC20) external view returns (IStrategy);
+
+ function permitToken(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+
+ function registerProtocol() external;
+
+ function setMasterContractApproval(
+ address user,
+ address masterContract,
+ bool approved,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external;
+
+ function setStrategy(IERC20 token, IStrategy newStrategy) external;
+
+ function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;
+
+ function strategy(IERC20) external view returns (IStrategy);
+
+ function strategyData(IERC20)
+ external
+ view
+ returns (
+ uint64 strategyStartDate,
+ uint64 targetPercentage,
+ uint128 balance
+ );
+
+ function toAmount(
+ IERC20 token,
+ uint256 share,
+ bool roundUp
+ ) external view returns (uint256 amount);
+
+ function toShare(
+ IERC20 token,
+ uint256 amount,
+ bool roundUp
+ ) external view returns (uint256 share);
+
+ function totals(IERC20) external view returns (Rebase memory totals_);
+
+ function transfer(
+ IERC20 token,
+ address from,
+ address to,
+ uint256 share
+ ) external;
+
+ function transferMultiple(
+ IERC20 token,
+ address from,
+ address[] calldata tos,
+ uint256[] calldata shares
+ ) external;
+
+ function transferOwnership(
+ address newOwner,
+ bool direct,
+ bool renounce
+ ) external;
+
+ function whitelistMasterContract(address masterContract, bool approved) external;
+
+ function whitelistedMasterContracts(address) external view returns (bool);
+
+ function withdraw(
+ IERC20 token_,
+ address from,
+ address to,
+ uint256 amount,
+ uint256 share
+ ) external returns (uint256 amountOut, uint256 shareOut);
+}
+
+// File contracts/interfaces/IOracle.sol
+// License-Identifier: MIT
+
+interface IOracle {
+ /// @notice Get the latest exchange rate.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function get(bytes calldata data) external returns (bool success, uint256 rate);
+
+ /// @notice Check the last exchange rate without any state changes.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peek(bytes calldata data) external view returns (bool success, uint256 rate);
+
+ /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peekSpot(bytes calldata data) external view returns (uint256 rate);
+
+ /// @notice Returns a human readable (short) name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable symbol name about this oracle.
+ function symbol(bytes calldata data) external view returns (string memory);
+
+ /// @notice Returns a human readable name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable name about this oracle.
+ function name(bytes calldata data) external view returns (string memory);
+}
+
+// File contracts/interfaces/ISwapper.sol
+// License-Identifier: MIT
+
+interface ISwapper {
+ /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.
+ /// Swaps it for at least 'amountToMin' of token 'to'.
+ /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.
+ /// Returns the amount of tokens 'to' transferred to BentoBox.
+ /// (The BentoBox skim function will be used by the caller to get the swapped funds).
+ function swap(
+ IERC20 fromToken,
+ IERC20 toToken,
+ address recipient,
+ uint256 shareToMin,
+ uint256 shareFrom
+ ) external returns (uint256 extraShare, uint256 shareReturned);
+
+ /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),
+ /// this should be less than or equal to amountFromMax.
+ /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.
+ /// Swaps it for exactly 'exactAmountTo' of token 'to'.
+ /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.
+ /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).
+ /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).
+ /// (The BentoBox skim function will be used by the caller to get the swapped funds).
+ function swapExact(
+ IERC20 fromToken,
+ IERC20 toToken,
+ address recipient,
+ address refundTo,
+ uint256 shareFromSupplied,
+ uint256 shareToExact
+ ) external returns (uint256 shareUsed, uint256 shareReturned);
+}
+
+// File contracts/KashiPair.sol
+// License-Identifier: UNLICENSED
+// Kashi Lending Medium Risk
+
+/// @title KashiPair
+/// @dev This contract allows contract calls to any contract (except BentoBox)
+/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.
+contract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using RebaseLibrary for Rebase;
+ using BoringERC20 for IERC20;
+
+ event LogExchangeRate(uint256 rate);
+ event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);
+ event LogAddCollateral(address indexed from, address indexed to, uint256 share);
+ event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);
+ event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);
+ event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);
+ event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);
+ event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);
+ event LogFeeTo(address indexed newFeeTo);
+ event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);
+
+ // Immutables (for MasterContract and all clones)
+ IBentoBoxV1 public immutable bentoBox;
+ KashiPairMediumRiskV1 public immutable masterContract;
+
+ // MasterContract variables
+ address public feeTo;
+ mapping(ISwapper => bool) public swappers;
+
+ // Per clone variables
+ // Clone init settings
+ IERC20 public collateral;
+ IERC20 public asset;
+ IOracle public oracle;
+ bytes public oracleData;
+
+ // Total amounts
+ uint256 public totalCollateralShare; // Total collateral supplied
+ Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers
+ Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers
+
+ // User balances
+ mapping(address => uint256) public userCollateralShare;
+ // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)
+ mapping(address => uint256) public userBorrowPart;
+
+ /// @notice Exchange and interest rate tracking.
+ /// This is 'cached' here because calls to Oracles can be very expensive.
+ uint256 public exchangeRate;
+
+ struct AccrueInfo {
+ uint64 interestPerSecond;
+ uint64 lastAccrued;
+ uint128 feesEarnedFraction;
+ }
+
+ AccrueInfo public accrueInfo;
+
+ // ERC20 'variables'
+ function symbol() external view returns (string memory) {
+ return string(abi.encodePacked("km", collateral.safeSymbol(), "/", asset.safeSymbol(), "-", oracle.symbol(oracleData)));
+ }
+
+ function name() external view returns (string memory) {
+ return string(abi.encodePacked("Kashi Medium Risk ", collateral.safeName(), "/", asset.safeName(), "-", oracle.name(oracleData)));
+ }
+
+ function decimals() external view returns (uint8) {
+ return asset.safeDecimals();
+ }
+
+ // totalSupply for ERC20 compatibility
+ function totalSupply() public view returns (uint256) {
+ return totalAsset.base;
+ }
+
+ // Settings for the Medium Risk KashiPair
+ uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%
+ uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%
+ uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)
+ uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%
+ uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%
+ uint256 private constant UTILIZATION_PRECISION = 1e18;
+ uint256 private constant FULL_UTILIZATION = 1e18;
+ uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;
+ uint256 private constant FACTOR_PRECISION = 1e18;
+
+ uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR
+ uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR
+ uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR
+ uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear
+
+ uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;
+
+ uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%
+ uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;
+
+ // Fees
+ uint256 private constant PROTOCOL_FEE = 10000; // 10%
+ uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;
+ uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%
+ uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;
+
+ /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.
+ constructor(IBentoBoxV1 bentoBox_) public {
+ bentoBox = bentoBox_;
+ masterContract = this;
+ feeTo = msg.sender;
+ }
+
+ /// @notice Serves as the constructor for clones, as clones can't have a regular constructor
+ /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)
+ function init(bytes calldata data) public payable override {
+ require(address(collateral) == address(0), "KashiPair: already initialized");
+ (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));
+ require(address(collateral) != address(0), "KashiPair: bad pair");
+
+ accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%
+ }
+
+ /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.
+ function accrue() public {
+ AccrueInfo memory _accrueInfo = accrueInfo;
+ // Number of seconds since accrue was called
+ uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;
+ if (elapsedTime == 0) {
+ return;
+ }
+ _accrueInfo.lastAccrued = uint64(block.timestamp);
+
+ Rebase memory _totalBorrow = totalBorrow;
+ if (_totalBorrow.base == 0) {
+ // If there are no borrows, reset the interest rate
+ if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {
+ _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;
+ emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);
+ }
+ accrueInfo = _accrueInfo;
+ return;
+ }
+
+ uint256 extraAmount = 0;
+ uint256 feeFraction = 0;
+ Rebase memory _totalAsset = totalAsset;
+
+ // Accrue interest
+ extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;
+ _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());
+ uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);
+
+ uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee
+ feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;
+ _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());
+ totalAsset.base = _totalAsset.base.add(feeFraction.to128());
+ totalBorrow = _totalBorrow;
+
+ // Update interest rate
+ uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;
+ if (utilization < MINIMUM_TARGET_UTILIZATION) {
+ uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;
+ uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));
+ _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);
+
+ if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {
+ _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum
+ }
+ } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {
+ uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;
+ uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));
+ uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;
+ if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {
+ newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum
+ }
+ _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);
+ }
+
+ emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);
+ accrueInfo = _accrueInfo;
+ }
+
+ /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.
+ /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.
+ function _isSolvent(
+ address user,
+ bool open,
+ uint256 _exchangeRate
+ ) internal view returns (bool) {
+ // accrue must have already been called!
+ uint256 borrowPart = userBorrowPart[user];
+ if (borrowPart == 0) return true;
+ uint256 collateralShare = userCollateralShare[user];
+ if (collateralShare == 0) return false;
+
+ Rebase memory _totalBorrow = totalBorrow;
+
+ return
+ bentoBox.toAmount(
+ collateral,
+ collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(
+ open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE
+ ),
+ false
+ ) >=
+ // Moved exchangeRate here instead of dividing the other side to preserve more precision
+ borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;
+ }
+
+ /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.
+ modifier solvent() {
+ _;
+ require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent");
+ }
+
+ /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.
+ /// This function is supposed to be invoked if needed because Oracle queries can be expensive.
+ /// @return updated True if `exchangeRate` was updated.
+ /// @return rate The new exchange rate.
+ function updateExchangeRate() public returns (bool updated, uint256 rate) {
+ (updated, rate) = oracle.get(oracleData);
+
+ if (updated) {
+ exchangeRate = rate;
+ emit LogExchangeRate(rate);
+ } else {
+ // Return the old rate if fetching wasn't successful
+ rate = exchangeRate;
+ }
+ }
+
+ /// @dev Helper function to move tokens.
+ /// @param token The ERC-20 token.
+ /// @param share The amount in shares to add.
+ /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.
+ /// Only used for accounting checks.
+ /// @param skim If True, only does a balance check on this contract.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ function _addTokens(
+ IERC20 token,
+ uint256 share,
+ uint256 total,
+ bool skim
+ ) internal {
+ if (skim) {
+ require(share <= bentoBox.balanceOf(token, address(this)).sub(total), "KashiPair: Skim too much");
+ } else {
+ bentoBox.transfer(token, msg.sender, address(this), share);
+ }
+ }
+
+ /// @notice Adds `collateral` from msg.sender to the account `to`.
+ /// @param to The receiver of the tokens.
+ /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ /// @param share The amount of shares to add for `to`.
+ function addCollateral(
+ address to,
+ bool skim,
+ uint256 share
+ ) public {
+ userCollateralShare[to] = userCollateralShare[to].add(share);
+ uint256 oldTotalCollateralShare = totalCollateralShare;
+ totalCollateralShare = oldTotalCollateralShare.add(share);
+ _addTokens(collateral, share, oldTotalCollateralShare, skim);
+ emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);
+ }
+
+ /// @dev Concrete implementation of `removeCollateral`.
+ function _removeCollateral(address to, uint256 share) internal {
+ userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);
+ totalCollateralShare = totalCollateralShare.sub(share);
+ emit LogRemoveCollateral(msg.sender, to, share);
+ bentoBox.transfer(collateral, address(this), to, share);
+ }
+
+ /// @notice Removes `share` amount of collateral and transfers it to `to`.
+ /// @param to The receiver of the shares.
+ /// @param share Amount of shares to remove.
+ function removeCollateral(address to, uint256 share) public solvent {
+ // accrue must be called because we check solvency
+ accrue();
+ _removeCollateral(to, share);
+ }
+
+ /// @dev Concrete implementation of `addAsset`.
+ function _addAsset(
+ address to,
+ bool skim,
+ uint256 share
+ ) internal returns (uint256 fraction) {
+ Rebase memory _totalAsset = totalAsset;
+ uint256 totalAssetShare = _totalAsset.elastic;
+ uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);
+ fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;
+ if (_totalAsset.base.add(fraction.to128()) < 1000) {
+ return 0;
+ }
+ totalAsset = _totalAsset.add(share, fraction);
+ balanceOf[to] = balanceOf[to].add(fraction);
+ _addTokens(asset, share, totalAssetShare, skim);
+ emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);
+ }
+
+ /// @notice Adds assets to the lending pair.
+ /// @param to The address of the user to receive the assets.
+ /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ /// @param share The amount of shares to add.
+ /// @return fraction Total fractions added.
+ function addAsset(
+ address to,
+ bool skim,
+ uint256 share
+ ) public returns (uint256 fraction) {
+ accrue();
+ fraction = _addAsset(to, skim, share);
+ }
+
+ /// @dev Concrete implementation of `removeAsset`.
+ function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {
+ Rebase memory _totalAsset = totalAsset;
+ uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);
+ share = fraction.mul(allShare) / _totalAsset.base;
+ balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);
+ _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());
+ _totalAsset.base = _totalAsset.base.sub(fraction.to128());
+ require(_totalAsset.base >= 1000, "Kashi: below minimum");
+ totalAsset = _totalAsset;
+ emit LogRemoveAsset(msg.sender, to, share, fraction);
+ bentoBox.transfer(asset, address(this), to, share);
+ }
+
+ /// @notice Removes an asset from msg.sender and transfers it to `to`.
+ /// @param to The user that receives the removed assets.
+ /// @param fraction The amount/fraction of assets held to remove.
+ /// @return share The amount of shares transferred to `to`.
+ function removeAsset(address to, uint256 fraction) public returns (uint256 share) {
+ accrue();
+ share = _removeAsset(to, fraction);
+ }
+
+ /// @dev Concrete implementation of `borrow`.
+ function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {
+ uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow
+
+ (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);
+ userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);
+ emit LogBorrow(msg.sender, to, amount, feeAmount, part);
+
+ share = bentoBox.toShare(asset, amount, false);
+ Rebase memory _totalAsset = totalAsset;
+ require(_totalAsset.base >= 1000, "Kashi: below minimum");
+ _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());
+ totalAsset = _totalAsset;
+ bentoBox.transfer(asset, address(this), to, share);
+ }
+
+ /// @notice Sender borrows `amount` and transfers it to `to`.
+ /// @return part Total part of the debt held by borrowers.
+ /// @return share Total amount in shares borrowed.
+ function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {
+ accrue();
+ (part, share) = _borrow(to, amount);
+ }
+
+ /// @dev Concrete implementation of `repay`.
+ function _repay(
+ address to,
+ bool skim,
+ uint256 part
+ ) internal returns (uint256 amount) {
+ (totalBorrow, amount) = totalBorrow.sub(part, true);
+ userBorrowPart[to] = userBorrowPart[to].sub(part);
+
+ uint256 share = bentoBox.toShare(asset, amount, true);
+ uint128 totalShare = totalAsset.elastic;
+ _addTokens(asset, share, uint256(totalShare), skim);
+ totalAsset.elastic = totalShare.add(share.to128());
+ emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);
+ }
+
+ /// @notice Repays a loan.
+ /// @param to Address of the user this payment should go.
+ /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.
+ /// False if tokens from msg.sender in `bentoBox` should be transferred.
+ /// @param part The amount to repay. See `userBorrowPart`.
+ /// @return amount The total amount repayed.
+ function repay(
+ address to,
+ bool skim,
+ uint256 part
+ ) public returns (uint256 amount) {
+ accrue();
+ amount = _repay(to, skim, part);
+ }
+
+ // Functions that need accrue to be called
+ uint8 internal constant ACTION_ADD_ASSET = 1;
+ uint8 internal constant ACTION_REPAY = 2;
+ uint8 internal constant ACTION_REMOVE_ASSET = 3;
+ uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;
+ uint8 internal constant ACTION_BORROW = 5;
+ uint8 internal constant ACTION_GET_REPAY_SHARE = 6;
+ uint8 internal constant ACTION_GET_REPAY_PART = 7;
+ uint8 internal constant ACTION_ACCRUE = 8;
+
+ // Functions that don't need accrue to be called
+ uint8 internal constant ACTION_ADD_COLLATERAL = 10;
+ uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;
+
+ // Function on BentoBox
+ uint8 internal constant ACTION_BENTO_DEPOSIT = 20;
+ uint8 internal constant ACTION_BENTO_WITHDRAW = 21;
+ uint8 internal constant ACTION_BENTO_TRANSFER = 22;
+ uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;
+ uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;
+
+ // Any external call (except to BentoBox)
+ uint8 internal constant ACTION_CALL = 30;
+
+ int256 internal constant USE_VALUE1 = -1;
+ int256 internal constant USE_VALUE2 = -2;
+
+ /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.
+ function _num(
+ int256 inNum,
+ uint256 value1,
+ uint256 value2
+ ) internal pure returns (uint256 outNum) {
+ outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);
+ }
+
+ /// @dev Helper function for depositing into `bentoBox`.
+ function _bentoDeposit(
+ bytes memory data,
+ uint256 value,
+ uint256 value1,
+ uint256 value2
+ ) internal returns (uint256, uint256) {
+ (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));
+ amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors
+ share = int256(_num(share, value1, value2));
+ return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));
+ }
+
+ /// @dev Helper function to withdraw from the `bentoBox`.
+ function _bentoWithdraw(
+ bytes memory data,
+ uint256 value1,
+ uint256 value2
+ ) internal returns (uint256, uint256) {
+ (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));
+ return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));
+ }
+
+ /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.
+ /// Calls to `bentoBox` are not allowed for obvious security reasons.
+ /// This also means that calls made from this contract shall *not* be trusted.
+ function _call(
+ uint256 value,
+ bytes memory data,
+ uint256 value1,
+ uint256 value2
+ ) internal returns (bytes memory, uint8) {
+ (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =
+ abi.decode(data, (address, bytes, bool, bool, uint8));
+
+ if (useValue1 && !useValue2) {
+ callData = abi.encodePacked(callData, value1);
+ } else if (!useValue1 && useValue2) {
+ callData = abi.encodePacked(callData, value2);
+ } else if (useValue1 && useValue2) {
+ callData = abi.encodePacked(callData, value1, value2);
+ }
+
+ require(callee != address(bentoBox) && callee != address(this), "KashiPair: can't call");
+
+ (bool success, bytes memory returnData) = callee.call{value: value}(callData);
+ require(success, "KashiPair: call failed");
+ return (returnData, returnValues);
+ }
+
+ struct CookStatus {
+ bool needsSolvencyCheck;
+ bool hasAccrued;
+ }
+
+ /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.
+ /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).
+ /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.
+ /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.
+ /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.
+ /// @return value1 May contain the first positioned return value of the last executed action (if applicable).
+ /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).
+ function cook(
+ uint8[] calldata actions,
+ uint256[] calldata values,
+ bytes[] calldata datas
+ ) external payable returns (uint256 value1, uint256 value2) {
+ CookStatus memory status;
+ for (uint256 i = 0; i < actions.length; i++) {
+ uint8 action = actions[i];
+ if (!status.hasAccrued && action < 10) {
+ accrue();
+ status.hasAccrued = true;
+ }
+ if (action == ACTION_ADD_COLLATERAL) {
+ (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));
+ addCollateral(to, skim, _num(share, value1, value2));
+ } else if (action == ACTION_ADD_ASSET) {
+ (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));
+ value1 = _addAsset(to, skim, _num(share, value1, value2));
+ } else if (action == ACTION_REPAY) {
+ (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));
+ _repay(to, skim, _num(part, value1, value2));
+ } else if (action == ACTION_REMOVE_ASSET) {
+ (int256 fraction, address to) = abi.decode(datas[i], (int256, address));
+ value1 = _removeAsset(to, _num(fraction, value1, value2));
+ } else if (action == ACTION_REMOVE_COLLATERAL) {
+ (int256 share, address to) = abi.decode(datas[i], (int256, address));
+ _removeCollateral(to, _num(share, value1, value2));
+ status.needsSolvencyCheck = true;
+ } else if (action == ACTION_BORROW) {
+ (int256 amount, address to) = abi.decode(datas[i], (int256, address));
+ (value1, value2) = _borrow(to, _num(amount, value1, value2));
+ status.needsSolvencyCheck = true;
+ } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {
+ (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));
+ (bool updated, uint256 rate) = updateExchangeRate();
+ require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), "KashiPair: rate not ok");
+ } else if (action == ACTION_BENTO_SETAPPROVAL) {
+ (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =
+ abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));
+ bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);
+ } else if (action == ACTION_BENTO_DEPOSIT) {
+ (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);
+ } else if (action == ACTION_BENTO_WITHDRAW) {
+ (value1, value2) = _bentoWithdraw(datas[i], value1, value2);
+ } else if (action == ACTION_BENTO_TRANSFER) {
+ (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));
+ bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));
+ } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {
+ (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));
+ bentoBox.transferMultiple(token, msg.sender, tos, shares);
+ } else if (action == ACTION_CALL) {
+ (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);
+
+ if (returnValues == 1) {
+ (value1) = abi.decode(returnData, (uint256));
+ } else if (returnValues == 2) {
+ (value1, value2) = abi.decode(returnData, (uint256, uint256));
+ }
+ } else if (action == ACTION_GET_REPAY_SHARE) {
+ int256 part = abi.decode(datas[i], (int256));
+ value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);
+ } else if (action == ACTION_GET_REPAY_PART) {
+ int256 amount = abi.decode(datas[i], (int256));
+ value1 = totalBorrow.toBase(_num(amount, value1, value2), false);
+ }
+ }
+
+ if (status.needsSolvencyCheck) {
+ require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent");
+ }
+ }
+
+ /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.
+ /// @param users An array of user addresses.
+ /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.
+ /// @param to Address of the receiver in open liquidations if `swapper` is zero.
+ /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.
+ /// @param open True to perform a open liquidation else False.
+ function liquidate(
+ address[] calldata users,
+ uint256[] calldata maxBorrowParts,
+ address to,
+ ISwapper swapper,
+ bool open
+ ) public {
+ // Oracle can fail but we still need to allow liquidations
+ (, uint256 _exchangeRate) = updateExchangeRate();
+ accrue();
+
+ uint256 allCollateralShare;
+ uint256 allBorrowAmount;
+ uint256 allBorrowPart;
+ Rebase memory _totalBorrow = totalBorrow;
+ Rebase memory bentoBoxTotals = bentoBox.totals(collateral);
+ for (uint256 i = 0; i < users.length; i++) {
+ address user = users[i];
+ if (!_isSolvent(user, open, _exchangeRate)) {
+ uint256 borrowPart;
+ {
+ uint256 availableBorrowPart = userBorrowPart[user];
+ borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];
+ userBorrowPart[user] = availableBorrowPart.sub(borrowPart);
+ }
+ uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);
+ uint256 collateralShare =
+ bentoBoxTotals.toBase(
+ borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /
+ (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),
+ false
+ );
+
+ userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);
+ emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);
+ emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);
+
+ // Keep totals
+ allCollateralShare = allCollateralShare.add(collateralShare);
+ allBorrowAmount = allBorrowAmount.add(borrowAmount);
+ allBorrowPart = allBorrowPart.add(borrowPart);
+ }
+ }
+ require(allBorrowAmount != 0, "KashiPair: all are solvent");
+ _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());
+ _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());
+ totalBorrow = _totalBorrow;
+ totalCollateralShare = totalCollateralShare.sub(allCollateralShare);
+
+ uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);
+
+ if (!open) {
+ // Closed liquidation using a pre-approved swapper for the benefit of the LPs
+ require(masterContract.swappers(swapper), "KashiPair: Invalid swapper");
+
+ // Swaps the users' collateral for the borrowed asset
+ bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);
+ swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);
+
+ uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));
+ uint256 extraShare = returnedShare.sub(allBorrowShare);
+ uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee
+ // solhint-disable-next-line reentrancy
+ bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);
+ totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());
+ emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);
+ } else {
+ // Swap using a swapper freely chosen by the caller
+ // Open (flash) liquidation: get proceeds first and provide the borrow after
+ bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);
+ if (swapper != ISwapper(0)) {
+ swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);
+ }
+
+ bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);
+ totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());
+ }
+ }
+
+ /// @notice Withdraws the fees accumulated.
+ function withdrawFees() public {
+ accrue();
+ address _feeTo = masterContract.feeTo();
+ uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;
+ balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);
+ accrueInfo.feesEarnedFraction = 0;
+
+ emit LogWithdrawFees(_feeTo, _feesEarnedFraction);
+ }
+
+ /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.
+ /// MasterContract Only Admin function.
+ /// @param swapper The address of the swapper contract that conforms to `ISwapper`.
+ /// @param enable True to enable the swapper. To disable use False.
+ function setSwapper(ISwapper swapper, bool enable) public onlyOwner {
+ swappers[swapper] = enable;
+ }
+
+ /// @notice Sets the beneficiary of fees accrued in liquidations.
+ /// MasterContract Only Admin function.
+ /// @param newFeeTo The address of the receiver.
+ function setFeeTo(address newFeeTo) public onlyOwner {
+ feeTo = newFeeTo;
+ emit LogFeeTo(newFeeTo);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/bentobox/PeggedOracleV1.sol b/omgx_utilities/contracts-analyzer/contracts/bentobox/PeggedOracleV1.sol
new file mode 100644
index 000000000000..bf8ae8268d77
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/bentobox/PeggedOracleV1.sol
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+
+// File contracts/interfaces/IOracle.sol
+// License-Identifier: MIT
+
+interface IOracle {
+ /// @notice Get the latest exchange rate.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function get(bytes calldata data) external returns (bool success, uint256 rate);
+
+ /// @notice Check the last exchange rate without any state changes.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return success if no valid (recent) rate is available, return false else true.
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peek(bytes calldata data) external view returns (bool success, uint256 rate);
+
+ /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return rate The rate of the requested asset / pair / pool.
+ function peekSpot(bytes calldata data) external view returns (uint256 rate);
+
+ /// @notice Returns a human readable (short) name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable symbol name about this oracle.
+ function symbol(bytes calldata data) external view returns (string memory);
+
+ /// @notice Returns a human readable name about this oracle.
+ /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
+ /// For example:
+ /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
+ /// @return (string) A human readable name about this oracle.
+ function name(bytes calldata data) external view returns (string memory);
+}
+
+// File contracts/oracles/PeggedOracle.sol
+// License-Identifier: MIT
+
+/// @title PeggedOracle
+/// @author BoringCrypto
+/// @notice Oracle used for pegged prices that don't change
+/// @dev
+contract PeggedOracleV1 is IOracle {
+ /// @notice
+ /// @dev
+ /// @param rate (uint256) The fixed exchange rate
+ /// @return (bytes)
+ function getDataParameter(uint256 rate) public pure returns (bytes memory) {
+ return abi.encode(rate);
+ }
+
+ // Get the exchange rate
+ /// @inheritdoc IOracle
+ function get(bytes calldata data) public override returns (bool, uint256) {
+ uint256 rate = abi.decode(data, (uint256));
+ return (rate != 0, rate);
+ }
+
+ // Check the exchange rate without any state changes
+ /// @inheritdoc IOracle
+ function peek(bytes calldata data) public view override returns (bool, uint256) {
+ uint256 rate = abi.decode(data, (uint256));
+ return (rate != 0, rate);
+ }
+
+ // Check the current spot exchange rate without any state changes
+ /// @inheritdoc IOracle
+ function peekSpot(bytes calldata data) external view override returns (uint256 rate) {
+ (, rate) = peek(data);
+ }
+
+ /// @inheritdoc IOracle
+ function name(bytes calldata) public view override returns (string memory) {
+ return "Pegged";
+ }
+
+ /// @inheritdoc IOracle
+ function symbol(bytes calldata) public view override returns (string memory) {
+ return "PEG";
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/governance/Timelock.sol b/omgx_utilities/contracts-analyzer/contracts/governance/Timelock.sol
new file mode 100644
index 000000000000..b187b3679627
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/governance/Timelock.sol
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: MIT
+
+// COPIED FROM https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/GovernorAlpha.sol
+// Copyright 2020 Compound Labs, Inc.
+// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Ctrl+f for XXX to see all the modifications.
+
+// XXX: pragma solidity ^0.5.16;
+pragma solidity 0.6.12;
+
+// XXX: import "./SafeMath.sol";
+import "@openzeppelin/contracts/math/SafeMath.sol";
+
+contract Timelock {
+ using SafeMath for uint;
+
+ event NewAdmin(address indexed newAdmin);
+ event NewPendingAdmin(address indexed newPendingAdmin);
+ event NewDelay(uint indexed newDelay);
+ event CancelTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);
+ event ExecuteTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);
+ event QueueTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);
+
+ uint public constant GRACE_PERIOD = 14 days;
+ uint public constant MINIMUM_DELAY = 2 days;
+ uint public constant MAXIMUM_DELAY = 30 days;
+
+ address public admin;
+ address public pendingAdmin;
+ uint public delay;
+ bool public admin_initialized;
+
+ mapping (bytes32 => bool) public queuedTransactions;
+
+
+ constructor(address admin_, uint delay_) public {
+ require(delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay.");
+ require(delay_ <= MAXIMUM_DELAY, "Timelock::constructor: Delay must not exceed maximum delay.");
+
+ admin = admin_;
+ delay = delay_;
+ admin_initialized = false;
+ }
+
+ // XXX: function() external payable { }
+ receive() external payable { }
+
+ function setDelay(uint delay_) public {
+ require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock.");
+ require(delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay.");
+ require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay.");
+ delay = delay_;
+
+ emit NewDelay(delay);
+ }
+
+ function acceptAdmin() public {
+ require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin.");
+ admin = msg.sender;
+ pendingAdmin = address(0);
+
+ emit NewAdmin(admin);
+ }
+
+ function setPendingAdmin(address pendingAdmin_) public {
+ // allows one time setting of admin for deployment purposes
+ if (admin_initialized) {
+ require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock.");
+ } else {
+ require(msg.sender == admin, "Timelock::setPendingAdmin: First call must come from admin.");
+ admin_initialized = true;
+ }
+ pendingAdmin = pendingAdmin_;
+
+ emit NewPendingAdmin(pendingAdmin);
+ }
+
+ function queueTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public returns (bytes32) {
+ require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin.");
+ require(eta >= getBlockTimestamp().add(delay), "Timelock::queueTransaction: Estimated execution block must satisfy delay.");
+
+ bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
+ queuedTransactions[txHash] = true;
+
+ emit QueueTransaction(txHash, target, value, signature, data, eta);
+ return txHash;
+ }
+
+ function cancelTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public {
+ require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin.");
+
+ bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
+ queuedTransactions[txHash] = false;
+
+ emit CancelTransaction(txHash, target, value, signature, data, eta);
+ }
+
+ function executeTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public payable returns (bytes memory) {
+ require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin.");
+
+ bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
+ require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued.");
+ require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock.");
+ require(getBlockTimestamp() <= eta.add(GRACE_PERIOD), "Timelock::executeTransaction: Transaction is stale.");
+
+ queuedTransactions[txHash] = false;
+
+ bytes memory callData;
+
+ if (bytes(signature).length == 0) {
+ callData = data;
+ } else {
+ callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
+ }
+
+ // CHANGE_OMGX
+ // solium-disable-next-line security/no-call-value
+ // (bool success, bytes memory returnData) = target.call.value(value)(callData);
+
+ // The following syntax is deprecated:
+ // f.gas(...)(), f.value(...)() and (new C).value(...)().
+
+ // Replace these calls by
+ // f{gas: ..., value: ...}() and (new C){value: ...}().
+
+
+ (bool success, bytes memory returnData) = target.call{value:value}(callData);
+ require(success, "Timelock::executeTransaction: Transaction execution reverted.");
+
+ emit ExecuteTransaction(txHash, target, value, signature, data, eta);
+
+ return returnData;
+ }
+
+ function getBlockTimestamp() internal view returns (uint) {
+ // solium-disable-next-line security/no-block-members
+ return block.timestamp;
+ }
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/interfaces/IERC20.sol b/omgx_utilities/contracts-analyzer/contracts/interfaces/IERC20.sol
new file mode 100644
index 000000000000..658dd3047af9
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/interfaces/IERC20.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+
+interface IERC20 {
+ function totalSupply() external view returns (uint256);
+ function balanceOf(address account) external view returns (uint256);
+ function allowance(address owner, address spender) external view returns (uint256);
+ function approve(address spender, uint256 amount) external returns (bool);
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+
+ // EIP 2612
+ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/interfaces/IMasterChef.sol b/omgx_utilities/contracts-analyzer/contracts/interfaces/IMasterChef.sol
new file mode 100644
index 000000000000..a233bfe9b224
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/interfaces/IMasterChef.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+
+interface IMasterChef {
+ using BoringERC20 for IERC20;
+ struct UserInfo {
+ uint256 amount; // How many LP tokens the user has provided.
+ uint256 rewardDebt; // Reward debt. See explanation below.
+ }
+
+ struct PoolInfo {
+ IERC20 lpToken; // Address of LP token contract.
+ uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.
+ uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.
+ uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.
+ }
+
+ function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);
+ function totalAllocPoint() external view returns (uint256);
+ function deposit(uint256 _pid, uint256 _amount) external;
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/interfaces/IRewarder.sol b/omgx_utilities/contracts-analyzer/contracts/interfaces/IRewarder.sol
new file mode 100644
index 000000000000..d6c0f520663c
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/interfaces/IRewarder.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+interface IRewarder {
+ using BoringERC20 for IERC20;
+ function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;
+ // CHANGE_OMGX
+ function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory);
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/libraries/SafeERC20.sol b/omgx_utilities/contracts-analyzer/contracts/libraries/SafeERC20.sol
new file mode 100644
index 000000000000..2f550e280620
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/libraries/SafeERC20.sol
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+
+import "../interfaces/IERC20.sol";
+
+library SafeERC20 {
+ function safeSymbol(IERC20 token) internal view returns(string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
+ return success && data.length > 0 ? abi.decode(data, (string)) : "???";
+ }
+
+ function safeName(IERC20 token) internal view returns(string memory) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
+ return success && data.length > 0 ? abi.decode(data, (string)) : "???";
+ }
+
+ function safeDecimals(IERC20 token) public view returns (uint8) {
+ (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
+ return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
+ }
+
+ function safeTransfer(IERC20 token, address to, uint256 amount) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: Transfer failed");
+ }
+
+ function safeTransferFrom(IERC20 token, address from, uint256 amount) internal {
+ (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, address(this), amount));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: TransferFrom failed");
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/libraries/SafeMath.sol b/omgx_utilities/contracts-analyzer/contracts/libraries/SafeMath.sol
new file mode 100644
index 000000000000..51152c1dbf62
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/libraries/SafeMath.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.6.12;
+// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
+library SafeMath {
+ function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "SafeMath: Add Overflow");}
+ function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "SafeMath: Underflow");}
+ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "SafeMath: Mul Overflow");}
+ function to128(uint256 a) internal pure returns (uint128 c) {
+ require(a <= uint128(-1), "SafeMath: uint128 Overflow");
+ c = uint128(a);
+ }
+}
+
+library SafeMath128 {
+ function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "SafeMath: Add Overflow");}
+ function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "SafeMath: Underflow");}
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/libraries/SignedSafeMath.sol b/omgx_utilities/contracts-analyzer/contracts/libraries/SignedSafeMath.sol
new file mode 100644
index 000000000000..4076f10c9459
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/libraries/SignedSafeMath.sol
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+library SignedSafeMath {
+ int256 constant private _INT256_MIN = -2**255;
+
+ /**
+ * @dev Returns the multiplication of two signed integers, reverting on
+ * overflow.
+ *
+ * Counterpart to Solidity's `*` operator.
+ *
+ * Requirements:
+ *
+ * - Multiplication cannot overflow.
+ */
+ function mul(int256 a, int256 b) internal pure returns (int256) {
+ // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
+ // benefit is lost if 'b' is also tested.
+ // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
+ if (a == 0) {
+ return 0;
+ }
+
+ require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
+
+ int256 c = a * b;
+ require(c / a == b, "SignedSafeMath: multiplication overflow");
+
+ return c;
+ }
+
+ /**
+ * @dev Returns the integer division of two signed integers. Reverts on
+ * division by zero. The result is rounded towards zero.
+ *
+ * Counterpart to Solidity's `/` operator. Note: this function uses a
+ * `revert` opcode (which leaves remaining gas untouched) while Solidity
+ * uses an invalid opcode to revert (consuming all remaining gas).
+ *
+ * Requirements:
+ *
+ * - The divisor cannot be zero.
+ */
+ function div(int256 a, int256 b) internal pure returns (int256) {
+ require(b != 0, "SignedSafeMath: division by zero");
+ require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
+
+ int256 c = a / b;
+
+ return c;
+ }
+
+ /**
+ * @dev Returns the subtraction of two signed integers, reverting on
+ * overflow.
+ *
+ * Counterpart to Solidity's `-` operator.
+ *
+ * Requirements:
+ *
+ * - Subtraction cannot overflow.
+ */
+ function sub(int256 a, int256 b) internal pure returns (int256) {
+ int256 c = a - b;
+ require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
+
+ return c;
+ }
+
+ /**
+ * @dev Returns the addition of two signed integers, reverting on
+ * overflow.
+ *
+ * Counterpart to Solidity's `+` operator.
+ *
+ * Requirements:
+ *
+ * - Addition cannot overflow.
+ */
+ function add(int256 a, int256 b) internal pure returns (int256) {
+ int256 c = a + b;
+ require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
+
+ return c;
+ }
+
+ function toUInt256(int256 a) internal pure returns (uint256) {
+ require(a >= 0, "Integer < 0");
+ return uint256(a);
+ }
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/ComplexRewarder.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/ComplexRewarder.sol
new file mode 100644
index 000000000000..2ba14fda7ce7
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/ComplexRewarder.sol
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+import "../interfaces/IRewarder.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "../MasterChefV2.sol";
+
+/// @author @0xKeno
+contract ComplexRewarder is IRewarder, BoringOwnable{
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+
+ IERC20 private immutable rewardToken;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardBlock;
+ uint64 allocPoint;
+ }
+
+ /// @notice Info of each pool.
+ mapping (uint256 => PoolInfo) public poolInfo;
+
+ uint256[] public poolIds;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 totalAllocPoint;
+
+ uint256 public tokenPerBlock;
+ uint256 private constant ACC_TOKEN_PRECISION = 1e12;
+
+ address private immutable MASTERCHEF_V2;
+
+ event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogInit();
+
+ constructor (IERC20 _rewardToken, uint256 _tokenPerBlock, address _MASTERCHEF_V2) public {
+ rewardToken = _rewardToken;
+ tokenPerBlock = _tokenPerBlock;
+ MASTERCHEF_V2 = _MASTERCHEF_V2;
+ }
+
+
+ function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][_user];
+ uint256 pending;
+ if (user.amount > 0) {
+ pending =
+ (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub(
+ user.rewardDebt
+ );
+ rewardToken.safeTransfer(to, pending);
+ }
+ user.amount = lpToken;
+ user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION;
+ emit LogOnReward(_user, pid, pending, to);
+ }
+
+ // CHANGE_OMGX
+ function pendingTokens(uint256 pid, address user, uint256) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {
+ IERC20[] memory _rewardTokens = new IERC20[](1);
+ _rewardTokens[0] = (rewardToken);
+ uint256[] memory _rewardAmounts = new uint256[](1);
+ _rewardAmounts[0] = pendingToken(pid, user);
+ return (_rewardTokens, _rewardAmounts);
+ }
+
+ modifier onlyMCV2 {
+ require(
+ msg.sender == MASTERCHEF_V2,
+ "Only MCV2 can call this function."
+ );
+ _;
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolIds.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _pid Pid on MCV2
+ function add(uint256 allocPoint, uint256 _pid) public onlyOwner {
+ require(poolInfo[_pid].lastRewardBlock == 0, "Pool already exists");
+ uint256 lastRewardBlock = block.number;
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+
+ poolInfo[_pid] = PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardBlock: lastRewardBlock.to64(),
+ accSushiPerShare: 0
+ });
+ poolIds.push(_pid);
+ emit LogPoolAddition(_pid, allocPoint);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ function set(uint256 _pid, uint256 _allocPoint) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ emit LogSetPool(_pid, _allocPoint);
+ }
+
+ /// @notice View function to see pending Token
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2);
+ if (block.number > pool.lastRewardBlock && lpSupply != 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply);
+ }
+ pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt);
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.number > pool.lastRewardBlock) {
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2);
+
+ if (lpSupply > 0) {
+ uint256 blocks = block.number.sub(pool.lastRewardBlock);
+ uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardBlock = block.number.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/ComplexRewarderTime.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/ComplexRewarderTime.sol
new file mode 100644
index 000000000000..91b10a71f63e
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/ComplexRewarderTime.sol
@@ -0,0 +1,182 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+pragma experimental ABIEncoderV2;
+import "../interfaces/IRewarder.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol";
+import "../MasterChefV2.sol";
+
+/// @author @0xKeno
+contract ComplexRewarderTime is IRewarder, BoringOwnable{
+ using BoringMath for uint256;
+ using BoringMath128 for uint128;
+ using BoringERC20 for IERC20;
+
+ IERC20 private immutable rewardToken;
+
+ /// @notice Info of each MCV2 user.
+ /// `amount` LP token amount the user has provided.
+ /// `rewardDebt` The amount of SUSHI entitled to the user.
+ struct UserInfo {
+ uint256 amount;
+ uint256 rewardDebt;
+ }
+
+ /// @notice Info of each MCV2 pool.
+ /// `allocPoint` The amount of allocation points assigned to the pool.
+ /// Also known as the amount of SUSHI to distribute per block.
+ struct PoolInfo {
+ uint128 accSushiPerShare;
+ uint64 lastRewardTime;
+ uint64 allocPoint;
+ }
+
+ /// @notice Info of each pool.
+ mapping (uint256 => PoolInfo) public poolInfo;
+
+ uint256[] public poolIds;
+
+ /// @notice Info of each user that stakes LP tokens.
+ mapping (uint256 => mapping (address => UserInfo)) public userInfo;
+ /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
+ uint256 totalAllocPoint;
+
+ uint256 public rewardPerSecond;
+ uint256 private constant ACC_TOKEN_PRECISION = 1e12;
+
+ address private immutable MASTERCHEF_V2;
+
+ event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
+ event LogPoolAddition(uint256 indexed pid, uint256 allocPoint);
+ event LogSetPool(uint256 indexed pid, uint256 allocPoint);
+ event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSushiPerShare);
+ event LogRewardPerSecond(uint256 rewardPerSecond);
+ event LogInit();
+
+ constructor (IERC20 _rewardToken, uint256 _rewardPerSecond, address _MASTERCHEF_V2) public {
+ rewardToken = _rewardToken;
+ rewardPerSecond = _rewardPerSecond;
+ MASTERCHEF_V2 = _MASTERCHEF_V2;
+ }
+
+
+ function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external {
+ PoolInfo memory pool = updatePool(pid);
+ UserInfo storage user = userInfo[pid][_user];
+ uint256 pending;
+ if (user.amount > 0) {
+ pending =
+ (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub(
+ user.rewardDebt
+ );
+ rewardToken.safeTransfer(to, pending);
+ }
+ user.amount = lpToken;
+ user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION;
+ emit LogOnReward(_user, pid, pending, to);
+ }
+
+ // CHANGE_OMGX
+ function pendingTokens(uint256 pid, address user, uint256) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {
+ IERC20[] memory _rewardTokens = new IERC20[](1);
+ _rewardTokens[0] = (rewardToken);
+ uint256[] memory _rewardAmounts = new uint256[](1);
+ _rewardAmounts[0] = pendingToken(pid, user);
+ return (_rewardTokens, _rewardAmounts);
+ }
+
+ /// @notice Sets the sushi per second to be distributed. Can only be called by the owner.
+ /// @param _rewardPerSecond The amount of Sushi to be distributed per second.
+ function setRewardPerSecond(uint256 _rewardPerSecond) public onlyOwner {
+ rewardPerSecond = _rewardPerSecond;
+ emit LogRewardPerSecond(_rewardPerSecond);
+ }
+
+ modifier onlyMCV2 {
+ require(
+ msg.sender == MASTERCHEF_V2,
+ "Only MCV2 can call this function."
+ );
+ _;
+ }
+
+ /// @notice Returns the number of MCV2 pools.
+ function poolLength() public view returns (uint256 pools) {
+ pools = poolIds.length;
+ }
+
+ /// @notice Add a new LP to the pool. Can only be called by the owner.
+ /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
+ /// @param allocPoint AP of the new pool.
+ /// @param _pid Pid on MCV2
+ function add(uint256 allocPoint, uint256 _pid) public onlyOwner {
+ require(poolInfo[_pid].lastRewardTime == 0, "Pool already exists");
+ uint256 lastRewardTime = block.timestamp;
+ totalAllocPoint = totalAllocPoint.add(allocPoint);
+
+ poolInfo[_pid] = PoolInfo({
+ allocPoint: allocPoint.to64(),
+ lastRewardTime: lastRewardTime.to64(),
+ accSushiPerShare: 0
+ });
+ poolIds.push(_pid);
+ emit LogPoolAddition(_pid, allocPoint);
+ }
+
+ /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _allocPoint New AP of the pool.
+ function set(uint256 _pid, uint256 _allocPoint) public onlyOwner {
+ totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
+ poolInfo[_pid].allocPoint = _allocPoint.to64();
+ emit LogSetPool(_pid, _allocPoint);
+ }
+
+ /// @notice View function to see pending Token
+ /// @param _pid The index of the pool. See `poolInfo`.
+ /// @param _user Address of user.
+ /// @return pending SUSHI reward for a given user.
+ function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) {
+ PoolInfo memory pool = poolInfo[_pid];
+ UserInfo storage user = userInfo[_pid][_user];
+ uint256 accSushiPerShare = pool.accSushiPerShare;
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2);
+ if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply);
+ }
+ pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt);
+ }
+
+ /// @notice Update reward variables for all pools. Be careful of gas spending!
+ /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
+ function massUpdatePools(uint256[] calldata pids) external {
+ uint256 len = pids.length;
+ for (uint256 i = 0; i < len; ++i) {
+ updatePool(pids[i]);
+ }
+ }
+
+ /// @notice Update reward variables of the given pool.
+ /// @param pid The index of the pool. See `poolInfo`.
+ /// @return pool Returns the pool that was updated.
+ function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
+ pool = poolInfo[pid];
+ if (block.timestamp > pool.lastRewardTime) {
+ uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2);
+
+ if (lpSupply > 0) {
+ uint256 time = block.timestamp.sub(pool.lastRewardTime);
+ uint256 sushiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint;
+ pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128());
+ }
+ pool.lastRewardTime = block.timestamp.to64();
+ poolInfo[pid] = pool;
+ emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSushiPerShare);
+ }
+ }
+
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/ERC20Mock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/ERC20Mock.sol
new file mode 100644
index 000000000000..4520a8d0aa8d
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/ERC20Mock.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+contract ERC20Mock is ERC20 {
+ constructor(
+ string memory name,
+ string memory symbol,
+ uint256 supply
+ ) public ERC20(name, symbol) {
+ _mint(msg.sender, supply);
+ }
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/RewarderBrokenMock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/RewarderBrokenMock.sol
new file mode 100644
index 000000000000..01bdd098b72b
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/RewarderBrokenMock.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "../interfaces/IRewarder.sol";
+
+
+contract RewarderBrokenMock is IRewarder {
+
+ function onSushiReward (uint256, address, address, uint256, uint256) override external {
+ revert();
+ }
+
+ function pendingTokens(uint256 pid, address user, uint256 sushiAmount) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts){
+ revert();
+ }
+
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/RewarderMock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/RewarderMock.sol
new file mode 100644
index 000000000000..51fb40be7f7d
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/RewarderMock.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+import "../interfaces/IRewarder.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol";
+import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol";
+
+
+contract RewarderMock is IRewarder {
+ using BoringMath for uint256;
+ using BoringERC20 for IERC20;
+ uint256 private immutable rewardMultiplier;
+ IERC20 private immutable rewardToken;
+ uint256 private constant REWARD_TOKEN_DIVISOR = 1e18;
+ address private immutable MASTERCHEF_V2;
+
+ constructor (uint256 _rewardMultiplier, IERC20 _rewardToken, address _MASTERCHEF_V2) public {
+ rewardMultiplier = _rewardMultiplier;
+ rewardToken = _rewardToken;
+ MASTERCHEF_V2 = _MASTERCHEF_V2;
+ }
+
+ function onSushiReward (uint256, address user, address to, uint256 sushiAmount, uint256) onlyMCV2 override external {
+ uint256 pendingReward = sushiAmount.mul(rewardMultiplier) / REWARD_TOKEN_DIVISOR;
+ uint256 rewardBal = rewardToken.balanceOf(address(this));
+ if (pendingReward > rewardBal) {
+ rewardToken.safeTransfer(to, rewardBal);
+ } else {
+ rewardToken.safeTransfer(to, pendingReward);
+ }
+ }
+
+ function pendingTokens(uint256 pid, address user, uint256 sushiAmount) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {
+ IERC20[] memory _rewardTokens = new IERC20[](1);
+ _rewardTokens[0] = (rewardToken);
+ uint256[] memory _rewardAmounts = new uint256[](1);
+ _rewardAmounts[0] = sushiAmount.mul(rewardMultiplier) / REWARD_TOKEN_DIVISOR;
+ return (_rewardTokens, _rewardAmounts);
+ }
+
+ modifier onlyMCV2 {
+ require(
+ msg.sender == MASTERCHEF_V2,
+ "Only MCV2 can call this function."
+ );
+ _;
+ }
+
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/SushiMakerExploitMock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiMakerExploitMock.sol
new file mode 100644
index 000000000000..91f9e6265cd9
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiMakerExploitMock.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../SushiMaker.sol";
+
+contract SushiMakerExploitMock {
+ SushiMaker public immutable sushiMaker;
+ constructor (address _sushiMaker) public{
+ sushiMaker = SushiMaker(_sushiMaker);
+ }
+ function convert(address token0, address token1) external {
+ sushiMaker.convert(token0, token1);
+ }
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/SushiMakerKashiExploitMock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiMakerKashiExploitMock.sol
new file mode 100644
index 000000000000..c78d244bb109
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiMakerKashiExploitMock.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../SushiMakerKashi.sol";
+
+contract SushiMakerKashiExploitMock {
+ SushiMakerKashi public immutable sushiMaker;
+
+ constructor(address _sushiMaker) public {
+ sushiMaker = SushiMakerKashi(_sushiMaker);
+ }
+
+ function convert(IKashiWithdrawFee kashiPair) external {
+ sushiMaker.convert(kashiPair);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/SushiSwapFactoryMock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiSwapFactoryMock.sol
new file mode 100644
index 000000000000..38b3d092d964
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiSwapFactoryMock.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../uniswapv2/UniswapV2Factory.sol";
+
+contract SushiSwapFactoryMock is UniswapV2Factory {
+ constructor(address _feeToSetter) public UniswapV2Factory(_feeToSetter) {}
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/SushiSwapPairMock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiSwapPairMock.sol
new file mode 100644
index 000000000000..cd0a80806574
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/SushiSwapPairMock.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+import "../uniswapv2/UniswapV2Pair.sol";
+
+contract SushiSwapPairMock is UniswapV2Pair {
+ constructor() public UniswapV2Pair() {}
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/mocks/WETH9Mock.sol b/omgx_utilities/contracts-analyzer/contracts/mocks/WETH9Mock.sol
new file mode 100644
index 000000000000..c90bcfebe91d
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/mocks/WETH9Mock.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity 0.6.12;
+
+// CHANGE_OMGX
+// contract WETH9Mock {
+// string public name = "Wrapped Ether";
+// string public symbol = "WETH";
+// uint8 public decimals = 18;
+
+// event Approval(address indexed src, address indexed guy, uint256 wad);
+// event Transfer(address indexed src, address indexed dst, uint256 wad);
+// event Deposit(address indexed dst, uint256 wad);
+// event Withdrawal(address indexed src, uint256 wad);
+
+// mapping(address => uint256) public balanceOf;
+// mapping(address => mapping(address => uint256)) public allowance;
+
+// function deposit() public payable {
+// balanceOf[msg.sender] += msg.value;
+// emit Deposit(msg.sender, msg.value);
+// }
+
+// function withdraw(uint256 wad) public {
+// require(balanceOf[msg.sender] >= wad, "WETH9: Error");
+// balanceOf[msg.sender] -= wad;
+// msg.sender.transfer(wad);
+// emit Withdrawal(msg.sender, wad);
+// }
+
+// function totalSupply() public view returns (uint256) {
+// return address(this).balance;
+// }
+
+// function approve(address guy, uint256 wad) public returns (bool) {
+// allowance[msg.sender][guy] = wad;
+// emit Approval(msg.sender, guy, wad);
+// return true;
+// }
+
+// function transfer(address dst, uint256 wad) public returns (bool) {
+// return transferFrom(msg.sender, dst, wad);
+// }
+
+// function transferFrom(
+// address src,
+// address dst,
+// uint256 wad
+// ) public returns (bool) {
+// require(balanceOf[src] >= wad, "WETH9: Error");
+
+// if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) {
+// require(allowance[src][msg.sender] >= wad, "WETH9: Error");
+// allowance[src][msg.sender] -= wad;
+// }
+
+// balanceOf[src] -= wad;
+// balanceOf[dst] += wad;
+
+// emit Transfer(src, dst, wad);
+
+// return true;
+// }
+// }
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/LICENSE b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/LICENSE
new file mode 100644
index 000000000000..f288702d2fa1
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/README.md b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/README.md
new file mode 100644
index 000000000000..ffa15f4b06cd
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/README.md
@@ -0,0 +1,13 @@
+# Uniswap V2 Area
+
+Code from [Uniswap V2](https://github.com/Uniswap/uniswap-v2-core/tree/27f6354bae6685612c182c3bc7577e61bc8717e3/contracts) with the following modifications.
+
+1. Change contract version to 0.6.12 and do the necessary patching.
+2. Add `migrator` member in `UniswapV2Factory` which can be set by `feeToSetter`.
+3. Allow `migrator` to specify the amount of `liquidity` during the first mint. Disallow first mint if migrator is set.
+
+To see all diffs:
+
+```
+$ git diff 4c4bf551417e3df09a25aa0dbb6941cccbbac11a .
+```
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2ERC20.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2ERC20.sol
new file mode 100644
index 000000000000..7ed393cd4205
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2ERC20.sol
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './libraries/SafeMath.sol';
+
+contract UniswapV2ERC20 {
+ using SafeMathUniswap for uint;
+
+ string public constant name = 'SushiSwap LP Token';
+ string public constant symbol = 'SLP';
+ uint8 public constant decimals = 18;
+ uint public totalSupply;
+ mapping(address => uint) public balanceOf;
+ mapping(address => mapping(address => uint)) public allowance;
+
+ bytes32 public DOMAIN_SEPARATOR;
+ // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
+ bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
+ mapping(address => uint) public nonces;
+
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+
+ constructor() public {
+ uint chainId;
+ assembly {
+ chainId := chainid()
+ }
+ DOMAIN_SEPARATOR = keccak256(
+ abi.encode(
+ keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
+ keccak256(bytes(name)),
+ keccak256(bytes('1')),
+ chainId,
+ address(this)
+ )
+ );
+ }
+
+ function _mint(address to, uint value) internal {
+ totalSupply = totalSupply.add(value);
+ balanceOf[to] = balanceOf[to].add(value);
+ emit Transfer(address(0), to, value);
+ }
+
+ function _burn(address from, uint value) internal {
+ balanceOf[from] = balanceOf[from].sub(value);
+ totalSupply = totalSupply.sub(value);
+ emit Transfer(from, address(0), value);
+ }
+
+ function _approve(address owner, address spender, uint value) private {
+ allowance[owner][spender] = value;
+ emit Approval(owner, spender, value);
+ }
+
+ function _transfer(address from, address to, uint value) private {
+ balanceOf[from] = balanceOf[from].sub(value);
+ balanceOf[to] = balanceOf[to].add(value);
+ emit Transfer(from, to, value);
+ }
+
+ function approve(address spender, uint value) external returns (bool) {
+ _approve(msg.sender, spender, value);
+ return true;
+ }
+
+ function transfer(address to, uint value) external returns (bool) {
+ _transfer(msg.sender, to, value);
+ return true;
+ }
+
+ function transferFrom(address from, address to, uint value) external returns (bool) {
+ if (allowance[from][msg.sender] != uint(-1)) {
+ allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
+ }
+ _transfer(from, to, value);
+ return true;
+ }
+
+ function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
+ require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
+ bytes32 digest = keccak256(
+ abi.encodePacked(
+ '\x19\x01',
+ DOMAIN_SEPARATOR,
+ keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
+ )
+ );
+ address recoveredAddress = ecrecover(digest, v, r, s);
+ require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
+ _approve(owner, spender, value);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Factory.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Factory.sol
new file mode 100644
index 000000000000..f0a56fc279b7
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Factory.sol
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './interfaces/IUniswapV2Factory.sol';
+import './UniswapV2Pair.sol';
+
+contract UniswapV2Factory is IUniswapV2Factory {
+ address public override feeTo;
+ address public override feeToSetter;
+ address public override migrator;
+
+ mapping(address => mapping(address => address)) public override getPair;
+ address[] public override allPairs;
+
+ event PairCreated(address indexed token0, address indexed token1, address pair, uint);
+
+ constructor(address _feeToSetter) public {
+ feeToSetter = _feeToSetter;
+ }
+
+ function allPairsLength() external override view returns (uint) {
+ return allPairs.length;
+ }
+
+ function pairCodeHash() external pure returns (bytes32) {
+ return keccak256(type(UniswapV2Pair).creationCode);
+ }
+
+ function createPair(address tokenA, address tokenB) external override returns (address pair) {
+ require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
+ (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
+ require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
+ require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
+ bytes memory bytecode = type(UniswapV2Pair).creationCode;
+ bytes32 salt = keccak256(abi.encodePacked(token0, token1));
+ assembly {
+ pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
+ }
+ UniswapV2Pair(pair).initialize(token0, token1);
+ getPair[token0][token1] = pair;
+ getPair[token1][token0] = pair; // populate mapping in the reverse direction
+ allPairs.push(pair);
+ emit PairCreated(token0, token1, pair, allPairs.length);
+ }
+
+ function setFeeTo(address _feeTo) external override {
+ require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
+ feeTo = _feeTo;
+ }
+
+ function setMigrator(address _migrator) external override {
+ require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
+ migrator = _migrator;
+ }
+
+ function setFeeToSetter(address _feeToSetter) external override {
+ require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
+ feeToSetter = _feeToSetter;
+ }
+
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Pair.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Pair.sol
new file mode 100644
index 000000000000..408cde6cf9a3
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Pair.sol
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './UniswapV2ERC20.sol';
+import './libraries/Math.sol';
+import './libraries/UQ112x112.sol';
+import './interfaces/IERC20.sol';
+import './interfaces/IUniswapV2Factory.sol';
+import './interfaces/IUniswapV2Callee.sol';
+
+interface IMigrator {
+ // Return the desired amount of liquidity token that the migrator wants.
+ function desiredLiquidity() external view returns (uint256);
+}
+
+contract UniswapV2Pair is UniswapV2ERC20 {
+ using SafeMathUniswap for uint;
+ using UQ112x112 for uint224;
+
+ uint public constant MINIMUM_LIQUIDITY = 10**3;
+ bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
+
+ address public factory;
+ address public token0;
+ address public token1;
+
+ uint112 private reserve0; // uses single storage slot, accessible via getReserves
+ uint112 private reserve1; // uses single storage slot, accessible via getReserves
+ uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves
+
+ uint public price0CumulativeLast;
+ uint public price1CumulativeLast;
+ uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event
+
+ uint private unlocked = 1;
+ modifier lock() {
+ require(unlocked == 1, 'UniswapV2: LOCKED');
+ unlocked = 0;
+ _;
+ unlocked = 1;
+ }
+
+ function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
+ _reserve0 = reserve0;
+ _reserve1 = reserve1;
+ _blockTimestampLast = blockTimestampLast;
+ }
+
+ function _safeTransfer(address token, address to, uint value) private {
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'UniswapV2: TRANSFER_FAILED');
+ }
+
+ event Mint(address indexed sender, uint amount0, uint amount1);
+ event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
+ event Swap(
+ address indexed sender,
+ uint amount0In,
+ uint amount1In,
+ uint amount0Out,
+ uint amount1Out,
+ address indexed to
+ );
+ event Sync(uint112 reserve0, uint112 reserve1);
+
+ constructor() public {
+ factory = msg.sender;
+ }
+
+ // called once by the factory at time of deployment
+ function initialize(address _token0, address _token1) external {
+ require(msg.sender == factory, 'UniswapV2: FORBIDDEN'); // sufficient check
+ token0 = _token0;
+ token1 = _token1;
+ }
+
+ // update reserves and, on the first call per block, price accumulators
+ function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
+ require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'UniswapV2: OVERFLOW');
+ uint32 blockTimestamp = uint32(block.timestamp % 2**32);
+ uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
+ if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
+ // * never overflows, and + overflow is desired
+ price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
+ price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
+ }
+ reserve0 = uint112(balance0);
+ reserve1 = uint112(balance1);
+ blockTimestampLast = blockTimestamp;
+ emit Sync(reserve0, reserve1);
+ }
+
+ // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
+ function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
+ address feeTo = IUniswapV2Factory(factory).feeTo();
+ feeOn = feeTo != address(0);
+ uint _kLast = kLast; // gas savings
+ if (feeOn) {
+ if (_kLast != 0) {
+ uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
+ uint rootKLast = Math.sqrt(_kLast);
+ if (rootK > rootKLast) {
+ uint numerator = totalSupply.mul(rootK.sub(rootKLast));
+ uint denominator = rootK.mul(5).add(rootKLast);
+ uint liquidity = numerator / denominator;
+ if (liquidity > 0) _mint(feeTo, liquidity);
+ }
+ }
+ } else if (_kLast != 0) {
+ kLast = 0;
+ }
+ }
+
+ // this low-level function should be called from a contract which performs important safety checks
+ function mint(address to) external lock returns (uint liquidity) {
+ (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
+ uint balance0 = IERC20Uniswap(token0).balanceOf(address(this));
+ uint balance1 = IERC20Uniswap(token1).balanceOf(address(this));
+ uint amount0 = balance0.sub(_reserve0);
+ uint amount1 = balance1.sub(_reserve1);
+
+ bool feeOn = _mintFee(_reserve0, _reserve1);
+ uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
+ if (_totalSupply == 0) {
+ address migrator = IUniswapV2Factory(factory).migrator();
+ if (msg.sender == migrator) {
+ liquidity = IMigrator(migrator).desiredLiquidity();
+ require(liquidity > 0 && liquidity != uint256(-1), "Bad desired liquidity");
+ } else {
+ require(migrator == address(0), "Must not have migrator");
+ liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
+ _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
+ }
+ } else {
+ liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
+ }
+ require(liquidity > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED');
+ _mint(to, liquidity);
+
+ _update(balance0, balance1, _reserve0, _reserve1);
+ if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
+ emit Mint(msg.sender, amount0, amount1);
+ }
+
+ // this low-level function should be called from a contract which performs important safety checks
+ function burn(address to) external lock returns (uint amount0, uint amount1) {
+ (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
+ address _token0 = token0; // gas savings
+ address _token1 = token1; // gas savings
+ uint balance0 = IERC20Uniswap(_token0).balanceOf(address(this));
+ uint balance1 = IERC20Uniswap(_token1).balanceOf(address(this));
+ uint liquidity = balanceOf[address(this)];
+
+ bool feeOn = _mintFee(_reserve0, _reserve1);
+ uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
+ amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
+ amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
+ require(amount0 > 0 && amount1 > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED');
+ _burn(address(this), liquidity);
+ _safeTransfer(_token0, to, amount0);
+ _safeTransfer(_token1, to, amount1);
+ balance0 = IERC20Uniswap(_token0).balanceOf(address(this));
+ balance1 = IERC20Uniswap(_token1).balanceOf(address(this));
+
+ _update(balance0, balance1, _reserve0, _reserve1);
+ if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
+ emit Burn(msg.sender, amount0, amount1, to);
+ }
+
+ // this low-level function should be called from a contract which performs important safety checks
+ function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
+ require(amount0Out > 0 || amount1Out > 0, 'UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT');
+ (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
+ require(amount0Out < _reserve0 && amount1Out < _reserve1, 'UniswapV2: INSUFFICIENT_LIQUIDITY');
+
+ uint balance0;
+ uint balance1;
+ { // scope for _token{0,1}, avoids stack too deep errors
+ address _token0 = token0;
+ address _token1 = token1;
+ require(to != _token0 && to != _token1, 'UniswapV2: INVALID_TO');
+ if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
+ if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
+ if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
+ balance0 = IERC20Uniswap(_token0).balanceOf(address(this));
+ balance1 = IERC20Uniswap(_token1).balanceOf(address(this));
+ }
+ uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
+ uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
+ require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');
+ { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
+ uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
+ uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
+ require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K');
+ }
+
+ _update(balance0, balance1, _reserve0, _reserve1);
+ emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
+ }
+
+ // force balances to match reserves
+ function skim(address to) external lock {
+ address _token0 = token0; // gas savings
+ address _token1 = token1; // gas savings
+ _safeTransfer(_token0, to, IERC20Uniswap(_token0).balanceOf(address(this)).sub(reserve0));
+ _safeTransfer(_token1, to, IERC20Uniswap(_token1).balanceOf(address(this)).sub(reserve1));
+ }
+
+ // force reserves to match balances
+ function sync() external lock {
+ _update(IERC20Uniswap(token0).balanceOf(address(this)), IERC20Uniswap(token1).balanceOf(address(this)), reserve0, reserve1);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Router02.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Router02.sol
new file mode 100644
index 000000000000..663a38d87901
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/UniswapV2Router02.sol
@@ -0,0 +1,460 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+import './libraries/UniswapV2Library.sol';
+import './libraries/SafeMath.sol';
+import './libraries/TransferHelper.sol';
+import './interfaces/IUniswapV2Router02.sol';
+import './interfaces/IUniswapV2Factory.sol';
+import './interfaces/IERC20.sol';
+import './interfaces/IWETH.sol';
+
+contract UniswapV2Router02 is IUniswapV2Router02 {
+ using SafeMathUniswap for uint;
+
+ address public immutable override factory;
+ // CHANGE_OMGX
+ //address public immutable override WETH;
+
+ modifier ensure(uint deadline) {
+ require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
+ _;
+ }
+
+ constructor(address _factory, address _WETH) public {
+ factory = _factory;
+ // CHANGE_OMGX
+ //WETH = _WETH;
+ }
+
+ // CHANGE_OMGX
+ // receive() external payable {
+ // assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
+ // }
+
+ // **** ADD LIQUIDITY ****
+ function _addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint amountADesired,
+ uint amountBDesired,
+ uint amountAMin,
+ uint amountBMin
+ ) internal virtual returns (uint amountA, uint amountB) {
+ // create the pair if it doesn't exist yet
+ if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
+ IUniswapV2Factory(factory).createPair(tokenA, tokenB);
+ }
+ (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
+ if (reserveA == 0 && reserveB == 0) {
+ (amountA, amountB) = (amountADesired, amountBDesired);
+ } else {
+ uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
+ if (amountBOptimal <= amountBDesired) {
+ require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
+ (amountA, amountB) = (amountADesired, amountBOptimal);
+ } else {
+ uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
+ assert(amountAOptimal <= amountADesired);
+ require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
+ (amountA, amountB) = (amountAOptimal, amountBDesired);
+ }
+ }
+ }
+ function addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint amountADesired,
+ uint amountBDesired,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
+ (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
+ address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
+ TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
+ TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
+ liquidity = IUniswapV2Pair(pair).mint(to);
+ }
+
+ // CHANGE_OMGX
+ // function addLiquidityETH(
+ // address token,
+ // uint amountTokenDesired,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
+ // (amountToken, amountETH) = _addLiquidity(
+ // token,
+ // WETH,
+ // amountTokenDesired,
+ // msg.value,
+ // amountTokenMin,
+ // amountETHMin
+ // );
+ // address pair = UniswapV2Library.pairFor(factory, token, WETH);
+ // TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
+ // IWETH(WETH).deposit{value: amountETH}();
+ // assert(IWETH(WETH).transfer(pair, amountETH));
+ // liquidity = IUniswapV2Pair(pair).mint(to);
+ // // refund dust eth, if any
+ // if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
+ // }
+
+ // **** REMOVE LIQUIDITY ****
+ function removeLiquidity(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
+ address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
+ IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
+ (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
+ (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
+ (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
+ require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
+ require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
+ }
+
+ // CHANGE_OMGX
+ // function removeLiquidityETH(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
+ // (amountToken, amountETH) = removeLiquidity(
+ // token,
+ // WETH,
+ // liquidity,
+ // amountTokenMin,
+ // amountETHMin,
+ // address(this),
+ // deadline
+ // );
+ // TransferHelper.safeTransfer(token, to, amountToken);
+ // IWETH(WETH).withdraw(amountETH);
+ // TransferHelper.safeTransferETH(to, amountETH);
+ // }
+ function removeLiquidityWithPermit(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline,
+ bool approveMax, uint8 v, bytes32 r, bytes32 s
+ ) external virtual override returns (uint amountA, uint amountB) {
+ address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
+ uint value = approveMax ? uint(-1) : liquidity;
+ IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
+ (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
+ }
+
+ // CHANGE_OMGX
+ // function removeLiquidityETHWithPermit(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external virtual override returns (uint amountToken, uint amountETH) {
+ // address pair = UniswapV2Library.pairFor(factory, token, WETH);
+ // uint value = approveMax ? uint(-1) : liquidity;
+ // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
+ // (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
+ // }
+
+ // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
+ // function removeLiquidityETHSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) public virtual override ensure(deadline) returns (uint amountETH) {
+ // (, amountETH) = removeLiquidity(
+ // token,
+ // WETH,
+ // liquidity,
+ // amountTokenMin,
+ // amountETHMin,
+ // address(this),
+ // deadline
+ // );
+ // TransferHelper.safeTransfer(token, to, IERC20Uniswap(token).balanceOf(address(this)));
+ // IWETH(WETH).withdraw(amountETH);
+ // TransferHelper.safeTransferETH(to, amountETH);
+ // }
+ // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external virtual override returns (uint amountETH) {
+ // address pair = UniswapV2Library.pairFor(factory, token, WETH);
+ // uint value = approveMax ? uint(-1) : liquidity;
+ // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
+ // amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
+ // token, liquidity, amountTokenMin, amountETHMin, to, deadline
+ // );
+ // }
+
+ // **** SWAP ****
+ // requires the initial amount to have already been sent to the first pair
+ function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
+ for (uint i; i < path.length - 1; i++) {
+ (address input, address output) = (path[i], path[i + 1]);
+ (address token0,) = UniswapV2Library.sortTokens(input, output);
+ uint amountOut = amounts[i + 1];
+ (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
+ address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
+ IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
+ amount0Out, amount1Out, to, new bytes(0)
+ );
+ }
+ }
+ function swapExactTokensForTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
+ amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
+ require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ TransferHelper.safeTransferFrom(
+ path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ );
+ _swap(amounts, path, to);
+ }
+ function swapTokensForExactTokens(
+ uint amountOut,
+ uint amountInMax,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
+ amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
+ TransferHelper.safeTransferFrom(
+ path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ );
+ _swap(amounts, path, to);
+ }
+
+ // CHANGE_OMGX
+ // function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // payable
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
+ // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ // IWETH(WETH).deposit{value: amounts[0]}();
+ // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
+ // _swap(amounts, path, to);
+ // }
+ // function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ // require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
+ // TransferHelper.safeTransferFrom(
+ // path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ // );
+ // _swap(amounts, path, address(this));
+ // IWETH(WETH).withdraw(amounts[amounts.length - 1]);
+ // TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
+ // }
+ // function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
+ // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ // TransferHelper.safeTransferFrom(
+ // path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
+ // );
+ // _swap(amounts, path, address(this));
+ // IWETH(WETH).withdraw(amounts[amounts.length - 1]);
+ // TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
+ // }
+ // function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
+ // external
+ // virtual
+ // override
+ // payable
+ // ensure(deadline)
+ // returns (uint[] memory amounts)
+ // {
+ // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ // require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
+ // IWETH(WETH).deposit{value: amounts[0]}();
+ // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
+ // _swap(amounts, path, to);
+ // // refund dust eth, if any
+ // if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
+ // }
+
+ // **** SWAP (supporting fee-on-transfer tokens) ****
+ // requires the initial amount to have already been sent to the first pair
+ function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
+ for (uint i; i < path.length - 1; i++) {
+ (address input, address output) = (path[i], path[i + 1]);
+ (address token0,) = UniswapV2Library.sortTokens(input, output);
+ IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
+ uint amountInput;
+ uint amountOutput;
+ { // scope to avoid stack too deep errors
+ (uint reserve0, uint reserve1,) = pair.getReserves();
+ (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
+ amountInput = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
+ amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
+ }
+ (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
+ address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
+ pair.swap(amount0Out, amount1Out, to, new bytes(0));
+ }
+ }
+ function swapExactTokensForTokensSupportingFeeOnTransferTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external virtual override ensure(deadline) {
+ TransferHelper.safeTransferFrom(
+ path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
+ );
+ uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
+ _swapSupportingFeeOnTransferTokens(path, to);
+ require(
+ IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
+ 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
+ );
+ }
+
+ // CHANGE_OMGX
+ // function swapExactETHForTokensSupportingFeeOnTransferTokens(
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // )
+ // external
+ // virtual
+ // override
+ // payable
+ // ensure(deadline)
+ // {
+ // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // uint amountIn = msg.value;
+ // IWETH(WETH).deposit{value: amountIn}();
+ // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
+ // uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
+ // _swapSupportingFeeOnTransferTokens(path, to);
+ // require(
+ // IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
+ // 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
+ // );
+ // }
+ // function swapExactTokensForETHSupportingFeeOnTransferTokens(
+ // uint amountIn,
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // )
+ // external
+ // virtual
+ // override
+ // ensure(deadline)
+ // {
+ // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
+ // TransferHelper.safeTransferFrom(
+ // path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
+ // );
+ // _swapSupportingFeeOnTransferTokens(path, address(this));
+ // uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
+ // require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
+ // IWETH(WETH).withdraw(amountOut);
+ // TransferHelper.safeTransferETH(to, amountOut);
+ // }
+
+ // **** LIBRARY FUNCTIONS ****
+ function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
+ return UniswapV2Library.quote(amountA, reserveA, reserveB);
+ }
+
+ function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
+ public
+ pure
+ virtual
+ override
+ returns (uint amountOut)
+ {
+ return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
+ }
+
+ function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
+ public
+ pure
+ virtual
+ override
+ returns (uint amountIn)
+ {
+ return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
+ }
+
+ function getAmountsOut(uint amountIn, address[] memory path)
+ public
+ view
+ virtual
+ override
+ returns (uint[] memory amounts)
+ {
+ return UniswapV2Library.getAmountsOut(factory, amountIn, path);
+ }
+
+ function getAmountsIn(uint amountOut, address[] memory path)
+ public
+ view
+ virtual
+ override
+ returns (uint[] memory amounts)
+ {
+ return UniswapV2Library.getAmountsIn(factory, amountOut, path);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IERC20.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IERC20.sol
new file mode 100644
index 000000000000..fd7b169f23fb
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IERC20.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IERC20Uniswap {
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+
+ function name() external view returns (string memory);
+ function symbol() external view returns (string memory);
+ function decimals() external view returns (uint8);
+ function totalSupply() external view returns (uint);
+ function balanceOf(address owner) external view returns (uint);
+ function allowance(address owner, address spender) external view returns (uint);
+
+ function approve(address spender, uint value) external returns (bool);
+ function transfer(address to, uint value) external returns (bool);
+ function transferFrom(address from, address to, uint value) external returns (bool);
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Callee.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Callee.sol
new file mode 100644
index 000000000000..a11b1c4b6916
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Callee.sol
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2Callee {
+ function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2ERC20.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2ERC20.sol
new file mode 100644
index 000000000000..41fb595b3b31
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2ERC20.sol
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2ERC20 {
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+
+ function name() external pure returns (string memory);
+ function symbol() external pure returns (string memory);
+ function decimals() external pure returns (uint8);
+ function totalSupply() external view returns (uint);
+ function balanceOf(address owner) external view returns (uint);
+ function allowance(address owner, address spender) external view returns (uint);
+
+ function approve(address spender, uint value) external returns (bool);
+ function transfer(address to, uint value) external returns (bool);
+ function transferFrom(address from, address to, uint value) external returns (bool);
+
+ function DOMAIN_SEPARATOR() external view returns (bytes32);
+ function PERMIT_TYPEHASH() external pure returns (bytes32);
+ function nonces(address owner) external view returns (uint);
+
+ function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Factory.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Factory.sol
new file mode 100644
index 000000000000..aea4477135b6
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Factory.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2Factory {
+ event PairCreated(address indexed token0, address indexed token1, address pair, uint);
+
+ function feeTo() external view returns (address);
+ function feeToSetter() external view returns (address);
+ function migrator() external view returns (address);
+
+ function getPair(address tokenA, address tokenB) external view returns (address pair);
+ function allPairs(uint) external view returns (address pair);
+ function allPairsLength() external view returns (uint);
+
+ function createPair(address tokenA, address tokenB) external returns (address pair);
+
+ function setFeeTo(address) external;
+ function setFeeToSetter(address) external;
+ function setMigrator(address) external;
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol
new file mode 100644
index 000000000000..9c69f709a775
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+interface IUniswapV2Pair {
+ event Approval(address indexed owner, address indexed spender, uint value);
+ event Transfer(address indexed from, address indexed to, uint value);
+
+ function name() external pure returns (string memory);
+ function symbol() external pure returns (string memory);
+ function decimals() external pure returns (uint8);
+ function totalSupply() external view returns (uint);
+ function balanceOf(address owner) external view returns (uint);
+ function allowance(address owner, address spender) external view returns (uint);
+
+ function approve(address spender, uint value) external returns (bool);
+ function transfer(address to, uint value) external returns (bool);
+ function transferFrom(address from, address to, uint value) external returns (bool);
+
+ function DOMAIN_SEPARATOR() external view returns (bytes32);
+ function PERMIT_TYPEHASH() external pure returns (bytes32);
+ function nonces(address owner) external view returns (uint);
+
+ function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
+
+ event Mint(address indexed sender, uint amount0, uint amount1);
+ event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
+ event Swap(
+ address indexed sender,
+ uint amount0In,
+ uint amount1In,
+ uint amount0Out,
+ uint amount1Out,
+ address indexed to
+ );
+ event Sync(uint112 reserve0, uint112 reserve1);
+
+ function MINIMUM_LIQUIDITY() external pure returns (uint);
+ function factory() external view returns (address);
+ function token0() external view returns (address);
+ function token1() external view returns (address);
+ function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
+ function price0CumulativeLast() external view returns (uint);
+ function price1CumulativeLast() external view returns (uint);
+ function kLast() external view returns (uint);
+
+ function mint(address to) external returns (uint liquidity);
+ function burn(address to) external returns (uint amount0, uint amount1);
+ function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
+ function skim(address to) external;
+ function sync() external;
+
+ function initialize(address, address) external;
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Router01.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Router01.sol
new file mode 100644
index 000000000000..0058a03607cd
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Router01.sol
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.6.2;
+
+interface IUniswapV2Router01 {
+ function factory() external pure returns (address);
+ // CHANGE_OMGX
+ //function WETH() external view returns (address);
+
+ function addLiquidity(
+ address tokenA,
+ address tokenB,
+ uint amountADesired,
+ uint amountBDesired,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) external returns (uint amountA, uint amountB, uint liquidity);
+ // CHANGE_OMGX
+ // function addLiquidityETH(
+ // address token,
+ // uint amountTokenDesired,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
+ function removeLiquidity(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline
+ ) external returns (uint amountA, uint amountB);
+ // CHANGE_OMGX
+ // function removeLiquidityETH(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external returns (uint amountToken, uint amountETH);
+ function removeLiquidityWithPermit(
+ address tokenA,
+ address tokenB,
+ uint liquidity,
+ uint amountAMin,
+ uint amountBMin,
+ address to,
+ uint deadline,
+ bool approveMax, uint8 v, bytes32 r, bytes32 s
+ ) external returns (uint amountA, uint amountB);
+ // CHANGE_OMGX
+ // function removeLiquidityETHWithPermit(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external returns (uint amountToken, uint amountETH);
+ function swapExactTokensForTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external returns (uint[] memory amounts);
+ function swapTokensForExactTokens(
+ uint amountOut,
+ uint amountInMax,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external returns (uint[] memory amounts);
+ // CHANGE_OMGX
+ // function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // payable
+ // returns (uint[] memory amounts);
+ // function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
+ // external
+ // returns (uint[] memory amounts);
+ // function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
+ // external
+ // returns (uint[] memory amounts);
+ // function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
+ // external
+ // payable
+ // returns (uint[] memory amounts);
+
+ function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
+ function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
+ function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
+ function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
+ function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol
new file mode 100644
index 000000000000..9c5c95dc33cb
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.6.2;
+
+import './IUniswapV2Router01.sol';
+
+interface IUniswapV2Router02 is IUniswapV2Router01 {
+ // CHANGE_OMGX
+ // function removeLiquidityETHSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline
+ // ) external returns (uint amountETH);
+ // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
+ // address token,
+ // uint liquidity,
+ // uint amountTokenMin,
+ // uint amountETHMin,
+ // address to,
+ // uint deadline,
+ // bool approveMax, uint8 v, bytes32 r, bytes32 s
+ // ) external returns (uint amountETH);
+
+ function swapExactTokensForTokensSupportingFeeOnTransferTokens(
+ uint amountIn,
+ uint amountOutMin,
+ address[] calldata path,
+ address to,
+ uint deadline
+ ) external;
+ // CHANGE_OMGX
+ // function swapExactETHForTokensSupportingFeeOnTransferTokens(
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // ) external payable;
+ // function swapExactTokensForETHSupportingFeeOnTransferTokens(
+ // uint amountIn,
+ // uint amountOutMin,
+ // address[] calldata path,
+ // address to,
+ // uint deadline
+ // ) external;
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IWETH.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IWETH.sol
new file mode 100644
index 000000000000..96b77b74204d
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/interfaces/IWETH.sol
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+// CHANGE_OMGX
+// interface IWETH {
+// function deposit() external payable;
+// function transfer(address to, uint value) external returns (bool);
+// function withdraw(uint) external;
+// }
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/Math.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/Math.sol
new file mode 100644
index 000000000000..d183d80ba13a
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/Math.sol
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+// a library for performing various math operations
+
+library Math {
+ function min(uint x, uint y) internal pure returns (uint z) {
+ z = x < y ? x : y;
+ }
+
+ // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
+ function sqrt(uint y) internal pure returns (uint z) {
+ if (y > 3) {
+ z = y;
+ uint x = y / 2 + 1;
+ while (x < z) {
+ z = x;
+ x = (y / x + x) / 2;
+ }
+ } else if (y != 0) {
+ z = 1;
+ }
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/SafeMath.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/SafeMath.sol
new file mode 100644
index 000000000000..1cc199b6fd67
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/SafeMath.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
+
+library SafeMathUniswap {
+ function add(uint x, uint y) internal pure returns (uint z) {
+ require((z = x + y) >= x, 'ds-math-add-overflow');
+ }
+
+ function sub(uint x, uint y) internal pure returns (uint z) {
+ require((z = x - y) <= x, 'ds-math-sub-underflow');
+ }
+
+ function mul(uint x, uint y) internal pure returns (uint z) {
+ require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/TransferHelper.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/TransferHelper.sol
new file mode 100644
index 000000000000..d179a67a9648
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/TransferHelper.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.6.0;
+
+// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
+library TransferHelper {
+ function safeApprove(address token, address to, uint value) internal {
+ // bytes4(keccak256(bytes('approve(address,uint256)')));
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
+ }
+
+ function safeTransfer(address token, address to, uint value) internal {
+ // bytes4(keccak256(bytes('transfer(address,uint256)')));
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
+ }
+
+ function safeTransferFrom(address token, address from, address to, uint value) internal {
+ // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
+ (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
+ require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
+ }
+
+ function safeTransferETH(address to, uint value) internal {
+ (bool success,) = to.call{value:value}(new bytes(0));
+ require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/UQ112x112.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/UQ112x112.sol
new file mode 100644
index 000000000000..9af8f74975b3
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/UQ112x112.sol
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity =0.6.12;
+
+// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
+
+// range: [0, 2**112 - 1]
+// resolution: 1 / 2**112
+
+library UQ112x112 {
+ uint224 constant Q112 = 2**112;
+
+ // encode a uint112 as a UQ112x112
+ function encode(uint112 y) internal pure returns (uint224 z) {
+ z = uint224(y) * Q112; // never overflows
+ }
+
+ // divide a UQ112x112 by a uint112, returning a UQ112x112
+ function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
+ z = x / uint224(y);
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/UniswapV2Library.sol b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/UniswapV2Library.sol
new file mode 100644
index 000000000000..14cffb0583f6
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts/uniswapv2/libraries/UniswapV2Library.sol
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.5.0;
+
+import '../interfaces/IUniswapV2Pair.sol';
+
+import "./SafeMath.sol";
+
+library UniswapV2Library {
+ using SafeMathUniswap for uint;
+
+ // returns sorted token addresses, used to handle return values from pairs sorted in this order
+ function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
+ require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
+ (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
+ require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
+ }
+
+ // calculates the CREATE2 address for a pair without making any external calls
+ function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
+ (address token0, address token1) = sortTokens(tokenA, tokenB);
+ pair = address(uint(keccak256(abi.encodePacked(
+ hex'ff',
+ factory,
+ keccak256(abi.encodePacked(token0, token1)),
+ hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
+ ))));
+ }
+
+ // fetches and sorts the reserves for a pair
+ function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
+ (address token0,) = sortTokens(tokenA, tokenB);
+ (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
+ (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
+ }
+
+ // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
+ function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
+ require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
+ require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
+ amountB = amountA.mul(reserveB) / reserveA;
+ }
+
+ // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
+ function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
+ require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
+ require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
+ uint amountInWithFee = amountIn.mul(997);
+ uint numerator = amountInWithFee.mul(reserveOut);
+ uint denominator = reserveIn.mul(1000).add(amountInWithFee);
+ amountOut = numerator / denominator;
+ }
+
+ // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
+ function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
+ require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
+ require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
+ uint numerator = reserveIn.mul(amountOut).mul(1000);
+ uint denominator = reserveOut.sub(amountOut).mul(997);
+ amountIn = (numerator / denominator).add(1);
+ }
+
+ // performs chained getAmountOut calculations on any number of pairs
+ function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
+ require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
+ amounts = new uint[](path.length);
+ amounts[0] = amountIn;
+ for (uint i; i < path.length - 1; i++) {
+ (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
+ amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
+ }
+ }
+
+ // performs chained getAmountIn calculations on any number of pairs
+ function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
+ require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
+ amounts = new uint[](path.length);
+ amounts[amounts.length - 1] = amountOut;
+ for (uint i = path.length - 1; i > 0; i--) {
+ (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
+ amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
+ }
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts_trivial/ERC20.sol b/omgx_utilities/contracts-analyzer/contracts_trivial/ERC20.sol
new file mode 100644
index 000000000000..8d9d90072ee5
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts_trivial/ERC20.sol
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.8.0;
+import { IERC20 } from "./interfaces/IERC20.sol";
+
+/**
+ * @title ERC20
+ * @dev A super simple ERC20 implementation!
+ */
+contract ERC20 is IERC20 {
+ /*************
+ * Variables *
+ *************/
+
+ mapping (address => uint256) public balances;
+ mapping (address => mapping (address => uint256)) public allowances;
+
+ // Some optional extra goodies.
+ uint256 public override totalSupply;
+ string public name;
+ uint8 public decimals;
+ string public symbol; //An identifier: eg SBX
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _initialSupply Initial maximum token supply.
+ * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).
+ */
+ constructor(
+ uint256 _initialSupply,
+ string memory _name,
+ uint8 _decimalUnits,
+ string memory _tokenSymbol
+ ) {
+ balances[msg.sender] = _initialSupply;
+ totalSupply = _initialSupply;
+ name = _name;
+ decimals = _decimalUnits;
+ symbol = _tokenSymbol;
+ }
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Mints new coins to the sender.
+ * @param _amount Amount to mint.
+ * @return true if the mint was successful.
+ */
+ function mint(
+ uint256 _amount
+ )
+ public
+ returns (
+ bool
+ )
+ {
+ //TODO SafeMath here
+ balances[msg.sender] += _amount;
+ totalSupply += _amount;
+ return true;
+ }
+
+ /**
+ * Checks the balance of an address.
+ * @param _owner Address to check a balance for.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _owner
+ )
+ external
+ override
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_owner];
+ }
+
+ /**
+ * Transfers a balance from your account to someone else's account!
+ * @param _to Address to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transfer(
+ address _to,
+ uint256 _amount
+ )
+ external
+ override
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[msg.sender] >= _amount,
+ "You don't have enough balance to make this transfer!"
+ );
+
+ balances[msg.sender] -= _amount;
+ balances[_to] += _amount;
+
+ emit Transfer(
+ msg.sender,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Transfers a balance from someone else's account to another account. You need an allowance
+ * from the sending account for this to work!
+ * @param _from Account to transfer a balance from.
+ * @param _to Account to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _amount
+ )
+ external
+ override
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[_from] >= _amount,
+ "Can't transfer from the desired account because it doesn't have enough balance."
+ );
+
+ require(
+ allowances[_from][msg.sender] >= _amount,
+ "Can't transfer from the desired account because you don't have enough of an allowance."
+ );
+
+ balances[_to] += _amount;
+ balances[_from] -= _amount;
+
+ emit Transfer(
+ _from,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Approves an account to spend some amount from your account.
+ * @param _spender Account to approve a balance for.
+ * @param _amount Amount to allow the account to spend from your account.
+ * @return true if the allowance was successful.
+ */
+ function approve(
+ address _spender,
+ uint256 _amount
+ )
+ external
+ override
+ returns (
+ bool
+ )
+ {
+ allowances[msg.sender][_spender] = _amount;
+
+ emit Approval(
+ msg.sender,
+ _spender,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks how much a given account is allowed to spend from another given account.
+ * @param _owner Address of the account to check an allowance from.
+ * @param _spender Address of the account trying to spend from the owner.
+ * @return Allowance for the spender from the owner.
+ */
+ function allowance(
+ address _owner,
+ address _spender
+ )
+ external
+ override
+ view
+ returns (
+ uint256
+ )
+ {
+ return allowances[_owner][_spender];
+ }
+
+ /**
+ * Mints new coins to an account.
+ * @param _owner Address of the account to mint to.
+ * @param _amount Amount to mint.
+ * @return true if the mint was successful.
+ */
+ function _mint(
+ address _owner,
+ uint256 _amount
+ )
+ internal
+ returns (
+ bool
+ )
+ {
+ //TODO SafeMath here
+ balances[_owner] += _amount;
+ totalSupply += _amount;
+ return true;
+ }
+
+ /**
+ * Burns coins from an account.
+ * @param _owner Address of the account to mint to.
+ * @param _amount Amount to mint.
+ * @return true if the mint was successful.
+ */
+ function _burn(
+ address _owner,
+ uint256 _amount
+ )
+ internal
+ returns (
+ bool
+ )
+ {
+ require(balances[_owner] >= _amount, "Account doesn't have enough coins to burn");
+ balances[_owner] -= _amount;
+ totalSupply -= _amount; //TODO SafeMath here
+ return true;
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts_trivial/LiquidityPool.sol b/omgx_utilities/contracts-analyzer/contracts_trivial/LiquidityPool.sol
new file mode 100644
index 000000000000..ce844b30c67b
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts_trivial/LiquidityPool.sol
@@ -0,0 +1,230 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+
+import "./ERC20.sol";
+
+/* Library Imports */
+import { OVM_CrossDomainEnabled } from "@eth-optimism/contracts/libraries/bridge/OVM_CrossDomainEnabled.sol";
+
+/**
+ * @title LiquidityPool
+ * @dev A super simple LiquidityPool implementation!
+ */
+contract LiquidityPool is OVM_CrossDomainEnabled {
+ /*************
+ * Variables *
+ *************/
+
+ mapping(address => uint256) balances;
+ mapping(address => uint256) fees;
+
+ address owner;
+ uint256 fee;
+
+ /********************************
+ * Constructor & Initialization *
+ ********************************/
+
+ /**
+ * @param _l2CrossDomainMessenger L1 Messenger address being used for cross-chain communications.
+ */
+ constructor(
+ address _l2CrossDomainMessenger
+ )
+ OVM_CrossDomainEnabled(_l2CrossDomainMessenger)
+ {
+ owner = msg.sender;
+ }
+
+ /********************
+ * Event *
+ ********************/
+
+ event initiateDepositedTo(
+ address sender,
+ uint256 amount,
+ address erc20ContractAddress
+ );
+
+ event depositedTo(
+ address sender,
+ uint256 amount,
+ address erc20ContractAddress
+ );
+
+ event depositedToFinalized(
+ address sender,
+ uint256 amount,
+ address erc20ContractAddress
+ );
+
+ event withdrewFee(
+ address sender,
+ address receiver,
+ address erc20ContractAddress,
+ uint256 amount
+ );
+
+ /**********************
+ * Function Modifiers *
+ **********************/
+
+ modifier onlyOwner() {
+ require(msg.sender == owner, "You don't own this contract");
+ _;
+ }
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ // Default gas value which can be overridden if more complex logic runs on L2.
+ uint32 constant DEFAULT_FINALIZE_DEPOSIT_L2_GAS = 1200000;
+
+ /**
+ * @dev Initialize this contract with the L1 token gateway address.
+ * The flow: 1) this contract gets deployed on L2, 2) the L1
+ * gateway is deployed with addr from (1), 3) L1 gateway address passed here.
+ *
+ * @param _fee Transaction fee
+ */
+ function init(
+ uint256 _fee
+ )
+ public
+ onlyOwner()
+ {
+ fee = _fee;
+ }
+
+ /**
+ * @dev Overridable getter for the *L2* gas limit of settling the deposit, in the case it may be
+ * dynamic, and the above public constant does not suffice.
+ *
+ */
+
+ function getFinalizeDepositL2Gas()
+ public
+ view
+ virtual
+ returns(
+ uint32
+ )
+ {
+ return DEFAULT_FINALIZE_DEPOSIT_L2_GAS;
+ }
+
+ /**
+ * Checks the balance of an address.
+ * @param _erc20ContractAddress Address of ERC20.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _erc20ContractAddress
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_erc20ContractAddress];
+ }
+
+ /**
+ * Checks the fee balance of an address.
+ * @param _erc20ContractAddress Address of ERC20.
+ * @return Balance of the address.
+ */
+ function feeBalanceOf(
+ address _erc20ContractAddress
+ )
+ external
+ view
+ returns (
+ uint256
+ )
+ {
+ return fees[_erc20ContractAddress];
+ }
+
+ /**
+ * add a balance to this smart contract!
+ * @param _amount Amount to transfer to the other account.
+ * @param _erc20L2ContractAddress ERC20 L2 token address.
+ */
+ function initiateDepositTo(
+ uint256 _amount,
+ address _erc20L2ContractAddress
+ )
+ external
+ {
+ ERC20 erc20Contract = ERC20(_erc20L2ContractAddress);
+ require(_amount <= erc20Contract.allowance(msg.sender, address(this)));
+ require(erc20Contract.transferFrom(msg.sender, address(this), _amount), "ERC20 token transfer was unsuccessful");
+
+ balances[_erc20L2ContractAddress] += _amount;
+
+ emit initiateDepositedTo(
+ msg.sender,
+ _amount,
+ _erc20L2ContractAddress
+ );
+ }
+
+ /**
+ * deposit a balance from your account to this account!
+ * @param _amount Amount to transfer to the other account.
+ * @param _erc20L2ContractAddress ERC20 token address
+ */
+ function depositTo(
+ uint256 _amount,
+ address _erc20L2ContractAddress
+ )
+ external
+ {
+ ERC20 erc20Contract = ERC20(_erc20L2ContractAddress);
+ require(_amount <= erc20Contract.allowance(msg.sender, address(this)));
+ require(erc20Contract.transferFrom(msg.sender, address(this), _amount), "ERC20 token transfer was unsuccessful");
+
+ balances[_erc20L2ContractAddress] += _amount;
+
+ emit depositedTo(
+ msg.sender,
+ _amount,
+ _erc20L2ContractAddress
+ );
+
+ }
+
+ /**
+ * withdraw fee from ERC20
+ * @param _amount Amount to transfer to the other account.
+ * @param _erc20ContractAddress ERC20 token address.
+ * @param _receiver receiver to get the fee.
+ */
+ function withdrawFee(
+ uint _amount,
+ address _erc20ContractAddress,
+ address _receiver
+ )
+ external
+ onlyOwner()
+ {
+ ERC20 erc20Contract = ERC20(_erc20ContractAddress);
+ require(fees[_erc20ContractAddress] >= _amount);
+ require(erc20Contract.balanceOf(address(this)) >= _amount);
+ require(erc20Contract.transfer(_receiver, _amount));
+
+ balances[_erc20ContractAddress] -= _amount;
+ fees[_erc20ContractAddress] -= _amount;
+
+ emit withdrewFee(
+ msg.sender,
+ _receiver,
+ _erc20ContractAddress,
+ _amount
+ );
+ }
+
+}
diff --git a/omgx_utilities/contracts-analyzer/contracts_trivial/Proxy.sol b/omgx_utilities/contracts-analyzer/contracts_trivial/Proxy.sol
new file mode 100644
index 000000000000..87818aea4bd8
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/contracts_trivial/Proxy.sol
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.7.0;
+
+contract Proxy {
+ address facetA;
+ address owner;
+ // uint256 balance;
+
+ constructor() {
+ owner = msg.sender;
+ facetA = 0x0b22380B7c423470979AC3eD7d3c07696773dEa1;
+ // not implement can't be compiled
+ // balance = msg.sender.balance;
+ }
+
+ fallback() external payable {
+ assembly {
+
+ }
+ assembly{
+
+ }
+
+ assembly {
+
+
+
+
+
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/contracts/contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol b/omgx_utilities/contracts-analyzer/contracts_trivial/interfaces/IERC20.sol
similarity index 98%
rename from packages/contracts/contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol
rename to omgx_utilities/contracts-analyzer/contracts_trivial/interfaces/IERC20.sol
index 1c765799cd10..25631c46f025 100644
--- a/packages/contracts/contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol
+++ b/omgx_utilities/contracts-analyzer/contracts_trivial/interfaces/IERC20.sol
@@ -2,9 +2,9 @@
pragma solidity >0.5.0 <0.8.0;
/**
- * @title iOVM_ERC20
+ * @title IERC20
*/
-interface iOVM_ERC20 {
+interface IERC20 {
/* This is a slight change to the ERC20 base standard.
function totalSupply() constant returns (uint256 supply);
is replaced with:
diff --git a/omgx_utilities/contracts-analyzer/deployments/addresses.json b/omgx_utilities/contracts-analyzer/deployments/addresses.json
new file mode 100644
index 000000000000..519c523743ea
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/deployments/addresses.json
@@ -0,0 +1 @@
+{"SushiToken":"0x057ef64E23666F000b34aE31332854aCBd1c8544","SushiBar":"0x261D8c5e9742e6f7f1076Fa1F560894524e19cad","MasterChef":"0xCE3478A9E0167a6Bc5716DC39DbbbfAc38F27623","UniswapV2Factory":"0xe4EB561155AFCe723bB1fF8606Fbfe9b28d5d38D","UniswapV2Router02":"0xcf27F781841484d5CF7e155b44954D7224caF1dD","SushiRoll":"0x673cD70FA883394a1f3DEb3221937Ceb7C2618D7"}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/hardhat.config.ts b/omgx_utilities/contracts-analyzer/hardhat.config.ts
new file mode 100644
index 000000000000..1c77d95ccca9
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/hardhat.config.ts
@@ -0,0 +1,40 @@
+import '@eth-optimism/hardhat-ovm';
+import '@eth-optimism/plugins/hardhat/compiler';
+import '@eth-optimism/plugins/hardhat/ethers';
+import '@nomiclabs/hardhat-ethers';
+import '@nomiclabs/hardhat-waffle';
+import "@tenderly/hardhat-tenderly";
+
+const config = {
+ mocha: {
+ timeout: 60000,
+ },
+ networks: {
+ omgx: {
+ url: 'http://localhost:8545',
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true,
+ },
+ },
+ solidity: {
+ compilers: [
+ {
+ version: "0.6.12",
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 1
+ }
+ }
+ },
+ ],
+ },
+ ovm: {
+ solcVersion: '0.6.12',
+ },
+}
+
+export default config
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/package.json b/omgx_utilities/contracts-analyzer/package.json
new file mode 100644
index 000000000000..563ae3e90318
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "@omgx/contract-analyzer",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "build": "TARGET=ovm hardhat compile --network omgx ",
+ "deploy": "TARGET=ovm hardhat --network omgx run scripts/deploy.js",
+ "analyze": "TARGET=ovm hardhat run scripts/analyze.js",
+ "test:contracts": "hardhat test"
+ },
+ "dependencies": {
+ "@eth-optimism/ethereumjs-vm": "^4.2.0-alpha.3",
+ "@eth-optimism/hardhat-ovm": "^0.0.3"
+ },
+ "devDependencies": {
+ "@boringcrypto/boring-solidity": "boringcrypto/BoringSolidity#e06e943",
+ "@eth-optimism/plugins": "^0.0.16",
+ "@ethersproject/providers": "^5.1.2",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@nomiclabs/hardhat-waffle": "^2.0.1",
+ "@openzeppelin/contracts": "^3.1.0",
+ "@tenderly/hardhat-tenderly": "^1.0.12",
+ "chai-as-promised": "^7.1.1",
+ "chalk": "^4.1.1",
+ "dotenv": "^8.2.0",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.1.4",
+ "expect": "^26.6.2",
+ "hardhat": "2.0.6",
+ "ramda": "^0.27.1"
+ }
+}
diff --git a/omgx_utilities/contracts-analyzer/scripts/analyze.js b/omgx_utilities/contracts-analyzer/scripts/analyze.js
new file mode 100644
index 000000000000..698a89bcf59c
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/scripts/analyze.js
@@ -0,0 +1,91 @@
+const fs = require("fs");
+const chalk = require("chalk");
+const bre = require("hardhat");
+
+async function main() {
+
+ console.log(" 📡 Analyzing...\n");
+
+ try {
+
+ const alertMessages = { critical: 0, minor: 0 };
+ const dirents = fs.readdirSync(`contracts`, { withFileTypes: true });
+
+ const contractNames = dirents
+ .filter(dirent => dirent.isFile())
+ .filter(dirent => !(dirent.name === '.DS_Store'))
+ .map(dirent => dirent.name.replace(".sol", ""));
+
+ const inlineAssemblyReg = /\bassembly([\s]*)\{{1}?\s?(.)?[\s\w:=(),]+\}/gm;
+
+ for (let contractName of contractNames) {
+ console.log(` 📡 Analyzing ${chalk.cyan(contractName)}`);
+
+ const contract = fs
+ .readFileSync(`${bre.config.paths.artifacts}-ovm/contracts/${contractName}.sol/${contractName}.json`)
+ .toString();
+
+ const sizeByte = Buffer.from(
+ JSON.parse(contract).deployedBytecode.replace(/__\$\w*\$__/g, '0'.repeat(40)).slice(2),
+ 'hex'
+ ).length;
+
+ const sizeKB = (sizeByte / 1024).toFixed(2);
+
+ console.log(` 💡${chalk.cyan(contractName)} size: ${sizeKB} kB`);
+
+ if (sizeKB > 18) {
+ console.log(` 🚨${chalk.red(`${chalk.cyan(contractName)} is larger than 18 kB. It might fail to deploy on L2. Please consider reducing the contract's size.`)}`);
+ alertMessages.minor += 1;
+ }
+
+ const contractSource = fs
+ .readFileSync(`${bre.config.paths.sources}/${contractName}.sol`)
+ .toString();
+
+ const contractSourceArr = contractSource.split("\n");
+ while ((result = inlineAssemblyReg.exec(contractSource)) !== null) {
+ let index = 0;
+ const startIndex = result.index;
+ for (let i in contractSourceArr) {
+ if (index <= startIndex && index + contractSourceArr[i].length - 1 >= startIndex) {
+ console.log(` 🚨${chalk.red(`Found inline Assembly at ${bre.config.paths.sources}/${contractName}.sol#L${Number(i) + 1}`)}`);
+ alertMessages.critical += 1;
+ break;
+ }
+ index += contractSourceArr[i].length + 1;
+ }
+ }
+
+ console.log('\n');
+ }
+
+ if (alertMessages.critical === 0) {
+ console.log(` 🌕Passed\n`);
+ } else {
+ console.log(` 🚨${chalk.red(`Found ${alertMessages.critical} critical issues. Please fix them before deploying contracts.`)}\n`);
+ }
+
+ if (alertMessages.minor === 1) {
+ console.log(` 🚨${chalk.red(`Found 1 minor issue. Please review it before deploying contracts.`)}\n`);
+ } else if (alertMessages.minor > 1) {
+ console.log(` 🚨${chalk.red(`Found ${alertMessages.minor} minor issues. Please review them before deploying contracts.`)}\n`);
+ }
+
+ } catch(e) {
+ if(e.toString().indexOf("no such file or directory")>=0){
+ console.log(e)
+ return false
+ }else{
+ console.log(e);
+ return false;
+ }
+ }
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/scripts/deploy.js b/omgx_utilities/contracts-analyzer/scripts/deploy.js
new file mode 100644
index 000000000000..9527cc92554f
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/scripts/deploy.js
@@ -0,0 +1,130 @@
+const fs = require("fs");
+const dotenv = require('dotenv');
+const bre = require("hardhat");
+const { utils } = require('ethers');
+dotenv.config();
+const { deploy } = require('./utils');
+
+const env = process.env;
+const deployPrivateKey = env.DEPLOYER_PRIVATE_KEY;
+const l2RpcUrl = env.L2_NODE_WEB3_URL;
+const l2ETHAddress = "0x4200000000000000000000000000000000000006";
+
+function writeFileSyncRecursive(filename, content, charset) {
+ const folders = filename.split('/').slice(0, -1)
+ if (folders.length) {
+ // create folder path if it doesn't exist
+ folders.reduce((last, folder) => {
+ const folderPath = last ? last + '/' + folder : folder
+ if (!fs.existsSync(folderPath)) {
+ fs.mkdirSync(folderPath, { recursive: true })
+ }
+ return folderPath
+ })
+ }
+ fs.writeFileSync('.'+filename, content, charset)
+}
+
+const main = async () => {
+
+ console.log(` 📡 Deploying...\n`);
+
+ const deployAddress = new ethers.Wallet(deployPrivateKey).address;
+
+ // contracts
+ const SushiToken = await deploy({
+ contractName: "SushiToken",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: []
+ })
+
+ const SushiBar = await deploy({
+ contractName: "SushiBar",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [SushiToken.address]
+ })
+
+ const MasterChef = await deploy({
+ contractName: "MasterChef",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [
+ SushiToken.address,
+ deployAddress,
+ utils.parseEther("100000000"),
+ "0",
+ utils.parseEther("100000000")
+ ]
+ });
+
+ if (await SushiToken.owner() !== MasterChef.address) {
+ // Transfer Sushi Ownership to Chef
+ console.log(" 🔑 Transfer Sushi Ownership to Chef")
+ await (await SushiToken.transferOwnership(MasterChef.address, { gasLimit: 800000, gasPrice: 0 })).wait()
+ }
+
+ if (await MasterChef.owner() !== deployAddress) {
+ // Transfer ownership of MasterChef to Dev
+ console.log(" 🔑 Transfer ownership of MasterChef to Dev")
+ await (await MasterChef.transferOwnership(deployAddress, { gasLimit: 800000, gasPrice: 0 })).wait()
+ }
+
+ const UniswapV2Factory = await deploy({
+ contractName: "UniswapV2Factory",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [deployAddress],
+ })
+
+ const UniswapV2Router02 = await deploy({
+ contractName: "UniswapV2Router02",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ _args: [UniswapV2Factory.address, l2ETHAddress],
+ })
+
+ //const UNISWAP_ROUTER = new Map()
+ //UNISWAP_ROUTER.set("1", "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D")
+
+ const SushiRoll = await deploy({
+ contractName: "SushiRoll",
+ rpcUrl: l2RpcUrl,
+ pk: deployPrivateKey,
+ ovm: true,
+ // _args: ["0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", UniswapV2Router02.address]
+ _args: [l2ETHAddress,l2ETHAddress]
+ })
+
+ // save address
+ const addresses = {
+ SushiToken: SushiToken.address,
+ SushiBar: SushiBar.address,
+ MasterChef: MasterChef.address,
+ UniswapV2Factory: UniswapV2Factory.address,
+ UniswapV2Router02: UniswapV2Router02.address,
+ SushiRoll: SushiRoll.address,
+ }
+
+ writeFileSyncRecursive(`/deployments/addresses.json`,JSON.stringify(addresses));
+
+ console.log(
+ "\n\n 🛰 Addresses: \n",
+ addresses,
+ )
+};
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
+
+exports.deploy = deploy;
diff --git a/omgx_utilities/contracts-analyzer/scripts/utils.js b/omgx_utilities/contracts-analyzer/scripts/utils.js
new file mode 100644
index 000000000000..19fee6c14b59
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/scripts/utils.js
@@ -0,0 +1,89 @@
+/* eslint no-use-before-define: "warn" */
+const fs = require("fs");
+const chalk = require("chalk");
+const { l2ethers } = require("hardhat");
+const { utils } = require("ethers");
+const R = require("ramda");
+
+async function deploy({
+ rpcUrl,
+ contractName,
+ pk, ovm = false,
+ _args = [],
+ overrides = {},
+}) {
+
+ console.log(` 🛰 ${ovm?`OVM`:`EVM`} Deploying: ${contractName} on ${rpcUrl}`);
+
+ const contractArgs = _args || [];
+
+ const provider = new ethers.providers.JsonRpcProvider(rpcUrl)
+ const signerProvider = new ethers.Wallet(pk).connect(provider)
+
+ let contractArtifacts
+
+ if(ovm === true) {
+ contractArtifacts = await l2ethers.getContractFactory(contractName, signerProvider);
+ } else {
+ contractArtifacts = await ethers.getContractFactory(contractName, signerProvider);
+ }
+
+ const nonce = await signerProvider.getTransactionCount()
+ const deployed = await contractArtifacts.deploy(...contractArgs, { nonce, ...overrides, gasPrice: 0, gasLimit: 800000 });
+ await deployed.deployTransaction.wait()
+
+ const checkCode = async (_address) => {
+ let code = await provider.getCode(_address)
+ console.log(` 📱 Code: ${code.slice(0, 100)}`)
+ }
+
+ let result = await checkCode(deployed.address)
+ if(result=="0x"){
+ console.log("☢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸ CONTRACT DID NOT DEPLOY ☢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸â˜¢ï¸")
+ return 0
+ }
+
+ const encoded = abiEncodeArgs(deployed, contractArgs);
+ fs.writeFileSync(`artifacts-ovm/${contractName}.address`, deployed.address);
+
+ let extraGasInfo = ""
+ if(deployed&&deployed.deployTransaction){
+ const gasUsed = deployed.deployTransaction.gasLimit.mul(deployed.deployTransaction.gasPrice)
+ extraGasInfo = "("+utils.formatEther(gasUsed)+" ETH)"
+ }
+
+ console.log(
+ " 📄",
+ chalk.cyan(contractName),
+ "deployed to:",
+ chalk.magenta(deployed.address),
+ chalk.grey(extraGasInfo)
+ );
+
+ if (!encoded || encoded.length <= 2) return deployed;
+ fs.writeFileSync(`artifacts-ovm/${contractName}.args`, encoded.slice(2));
+
+ return deployed;
+};
+
+
+// abi encodes contract arguments
+// useful when you want to manually verify the contracts
+// for example, on Etherscan
+const abiEncodeArgs = (deployed, contractArgs) => {
+ // not writing abi encoded args if this does not pass
+ if (
+ !contractArgs ||
+ !deployed ||
+ !R.hasPath(["interface", "deploy"], deployed)
+ ) {
+ return "";
+ }
+ const encoded = utils.defaultAbiCoder.encode(
+ deployed.interface.deploy.inputs,
+ contractArgs
+ );
+ return encoded;
+};
+
+exports.deploy = deploy;
diff --git a/omgx_utilities/contracts-analyzer/test/MasterChef.test.js b/omgx_utilities/contracts-analyzer/test/MasterChef.test.js
new file mode 100644
index 000000000000..d9ad0dd6bd63
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/MasterChef.test.js
@@ -0,0 +1,335 @@
+
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const { advanceBlockTo } = require("./utilities/time");
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+describe("MasterChef", function () {
+ before(async function () {
+
+ this.Factory__MasterChef = new ContractFactory(
+ MasterChefJSON.abi,
+ MasterChefJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__ERC20Mock = new ContractFactory(
+ ERC20MockJSON.abi,
+ ERC20MockJSON.bytecode,
+ minter,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+ })
+
+ it("should set correct state variables", async function () {
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "1000")
+ await this.chef.deployTransaction.wait()
+
+ const ownershipTX = await this.sushi.transferOwnership(this.chef.address)
+ await ownershipTX.wait()
+
+ const sushi = await this.chef.sushi()
+ const devaddr = await this.chef.devaddr()
+ const owner = await this.sushi.owner()
+
+ expect(sushi).to.equal(this.sushi.address)
+ expect(devaddr).to.equal(dev.address)
+ expect(owner).to.equal(this.chef.address)
+ })
+
+ it("should allow dev and only dev to update dev", async function () {
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "1000")
+ await this.chef.deployTransaction.wait()
+
+ expect(await this.chef.devaddr()).to.equal(dev.address)
+
+ let ownershipTX = await this.chef.connect(dev).dev(bob.address, { from: dev.address })
+ await ownershipTX.wait()
+ expect(await this.chef.devaddr()).to.equal(bob.address)
+
+ ownershipTX = await this.chef.connect(bob).dev(alice.address, { from: bob.address })
+ await ownershipTX.wait()
+ expect(await this.chef.devaddr()).to.equal(alice.address)
+ })
+
+ /******************************************************************/
+ /******************** evm_mint is not supported *******************/
+ /******************************************************************/
+
+ context("With ERC/LP token added to the field", function () {
+ beforeEach(async function () {
+ this.lp = await this.Factory__ERC20Mock.deploy("LPToken", "LP", "10000000000")
+
+ let tx
+ tx = await this.lp.transfer(alice.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp.transfer(bob.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp.transfer(carol.address, "1000")
+ await tx.wait()
+
+ this.lp2 = await this.Factory__ERC20Mock.deploy("LPToken2", "LP2", "10000000000")
+
+ tx = await this.lp2.transfer(alice.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp2.transfer(bob.address, "1000")
+ await tx.wait()
+
+ tx = await this.lp2.transfer(carol.address, "1000")
+ await tx.wait()
+ })
+
+ it("should allow emergency withdraw", async function () {
+ // 100 per block farming rate starting at block 100 with bonus until block 1000
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "100", "100", "1000")
+ await this.chef.deployTransaction.wait()
+
+ const addTX = await this.chef.add("100", this.lp.address, true)
+ await addTX.wait()
+
+ const approveTX = await this.lp.connect(bob).approve(this.chef.address, "1000")
+ await approveTX.wait()
+
+ const depositTX = await this.chef.connect(bob).deposit(0, "100")
+ await depositTX.wait()
+
+ expect(await this.lp.balanceOf(bob.address)).to.equal("900")
+
+ const withdrawTX = await this.chef.connect(bob).emergencyWithdraw(0)
+ await withdrawTX.wait()
+
+ expect(await this.lp.balanceOf(bob.address)).to.equal("1000")
+ })
+
+ /******************************************************************/
+ /******************** evm_mint is not supported *******************/
+ /******************************************************************/
+ // it("should give out SUSHIs only after farming time", async function () {
+ // // 100 per block farming rate starting at block 100 with bonus until block 1000
+ // this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "100", "100", "1000")
+ // await this.chef.deployTransaction.wait()
+
+ // const tx = await this.sushi.transferOwnership(this.chef.address)
+ // await tx.wait()
+
+ // const add = await this.chef.add("100", this.lp.address, true)
+ // await add.wait()
+
+ // const approve = await this.lp.connect(bob).approve(this.chef.address, "1000")
+ // await approve.wait()
+
+ // let deposit
+ // deposit = await this.chef.connect(bob).deposit(0, "100")
+ // await deposit.wait()
+ // await advanceBlockTo("89")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 90
+ // await deposit.wait()
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // await advanceBlockTo("94")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 95
+ // await deposit.wait()
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // await advanceBlockTo("99")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 100
+ // await deposit.wait()
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // await advanceBlockTo("100")
+
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 101
+ // await deposit.wait()
+ // // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("1000")
+
+ // await advanceBlockTo("104")
+ // deposit = await this.chef.connect(bob).deposit(0, "0") // block 105
+ // await deposit.wait()
+
+ // const bobBalance = await this.sushi.balanceOf(bob.address);
+ // const devBalance = await this.sushi.balanceOf(dev.address);
+ // const supply = await this.sushi.totalSupply();
+ // console.log({
+ // bobBalance: bobBalance.toString(),
+ // devBalance: devBalance.toString(),
+ // supply: supply.toString(),
+ // })
+ // // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("5000")
+ // // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("500")
+ // // expect(await this.sushi.totalSupply()).to.equal("5500")
+ // })
+
+ // it("should not distribute SUSHIs if no one deposit", async function () {
+ // // 100 per block farming rate starting at block 200 with bonus until block 1000
+ // this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "100", "200", "1000")
+ // await this.chef.deployTransaction.wait()
+
+ // const transferOwnershipTX = await this.sushi.transferOwnership(this.chef.address)
+ // await transferOwnershipTX.wait()
+
+ // const addTX = await this.chef.add("100", this.lp.address, true)
+ // await addTX.wait()
+
+ // const approveTX = await this.lp.connect(bob).approve(this.chef.address, "1000")
+ // await approveTX.wait()
+
+ // await advanceBlockTo("199")
+ // expect(await this.sushi.totalSupply()).to.equal("0")
+ // await advanceBlockTo("204")
+ // expect(await this.sushi.totalSupply()).to.equal("0")
+ // await advanceBlockTo("209")
+
+ // const depositTX = await this.chef.connect(bob).deposit(0, "10") // block 210
+ // await depositTX.wait()
+
+ // expect(await this.sushi.totalSupply()).to.equal("0")
+ // expect(await this.sushi.balanceOf(bob.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(dev.address)).to.equal("0")
+ // expect(await this.lp.balanceOf(bob.address)).to.equal("990")
+
+ // await advanceBlockTo("219")
+
+ // const withdrawTX = await this.chef.connect(bob).withdraw(0, "10") // block 220
+ // await withdrawTX.wait()
+
+ // expect(await this.sushi.totalSupply()).to.equal("11000")
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("10000")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("1000")
+ // expect(await this.lp.balanceOf(this.bob.address)).to.equal("1000")
+ // })
+
+ // it("should distribute SUSHIs properly for each staker", async function () {
+ // // 100 per block farming rate starting at block 300 with bonus until block 1000
+ // this.chef = await this.MasterChef.deploy(this.sushi.address, this.dev.address, "100", "300", "1000")
+ // await this.chef.deployed()
+ // await this.sushi.transferOwnership(this.chef.address)
+ // await this.chef.add("100", this.lp.address, true)
+ // await this.lp.connect(this.alice).approve(this.chef.address, "1000", {
+ // from: this.alice.address,
+ // })
+ // await this.lp.connect(this.bob).approve(this.chef.address, "1000", {
+ // from: this.bob.address,
+ // })
+ // await this.lp.connect(this.carol).approve(this.chef.address, "1000", {
+ // from: this.carol.address,
+ // })
+ // // Alice deposits 10 LPs at block 310
+ // await advanceBlockTo("309")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // // Bob deposits 20 LPs at block 314
+ // await advanceBlockTo("313")
+ // await this.chef.connect(this.bob).deposit(0, "20", { from: this.bob.address })
+ // // Carol deposits 30 LPs at block 318
+ // await advanceBlockTo("317")
+ // await this.chef.connect(this.carol).deposit(0, "30", { from: this.carol.address })
+ // // Alice deposits 10 more LPs at block 320. At this point:
+ // // Alice should have: 4*1000 + 4*1/3*1000 + 2*1/6*1000 = 5666
+ // // MasterChef should have the remaining: 10000 - 5666 = 4334
+ // await advanceBlockTo("319")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // expect(await this.sushi.totalSupply()).to.equal("11000")
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("5666")
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.carol.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.chef.address)).to.equal("4334")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("1000")
+ // // Bob withdraws 5 LPs at block 330. At this point:
+ // // Bob should have: 4*2/3*1000 + 2*2/6*1000 + 10*2/7*1000 = 6190
+ // await advanceBlockTo("329")
+ // await this.chef.connect(this.bob).withdraw(0, "5", { from: this.bob.address })
+ // expect(await this.sushi.totalSupply()).to.equal("22000")
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("5666")
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("6190")
+ // expect(await this.sushi.balanceOf(this.carol.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.chef.address)).to.equal("8144")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("2000")
+ // // Alice withdraws 20 LPs at block 340.
+ // // Bob withdraws 15 LPs at block 350.
+ // // Carol withdraws 30 LPs at block 360.
+ // await advanceBlockTo("339")
+ // await this.chef.connect(this.alice).withdraw(0, "20", { from: this.alice.address })
+ // await advanceBlockTo("349")
+ // await this.chef.connect(this.bob).withdraw(0, "15", { from: this.bob.address })
+ // await advanceBlockTo("359")
+ // await this.chef.connect(this.carol).withdraw(0, "30", { from: this.carol.address })
+ // expect(await this.sushi.totalSupply()).to.equal("55000")
+ // expect(await this.sushi.balanceOf(this.dev.address)).to.equal("5000")
+ // // Alice should have: 5666 + 10*2/7*1000 + 10*2/6.5*1000 = 11600
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("11600")
+ // // Bob should have: 6190 + 10*1.5/6.5 * 1000 + 10*1.5/4.5*1000 = 11831
+ // expect(await this.sushi.balanceOf(this.bob.address)).to.equal("11831")
+ // // Carol should have: 2*3/6*1000 + 10*3/7*1000 + 10*3/6.5*1000 + 10*3/4.5*1000 + 10*1000 = 26568
+ // expect(await this.sushi.balanceOf(this.carol.address)).to.equal("26568")
+ // // All of them should have 1000 LPs back.
+ // expect(await this.lp.balanceOf(this.alice.address)).to.equal("1000")
+ // expect(await this.lp.balanceOf(this.bob.address)).to.equal("1000")
+ // expect(await this.lp.balanceOf(this.carol.address)).to.equal("1000")
+ // })
+
+ // it("should give proper SUSHIs allocation to each pool", async function () {
+ // // 100 per block farming rate starting at block 400 with bonus until block 1000
+ // this.chef = await this.MasterChef.deploy(this.sushi.address, this.dev.address, "100", "400", "1000")
+ // await this.sushi.transferOwnership(this.chef.address)
+ // await this.lp.connect(this.alice).approve(this.chef.address, "1000", { from: this.alice.address })
+ // await this.lp2.connect(this.bob).approve(this.chef.address, "1000", { from: this.bob.address })
+ // // Add first LP to the pool with allocation 1
+ // await this.chef.add("10", this.lp.address, true)
+ // // Alice deposits 10 LPs at block 410
+ // await advanceBlockTo("409")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // // Add LP2 to the pool with allocation 2 at block 420
+ // await advanceBlockTo("419")
+ // await this.chef.add("20", this.lp2.address, true)
+ // // Alice should have 10*1000 pending reward
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("10000")
+ // // Bob deposits 10 LP2s at block 425
+ // await advanceBlockTo("424")
+ // await this.chef.connect(this.bob).deposit(1, "5", { from: this.bob.address })
+ // // Alice should have 10000 + 5*1/3*1000 = 11666 pending reward
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("11666")
+ // await advanceBlockTo("430")
+ // // At block 430. Bob should get 5*2/3*1000 = 3333. Alice should get ~1666 more.
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("13333")
+ // expect(await this.chef.pendingSushi(1, this.bob.address)).to.equal("3333")
+ // })
+
+ // it("should stop giving bonus SUSHIs after the bonus period ends", async function () {
+ // // 100 per block farming rate starting at block 500 with bonus until block 600
+ // this.chef = await this.MasterChef.deploy(this.sushi.address, this.dev.address, "100", "500", "600")
+ // await this.sushi.transferOwnership(this.chef.address)
+ // await this.lp.connect(this.alice).approve(this.chef.address, "1000", { from: this.alice.address })
+ // await this.chef.add("1", this.lp.address, true)
+ // // Alice deposits 10 LPs at block 590
+ // await advanceBlockTo("589")
+ // await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })
+ // // At block 605, she should have 1000*10 + 100*5 = 10500 pending.
+ // await advanceBlockTo("605")
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("10500")
+ // // At block 606, Alice withdraws all pending rewards and should get 10600.
+ // await this.chef.connect(this.alice).deposit(0, "0", { from: this.alice.address })
+ // expect(await this.chef.pendingSushi(0, this.alice.address)).to.equal("0")
+ // expect(await this.sushi.balanceOf(this.alice.address)).to.equal("10600")
+ // })
+ })
+})
diff --git a/omgx_utilities/contracts-analyzer/test/MasterChefV2.test.js b/omgx_utilities/contracts-analyzer/test/MasterChefV2.test.js
new file mode 100644
index 000000000000..a39618b29601
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/MasterChefV2.test.js
@@ -0,0 +1,262 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+const { deploy, getBigNumber, createSLP } = require('./utilities/index');
+
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const brokenRewarderJSON = require('../artifacts/contracts/mocks/RewarderBrokenMock.sol/RewarderBrokenMock.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const MasterChefV2JSON = require('../artifacts/contracts/MasterChefV2.sol/MasterChefV2.ovm.json');
+const RewarderMockJSON = require('../artifacts/contracts/mocks/RewarderMock.sol/RewarderMock.ovm.json');
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+describe("MasterChefV2", function () {
+ before(async function () {
+ await deploy(this, [
+ ["brokenRewarder", brokenRewarderJSON]
+ ])
+ })
+
+ beforeEach(async function () {
+ await deploy(this, [
+ ["sushi", SushiTokenJSON],
+ ])
+
+ await deploy(this,
+ [["lp", ERC20MockJSON, ["LP Token", "LPT", getBigNumber(10)]],
+ ["dummy", ERC20MockJSON, ["Dummy", "DummyT", getBigNumber(10)]],
+ ['chef', MasterChefJSON, [this.sushi.address, alice.address, getBigNumber(100), "0", "0"]]
+ ])
+
+ let transferTX, addTX, approveTX, depositTX, initTX
+ transferTX = await this.sushi.transferOwnership(this.chef.address)
+ await transferTX.wait()
+ addTX = await this.chef.add(100, this.lp.address, true)
+ await addTX.wait()
+ addTX = await this.chef.add(100, this.dummy.address, true)
+ await addTX.wait()
+ approveTX = await this.lp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ depositTX = await this.chef.deposit(0, getBigNumber(10))
+ await depositTX.wait()
+
+ await deploy(this, [
+ ['chef2', MasterChefV2JSON, [this.chef.address, this.sushi.address, 1]],
+ ["rlp", ERC20MockJSON, ["LP", "rLPT", getBigNumber(10)]],
+ ["r", ERC20MockJSON, ["Reward", "RewardT", getBigNumber(100000)]],
+ ])
+ await deploy(this, [["rewarder", RewarderMockJSON, [getBigNumber(1), this.r.address, this.chef2.address]]])
+ approveTX = await this.dummy.approve(this.chef2.address, getBigNumber(10))
+ await approveTX.wait()
+ initTX = await this.chef2.init(this.dummy.address)
+ await initTX.wait()
+ transferTX = await this.rlp.transfer(alice.address, getBigNumber(1))
+ await transferTX.wait()
+ })
+
+ describe("Init", function () {
+ it("Balance of dummyToken should be 0 after init(), repeated execution should fail", async function () {
+ const initTX = await this.chef2.init(this.dummy.address)
+ await expect(initTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+ describe("PoolLength", function () {
+ it("PoolLength should execute", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ expect((await this.chef2.poolLength())).to.be.equal(1);
+ })
+ })
+
+ describe("Set", function() {
+ it("Should emit event LogSetPool", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef2.set(0, 10, this.dummy.address, false))
+ .to.emit(this.chef2, "LogSetPool")
+ .withArgs(0, 10, this.rewarder.address, false)
+ await expect(this.chef2.set(0, 10, this.dummy.address, true))
+ .to.emit(this.chef2, "LogSetPool")
+ .withArgs(0, 10, this.dummy.address, true)
+ })
+
+ it("Should revert if invalid pool", async function () {
+ const setTX = await this.chef2.set(0, 10, this.rewarder.address, false)
+ await expect(setTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("PendingSushi", function() {
+// it("PendingSushi should equal ExpectedSushi", async function () {
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlock()
+// let log2 = await this.chef2.updatePool(0)
+// await advanceBlock()
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber + 1 - log.blockNumber).div(2)
+// let pendingSushi = await this.chef2.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// it("When block is lastRewardBlock", async function () {
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlockTo(3)
+// let log2 = await this.chef2.updatePool(0)
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber - log.blockNumber).div(2)
+// let pendingSushi = await this.chef2.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// })
+
+ describe("MassUpdatePools", function () {
+ it("Should call updatePool", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const massUpdatePoolsTX = await this.chef2.massUpdatePools([0])
+ await massUpdatePoolsTX.wait()
+ //expect('updatePool').to.be.calledOnContract(); //not suported by heardhat
+ //expect('updatePool').to.be.calledOnContractWith(0); //not suported by heardhat
+
+ })
+
+ it("Updating invalid pools should fail", async function () {
+ const massUpdatePoolsTX = await this.chef2.set(0, 10, this.rewarder.address, false)
+ await expect(massUpdatePoolsTX.wait()).to.be.eventually.rejected;
+ })
+})
+
+ describe("Add", function () {
+ it("Should add pool with reward token multiplier", async function () {
+ await expect(this.chef2.add(10, this.rlp.address, this.rewarder.address))
+ .to.emit(this.chef2, "LogPoolAddition")
+ .withArgs(0, 10, this.rlp.address, this.rewarder.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+ // describe("UpdatePool", function () {
+ // it("Should emit event LogUpdatePool", async function () {
+ // const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ // await addTX.wait()
+ // await advanceBlockTo(1)
+ // await expect(this.chef2.updatePool(0))
+ // .to.emit(this.chef2, "LogUpdatePool")
+ // .withArgs(0, (await this.chef2.poolInfo(0)).lastRewardBlock,
+ // (await this.rlp.balanceOf(this.chef2.address)),
+ // (await this.chef2.poolInfo(0)).accSushiPerShare)
+ // })
+
+ // it("Should take else path", async function () {
+ // const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ // await addTX.wait()
+ // await advanceBlockTo(1)
+ // const batchTX = await this.chef2.batch(
+ // [
+ // this.chef2.interface.encodeFunctionData("updatePool", [0]),
+ // this.chef2.interface.encodeFunctionData("updatePool", [0]),
+ // ],
+ // true
+ // )
+ // await batchTX.wait()
+ // })
+ // })
+
+ describe("Deposit", function () {
+ it("Depositing 0 amount", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const approveTX = await this.rlp.approve(this.chef2.address, getBigNumber(10))
+ await approveTX.wait()
+ await expect(this.chef2.deposit(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef2, "Deposit")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+
+ it("Depositing into non-existent pool should fail", async function () {
+ const depositTX = await this.chef2.deposit(1001, getBigNumber(0), alice.address)
+ await expect(depositTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+ describe("Withdraw", function () {
+ it("Withdraw 0 amount", async function () {
+ const addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef2.withdraw(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef2, "Withdraw")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+// describe("Harvest", function () {
+// it("Should give back the correct amount of SUSHI and reward", async function () {
+// await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// expect(await this.chef2.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlockTo(20)
+// await this.chef2.harvestFromMasterChef()
+// let log2 = await this.chef2.withdraw(0, getBigNumber(1), this.alice.address)
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber - log.blockNumber).div(2)
+// expect((await this.chef2.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef2.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(await this.r.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// it("Harvest with empty user balance", async function () {
+// await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+// await this.chef2.harvest(0, this.alice.address)
+// })
+
+// it("Harvest for SUSHI-only pool", async function () {
+// await this.chef2.add(10, this.rlp.address, ADDRESS_ZERO)
+// await this.rlp.approve(this.chef2.address, getBigNumber(10))
+// expect(await this.chef2.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef2.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlock()
+// await this.chef2.harvestFromMasterChef()
+// let log2 = await this.chef2.withdraw(0, getBigNumber(1), this.alice.address)
+// let expectedSushi = getBigNumber(100).mul(log2.blockNumber - log.blockNumber).div(2)
+// expect((await this.chef2.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef2.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// })
+
+ describe("EmergencyWithdraw", function() {
+ it("Should emit event EmergencyWithdraw", async function () {
+ let transferTX, addTX, approveTX, depositTX
+ transferTX = await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+ await transferTX.wait()
+ addTX = await this.chef2.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ approveTX = await this.rlp.approve(this.chef2.address, getBigNumber(10))
+ await approveTX.wait()
+ depositTX = await this.chef2.deposit(0, getBigNumber(1), alice.address)
+ await depositTX.wait()
+ //await this.chef2.emergencyWithdraw(0, this.alice.address)
+ await expect(this.chef2.connect(alice).emergencyWithdraw(0, alice.address))
+ .to.emit(this.chef2, "EmergencyWithdraw")
+ .withArgs(alice.address, 0, getBigNumber(1), alice.address)
+ })
+ })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/Migrator.test.js b/omgx_utilities/contracts-analyzer/test/Migrator.test.js
new file mode 100644
index 000000000000..525e3ec12a7e
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/Migrator.test.js
@@ -0,0 +1,162 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const MigratorJSON = require('../artifacts/contracts/Migrator.sol/Migrator.ovm.json');
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const UniswapV2FactoryJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Factory.sol/UniswapV2Factory.ovm.json');
+const UniswapV2PairJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Pair.sol/UniswapV2Pair.ovm.json');
+
+describe("Migrator", function () {
+ before(async function () {
+ this.Factory__MasterChef = new ContractFactory(
+ MasterChefJSON.abi,
+ MasterChefJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__ERC20Mock = new ContractFactory(
+ ERC20MockJSON.abi,
+ ERC20MockJSON.bytecode,
+ minter,
+ )
+
+ this.Factory__Migrator = new ContractFactory(
+ MigratorJSON.abi,
+ MigratorJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__UniswapV2Factory = new ContractFactory(
+ UniswapV2FactoryJSON.abi,
+ UniswapV2FactoryJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__UniswapV2Pair = new ContractFactory(
+ UniswapV2PairJSON.abi,
+ UniswapV2PairJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.factory1 = await this.Factory__UniswapV2Factory.deploy(bob.address)
+ await this.factory1.deployTransaction.wait()
+
+ this.factory2 = await this.Factory__UniswapV2Factory.deploy(bob.address)
+ await this.factory2.deployTransaction.wait()
+
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+
+ this.weth = await this.Factory__ERC20Mock.deploy("WETH", "WETH", "100000000")
+ await this.weth.deployTransaction.wait()
+
+ this.token = await this.Factory__ERC20Mock.deploy("TOKEN", "TOKEN", "100000000")
+ await this.token.deployTransaction.wait()
+
+ const pair1 = await this.factory1.createPair(this.weth.address, this.token.address)
+ const pair1TX = await pair1.wait()
+
+ this.lp1 = await this.Factory__UniswapV2Pair.attach(pair1TX.events[1].args.pair)
+
+ const pair2 = await this.factory2.createPair(this.weth.address, this.token.address)
+ const pair2TX = await pair2.wait()
+
+ this.lp2 = await this.Factory__UniswapV2Pair.attach(pair2TX.events[1].args.pair)
+
+ this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "100000")
+ await this.chef.deployTransaction.wait()
+
+ this.migrator = await this.Factory__Migrator.deploy(this.chef.address, this.factory1.address, this.factory2.address, "0")
+ await this.migrator.deployTransaction.wait()
+
+ const transfer = await this.sushi.transferOwnership(this.chef.address)
+ await transfer.wait()
+
+ const add = await this.chef.add("100", this.lp1.address, true)
+ await add.wait()
+ })
+
+ it("should do the migration successfully", async function () {
+ let transfer
+ transfer = await this.token.transfer(this.lp1.address, "10000000")
+ await transfer.wait()
+ transfer = await this.weth.transfer(this.lp1.address, "500000")
+ await transfer.wait()
+ const mint = await this.lp1.mint(minter.address)
+ await mint.wait()
+ expect(await this.lp1.balanceOf(minter.address)).to.equal("2235067")
+
+ // Add some fake revenue
+ transfer = await this.token.transfer(this.lp1.address, "100000")
+ await transfer.wait()
+ transfer = await this.weth.transfer(this.lp1.address, "5000")
+ await transfer.wait()
+ const sync = await this.lp1.sync()
+ await sync.wait()
+ const approve = await this.lp1.connect(minter).approve(this.chef.address, "100000000000", { from: minter.address })
+ await approve.wait()
+ const deposit = await this.chef.connect(minter).deposit("0", "2000000", { from: minter.address })
+ await deposit.wait()
+ expect(await this.lp1.balanceOf(this.chef.address), "2000000")
+ let migrate
+ migrate = await this.chef.migrate(0)
+ await expect(migrate.wait()).to.be.eventually.rejected;
+
+ let setMigrate
+ setMigrate = await this.chef.setMigrator(this.migrator.address)
+ await setMigrate.wait()
+ migrate = await this.chef.migrate(0)
+ await expect(migrate.wait()).to.be.eventually.rejected;
+
+ setMigrate = await this.factory2.setMigrator(this.migrator.address)
+ await setMigrate.wait()
+ migrate = await this.chef.migrate(0)
+ await migrate.wait()
+ expect(await this.lp1.balanceOf(this.chef.address)).to.equal("0")
+ expect(await this.lp2.balanceOf(this.chef.address)).to.equal("2000000")
+
+ const withdraw = await this.chef.connect(minter).withdraw("0", "2000000")
+ await withdraw.wait()
+ transfer = await this.lp2.connect(minter).transfer(this.lp2.address, "2000000")
+ await transfer.wait()
+ const burn = await this.lp2.burn(bob.address)
+ await burn.wait()
+ expect(await this.token.balanceOf(bob.address)).to.equal("9033718")
+ expect(await this.weth.balanceOf(bob.address)).to.equal("451685")
+ })
+
+ it("should allow first minting from public only after migrator is gone", async function () {
+ const setMigrate = await this.factory2.setMigrator(this.migrator.address)
+ await setMigrate.wait()
+
+ this.tokenx = await this.Factory__ERC20Mock.deploy("TOKENX", "TOKENX", "100000000")
+ await this.tokenx.deployTransaction.wait()
+
+ const pair = await this.factory2.createPair(this.weth.address, this.tokenx.address)
+ const pairTX = await pair.wait()
+
+ this.lpx = await this.Factory__UniswapV2Pair.attach(pairTX.events[1].args.pair)
+
+ let transfer
+ transfer = await this.weth.connect(minter).transfer(this.lpx.address, "10000000")
+ await transfer.wait()
+ transfer = await this.tokenx.connect(minter).transfer(this.lpx.address, "500000")
+ await transfer.wait()
+ const mint = await this.lpx.mint(minter.address)
+ await expect(mint.wait()).to.be.eventually.rejected;
+ })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/MiniChefV2.test.js b/omgx_utilities/contracts-analyzer/test/MiniChefV2.test.js
new file mode 100644
index 000000000000..0efdb0c60ed2
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/MiniChefV2.test.js
@@ -0,0 +1,250 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+const { deploy, getBigNumber, createSLP } = require('./utilities/index');
+
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const brokenRewarderJSON = require('../artifacts/contracts/mocks/RewarderBrokenMock.sol/RewarderBrokenMock.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const MiniChefV2JSON = require('../artifacts/contracts/MiniChefV2.sol/MiniChefV2.ovm.json');
+const RewarderMockJSON = require('../artifacts/contracts/mocks/RewarderMock.sol/RewarderMock.ovm.json');
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+describe("MiniChefV2", function () {
+ before(async function () {
+ await deploy(this, [
+ ["brokenRewarder", brokenRewarderJSON]
+ ])
+ })
+
+ beforeEach(async function () {
+ await deploy(this, [
+ ["sushi", SushiTokenJSON],
+ ])
+
+ await deploy(this,
+ [["lp", ERC20MockJSON, ["LP Token", "LPT", getBigNumber(10)]],
+ ["dummy", ERC20MockJSON, ["Dummy", "DummyT", getBigNumber(10)]],
+ ['chef', MiniChefV2JSON, [this.sushi.address]],
+ ["rlp", ERC20MockJSON, ["LP", "rLPT", getBigNumber(10)]],
+ ["r", ERC20MockJSON, ["Reward", "RewardT", getBigNumber(100000)]],
+ ])
+
+ await deploy(this, [["rewarder", RewarderMockJSON, [getBigNumber(1), this.r.address, this.chef.address]]])
+
+ const mintTX = await this.sushi.mint(this.chef.address, getBigNumber(10000))
+ await mintTX.wait()
+ const approveTX = await this.lp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ const setupTX = await this.chef.setSushiPerSecond("10000000000000000")
+ await setupTX.wait()
+ const transferTX = await this.rlp.transfer(alice.address, getBigNumber(1))
+ await transferTX.wait()
+ })
+
+ describe("PoolLength", function () {
+ it("PoolLength should execute", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ expect((await this.chef.poolLength())).to.be.equal(1);
+ })
+ })
+
+ describe("Set", function() {
+ it("Should emit event LogSetPool", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef.set(0, 10, this.dummy.address, false))
+ .to.emit(this.chef, "LogSetPool")
+ .withArgs(0, 10, this.rewarder.address, false)
+ await expect(this.chef.set(0, 10, this.dummy.address, true))
+ .to.emit(this.chef, "LogSetPool")
+ .withArgs(0, 10, this.dummy.address, true)
+ })
+
+ it("Should revert if invalid pool", async function () {
+ const setTX = await this.chef.set(0, 10, this.rewarder.address, false)
+ await expect(setTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("PendingSushi", function() {
+// it("PendingSushi should equal ExpectedSushi", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceTime(86400)
+// let log2 = await this.chef.updatePool(0)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// let pendingSushi = await this.chef.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// it("When time is lastRewardTime", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlockTo(3)
+// let log2 = await this.chef.updatePool(0)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// let pendingSushi = await this.chef.pendingSushi(0, this.alice.address)
+// expect(pendingSushi).to.be.equal(expectedSushi)
+// })
+// })
+
+// describe("MassUpdatePools", function () {
+// it("Should call updatePool", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await advanceBlockTo(1)
+// await this.chef.massUpdatePools([0])
+// //expect('updatePool').to.be.calledOnContract(); //not suported by heardhat
+// //expect('updatePool').to.be.calledOnContractWith(0); //not suported by heardhat
+
+// })
+
+// it("Updating invalid pools should fail", async function () {
+// let err;
+// try {
+// await this.chef.massUpdatePools([0, 10000, 100000])
+// } catch (e) {
+// err = e;
+// }
+
+// assert.equal(err.toString(), "Error: VM Exception while processing transaction: invalid opcode")
+// })
+// })
+
+ describe("Add", function () {
+ it("Should add pool with reward token multiplier", async function () {
+ await expect(this.chef.add(10, this.rlp.address, this.rewarder.address))
+ .to.emit(this.chef, "LogPoolAddition")
+ .withArgs(0, 10, this.rlp.address, this.rewarder.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("UpdatePool", function () {
+// it("Should emit event LogUpdatePool", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await advanceBlockTo(1)
+// await expect(this.chef.updatePool(0))
+// .to.emit(this.chef, "LogUpdatePool")
+// .withArgs(0, (await this.chef.poolInfo(0)).lastRewardTime,
+// (await this.rlp.balanceOf(this.chef.address)),
+// (await this.chef.poolInfo(0)).accSushiPerShare)
+// })
+
+// it("Should take else path", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await advanceBlockTo(1)
+// await this.chef.batch(
+// [
+// this.chef.interface.encodeFunctionData("updatePool", [0]),
+// this.chef.interface.encodeFunctionData("updatePool", [0]),
+// ],
+// true
+// )
+// })
+// })
+
+ describe("Deposit", function () {
+ it("Depositing 0 amount", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const approveTX = await this.rlp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ await expect(this.chef.deposit(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef, "Deposit")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+
+ it("Depositing into non-existent pool should fail", async function () {
+ const depositTX = await this.chef.deposit(1001, getBigNumber(0), bob.address)
+ await expect(depositTX.wait()).to.be.eventually.rejected;
+ })
+ })
+
+ describe("Withdraw", function () {
+ it("Withdraw 0 amount", async function () {
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ await expect(this.chef.withdraw(0, getBigNumber(0), bob.address))
+ .to.emit(this.chef, "Withdraw")
+ .withArgs(bob.address, 0, 0, bob.address)
+ })
+ })
+
+/******************************************************************/
+/******************** evm_mint is not supported *******************/
+/******************************************************************/
+
+// describe("Harvest", function () {
+// it("Should give back the correct amount of SUSHI and reward", async function () {
+// await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// expect(await this.chef.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceTime(86400)
+// let log2 = await this.chef.withdraw(0, getBigNumber(1), this.alice.address)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// expect((await this.chef.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(await this.r.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// it("Harvest with empty user balance", async function () {
+// await this.chef.add(10, this.rlp.address, this.rewarder.address)
+// await this.chef.harvest(0, this.alice.address)
+// })
+
+// it("Harvest for SUSHI-only pool", async function () {
+// await this.chef.add(10, this.rlp.address, ADDRESS_ZERO)
+// await this.rlp.approve(this.chef.address, getBigNumber(10))
+// expect(await this.chef.lpToken(0)).to.be.equal(this.rlp.address)
+// let log = await this.chef.deposit(0, getBigNumber(1), this.alice.address)
+// await advanceBlock()
+// let log2 = await this.chef.withdraw(0, getBigNumber(1), this.alice.address)
+// let timestamp2 = (await ethers.provider.getBlock(log2.blockNumber)).timestamp
+// let timestamp = (await ethers.provider.getBlock(log.blockNumber)).timestamp
+// let expectedSushi = BigNumber.from("10000000000000000").mul(timestamp2 - timestamp)
+// expect((await this.chef.userInfo(0, this.alice.address)).rewardDebt).to.be.equal("-"+expectedSushi)
+// await this.chef.harvest(0, this.alice.address)
+// expect(await this.sushi.balanceOf(this.alice.address)).to.be.equal(expectedSushi)
+// })
+// })
+
+ describe("EmergencyWithdraw", function() {
+ it("Should emit event EmergencyWithdraw", async function () {
+ const transferTX = await this.r.transfer(this.rewarder.address, getBigNumber(100000))
+ await transferTX.wait()
+ const addTX = await this.chef.add(10, this.rlp.address, this.rewarder.address)
+ await addTX.wait()
+ const approveTX = await this.rlp.approve(this.chef.address, getBigNumber(10))
+ await approveTX.wait()
+ const depositTX = await this.chef.deposit(0, getBigNumber(1), alice.address)
+ await depositTX.wait()
+ //await this.chef.emergencyWithdraw(0, this.alice.address)
+ await expect(this.chef.connect(alice).emergencyWithdraw(0, alice.address))
+ .to.emit(this.chef, "EmergencyWithdraw")
+ .withArgs(alice.address, 0, getBigNumber(1), alice.address)
+ })
+ })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/SushiBar.test.js b/omgx_utilities/contracts-analyzer/test/SushiBar.test.js
new file mode 100644
index 000000000000..60792f4ca25a
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/SushiBar.test.js
@@ -0,0 +1,97 @@
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { ContractFactory } = require('ethers');
+const { bob, alice, carol } = require('./utilities/wallet');
+
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const SushiBarJSON = require('../artifacts/contracts/SushiBar.sol/SushiBar.ovm.json');
+
+describe("SushiBar", function () {
+ before(async function () {
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiBar = new ContractFactory(
+ SushiBarJSON.abi,
+ SushiBarJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+ this.bar = await this.Factory__SushiBar.deploy(this.sushi.address)
+ await this.bar.deployTransaction.wait()
+ let mint
+ mint = await this.sushi.mint(alice.address, "100")
+ await mint.wait()
+ mint = await this.sushi.mint(bob.address, "100")
+ await mint.wait()
+ mint = await this.sushi.mint(carol.address, "100")
+ await mint.wait()
+ })
+
+ it("should not allow enter if not enough approve", async function () {
+ let barTransfer, approve
+ barTransfer = await this.bar.enter("100")
+ await expect(barTransfer.wait()).to.be.eventually.rejected;
+
+ approve = await this.sushi.approve(this.bar.address, "50")
+ await approve.wait()
+ barTransfer = await this.bar.enter("100")
+ await expect(barTransfer.wait()).to.be.eventually.rejected;
+
+ approve = await this.sushi.approve(this.bar.address, "100")
+ await approve.wait()
+ barTransfer = await this.bar.enter("100")
+ await barTransfer.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("100")
+ })
+
+ it("should not allow withraw more than what you have", async function () {
+ const approve = await this.sushi.approve(this.bar.address, "100")
+ await approve.wait()
+ const barTransfer = await this.bar.enter("100")
+ await barTransfer.wait()
+ const barWithdraw = await this.bar.leave("200")
+ await expect(barWithdraw.wait()).to.be.eventually.rejected;
+ })
+
+ it("should work with more than one participant", async function () {
+ let approve, barTransfer, barDeposit, barWithdraw
+ approve = await this.sushi.approve(this.bar.address, "100")
+ await approve.wait()
+ approve = await this.sushi.connect(alice).approve(this.bar.address, "100")
+ await approve.wait()
+ // Bob enters and gets 20 shares. Alice enters and gets 10 shares.
+ barTransfer = await this.bar.enter("20")
+ await barTransfer.wait()
+ barTransfer = await this.bar.connect(alice).enter("10")
+ await barTransfer.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("20")
+ expect(await this.bar.balanceOf(alice.address)).to.equal("10")
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("30")
+ // SushiBar get 20 more SUSHIs from an external source.
+ barTransfer = await this.sushi.connect(carol).transfer(this.bar.address, "20")
+ await barTransfer.wait()
+ // Alice deposits 10 more SUSHIs. She should receive 10*30/50 = 6 shares.
+ barDeposit = await this.bar.enter("10")
+ await barDeposit.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("26")
+ expect(await this.bar.balanceOf(alice.address)).to.equal("10")
+ // Bob withdraws 5 shares. He should receive 5*60/36 = 8 shares
+ barWithdraw = await this.bar.connect(alice).leave("5")
+ await barWithdraw.wait()
+ expect(await this.bar.balanceOf(bob.address)).to.equal("26")
+ expect(await this.bar.balanceOf(alice.address)).to.equal("5")
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("52")
+ expect(await this.sushi.balanceOf(bob.address)).to.equal("70")
+ expect(await this.sushi.balanceOf(alice.address)).to.equal("98")
+ })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/SushiMaker.test.js b/omgx_utilities/contracts-analyzer/test/SushiMaker.test.js
new file mode 100644
index 000000000000..d5761b873cc5
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/SushiMaker.test.js
@@ -0,0 +1,221 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+const { deploy, getBigNumber, createSLP } = require('./utilities/index');
+
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const UniswapV2FactoryJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Factory.sol/UniswapV2Factory.ovm.json');
+const UniswapV2PairJSON = require('../artifacts/contracts/uniswapv2/UniswapV2Pair.sol/UniswapV2Pair.ovm.json');
+const SushiMakerExploitMockJSON = require('../artifacts/contracts/mocks/SushiMakerExploitMock.sol/SushiMakerExploitMock.ovm.json')
+const SushiMakerJSON = require('../artifacts/contracts/SushiMaker.sol/SushiMaker.ovm.json');
+const SushiBarJSON = require('../artifacts/contracts/SushiBar.sol/SushiBar.ovm.json');
+
+describe("SushiMaker", function () {
+ before(async function () {
+ this.Factory__UniswapV2Pair = new ContractFactory(
+ UniswapV2PairJSON.abi,
+ UniswapV2PairJSON.bytecode,
+ bob,
+ )
+ })
+ beforeEach(async function () {
+ await deploy(this, [
+ ["sushi", ERC20MockJSON, ["SUSHI", "SUSHI", getBigNumber("10000000")]],
+ ["dai", ERC20MockJSON, ["DAI", "DAI", getBigNumber("10000000")]],
+ ["mic", ERC20MockJSON, ["MIC", "MIC", getBigNumber("10000000")]],
+ ["usdc", ERC20MockJSON, ["USDC", "USDC", getBigNumber("10000000")]],
+ ["weth", ERC20MockJSON, ["WETH", "ETH", getBigNumber("10000000")]],
+ ["strudel", ERC20MockJSON, ["$TRDL", "$TRDL", getBigNumber("10000000")]],
+ ["factory", UniswapV2FactoryJSON, [bob.address]],
+ ])
+ await deploy(this, [["bar", SushiBarJSON, [this.sushi.address]]])
+ await deploy(this, [["sushiMaker", SushiMakerJSON, [this.factory.address, this.bar.address, this.sushi.address, this.weth.address]]])
+ await deploy(this, [["exploiter", SushiMakerExploitMockJSON, [this.sushiMaker.address]]])
+ await createSLP(this, "sushiEth", this.sushi, this.weth, getBigNumber(10))
+ await createSLP(this, "strudelEth", this.strudel, this.weth, getBigNumber(10))
+ await createSLP(this, "daiEth", this.dai, this.weth, getBigNumber(10))
+ await createSLP(this, "usdcEth", this.usdc, this.weth, getBigNumber(10))
+ await createSLP(this, "micUSDC", this.mic, this.usdc, getBigNumber(10))
+ await createSLP(this, "sushiUSDC", this.sushi, this.usdc, getBigNumber(10))
+ await createSLP(this, "daiUSDC", this.dai, this.usdc, getBigNumber(10))
+ await createSLP(this, "daiMIC", this.dai, this.mic, getBigNumber(10))
+ })
+ describe("setBridge", function () {
+ it("does not allow to set bridge for Sushi", async function () {
+ const setBridgeTX = await this.sushiMaker.setBridge(this.sushi.address, this.weth.address)
+ await expect(setBridgeTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("does not allow to set bridge for WETH", async function () {
+ const setBridgeTX = await this.sushiMaker.setBridge(this.weth.address, this.sushi.address)
+ await expect(setBridgeTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("does not allow to set bridge to itself", async function () {
+ const setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.dai.address)
+ await expect(setBridgeTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("emits correct event on bridge", async function () {
+ await expect(this.sushiMaker.setBridge(this.dai.address, this.sushi.address))
+ .to.emit(this.sushiMaker, "LogBridgeSet")
+ .withArgs(this.dai.address, this.sushi.address)
+ })
+ })
+ describe("convert", function () {
+ it("should convert SUSHI - ETH", async function () {
+ let transferTX, convertTX
+ transferTX = await this.sushiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.sushi.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushiEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1897569270781234370")
+ })
+
+ it("should convert USDC - ETH", async function () {
+ let transferTX, convertTX
+ transferTX = await this.usdcEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.usdc.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.usdcEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("should convert $TRDL - ETH", async function () {
+ let transferTX, convertTX
+ transferTX = await this.strudelEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.strudel.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.strudelEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("should convert USDC - SUSHI", async function () {
+ let transferTX, convertTX
+ transferTX = await this.sushiUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.usdc.address, this.sushi.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushiUSDC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1897569270781234370")
+ })
+
+ it("should convert using standard ETH path", async function () {
+ let transferTX, convertTX
+ transferTX = await this.daiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.weth.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("converts MIC/USDC using more complex path", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.micUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.usdc.address, this.sushi.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.mic.address, this.usdc.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.mic.address, this.usdc.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.micUSDC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("converts DAI/USDC using more complex path", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.daiUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.usdc.address, this.sushi.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.usdc.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.usdc.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiUSDC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1590898251382934275")
+ })
+
+ it("converts DAI/MIC using two step path", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.daiMIC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.usdc.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.mic.address, this.dai.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.mic.address)
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiMIC.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("1200963016721363748")
+ })
+
+ it("reverts if it loops back", async function () {
+ let transferTX, setBridgeTX, convertTX
+ transferTX = await this.daiMIC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.dai.address, this.mic.address)
+ await setBridgeTX.wait()
+ setBridgeTX = await this.sushiMaker.setBridge(this.mic.address, this.dai.address)
+ await setBridgeTX.wait()
+ convertTX = await this.sushiMaker.convert(this.dai.address, this.mic.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("reverts if caller is not EOA", async function () {
+ let transferTX, convertTX
+ transferTX = await this.sushiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.exploiter.convert(this.sushi.address, this.weth.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("reverts if pair does not exist", async function () {
+ let convertTX
+ convertTX = await this.sushiMaker.convert(this.mic.address, this.micUSDC.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ })
+
+ it("reverts if no path is available", async function () {
+ let transferTX, convertTX
+ transferTX = await this.micUSDC.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convert(this.mic.address, this.usdc.address)
+ await expect(convertTX.wait()).to.be.eventually.rejected;
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.micUSDC.balanceOf(this.sushiMaker.address)).to.equal(getBigNumber(1))
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal(0)
+ })
+ })
+
+ describe("convertMultiple", function () {
+ it("should allow to convert multiple", async function () {
+ let transferTX, convertTX
+ transferTX = await this.daiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ transferTX = await this.sushiEth.transfer(this.sushiMaker.address, getBigNumber(1))
+ await transferTX.wait()
+ convertTX = await this.sushiMaker.convertMultiple([this.dai.address, this.sushi.address], [this.weth.address, this.weth.address])
+ await convertTX.wait()
+ expect(await this.sushi.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.daiEth.balanceOf(this.sushiMaker.address)).to.equal(0)
+ expect(await this.sushi.balanceOf(this.bar.address)).to.equal("3186583558687783097")
+ })
+ })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/SushiRoll.test.js b/omgx_utilities/contracts-analyzer/test/SushiRoll.test.js
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/omgx_utilities/contracts-analyzer/test/SushiToken.test.js b/omgx_utilities/contracts-analyzer/test/SushiToken.test.js
new file mode 100644
index 000000000000..ae0093626d7c
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/SushiToken.test.js
@@ -0,0 +1,85 @@
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { bob, alice, carol } = require('./utilities/wallet');
+
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+
+describe("SushiToken", function () {
+ before(async function () {
+ this.Factory__SushiTokenPool = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiTokenPool.deploy()
+ await this.sushi.deployTransaction.wait()
+ })
+
+ it("should have correct name and symbol and decimal", async function () {
+ const name = await this.sushi.name()
+ const symbol = await this.sushi.symbol()
+ const decimals = await this.sushi.decimals()
+ expect(name, "SushiToken")
+ expect(symbol, "SUSHI")
+ expect(decimals, "18")
+ })
+
+ it("should only allow owner to mint token", async function () {
+ const bobMint = await this.sushi.mint(bob.address, "1000")
+ await bobMint.wait()
+ const aliceMint = await this.sushi.mint(alice.address, "100")
+ await aliceMint.wait()
+
+ // not the owner
+ const carolMint = await this.sushi.connect(alice).mint(carol.address, "1000")
+ await expect(carolMint.wait()).to.be.eventually.rejected;
+
+ const totalSupply = await this.sushi.totalSupply()
+ const aliceBal = await this.sushi.balanceOf(alice.address)
+ const bobBal = await this.sushi.balanceOf(bob.address)
+ const carolBal = await this.sushi.balanceOf(carol.address)
+ expect(totalSupply).to.equal("1100")
+ expect(aliceBal).to.equal("100")
+ expect(bobBal).to.equal("1000")
+ expect(carolBal).to.equal("0")
+ })
+
+ it("should supply token transfers properly", async function () {
+ const aliceMint = await this.sushi.mint(alice.address, "100")
+ await aliceMint.wait()
+ const bobMint = await this.sushi.mint(bob.address, "1000")
+ await bobMint.wait()
+ const carolTX = await this.sushi.transfer(carol.address, "10")
+ await carolTX.wait()
+ const bobTX = await this.sushi.connect(bob).transfer(carol.address, "100", {
+ from: bob.address,
+ })
+ await bobTX.wait()
+
+ const totalSupply = await this.sushi.totalSupply()
+ const aliceBal = await this.sushi.balanceOf(alice.address)
+ const bobBal = await this.sushi.balanceOf(bob.address)
+ const carolBal = await this.sushi.balanceOf(carol.address)
+ expect(totalSupply, "1100")
+ expect(aliceBal, "90")
+ expect(bobBal, "900")
+ expect(carolBal, "110")
+ })
+
+ it("should fail if you try to do bad transfers", async function () {
+ const aliceMint = await this.sushi.mint(alice.address, "100")
+ await aliceMint.wait()
+ //ERC20: transfer amount exceeds balance
+ const carolTX = await this.sushi.transfer(carol.address, "110");
+ await expect(carolTX.wait()).to.be.eventually.rejected;
+ //ERC20: transfer amount exceeds balance
+ const bobTX = await this.sushi.connect(bob).transfer(carol.address, "1", { from: bob.address });
+ await expect(bobTX.wait()).to.be.eventually.rejected;
+ })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/Timelock.test.js b/omgx_utilities/contracts-analyzer/test/Timelock.test.js
new file mode 100644
index 000000000000..e8df4504388e
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/Timelock.test.js
@@ -0,0 +1,161 @@
+const { expect } = require("chai");
+const chai = require('chai');
+const chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { encodeParameters } = require('./utilities/index');
+const { latest, duration, increase } = require('./utilities/time');
+const { bob, alice, carol, dev, minter } = require('./utilities/wallet');
+
+const MasterChefJSON = require('../artifacts/contracts/MasterChef.sol/MasterChef.ovm.json');
+const SushiTokenJSON = require('../artifacts/contracts/SushiToken.sol/SushiToken.ovm.json');
+const ERC20MockJSON = require('../artifacts/contracts/mocks/ERC20Mock.sol/ERC20Mock.ovm.json');
+const TimelockJSON = require('../artifacts/contracts/governance/Timelock.sol/Timelock.ovm.json');
+
+/******************************************************************/
+/************* evm_increaseTime is not supported ****************/
+/**** this could be something Optimism adds in the near future! ***/
+/******************************************************************/
+
+describe("Timelock", function () {
+ before(async function () {
+ this.Factory__MasterChef = new ContractFactory(
+ MasterChefJSON.abi,
+ MasterChefJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__SushiToken = new ContractFactory(
+ SushiTokenJSON.abi,
+ SushiTokenJSON.bytecode,
+ bob,
+ )
+
+ this.Factory__ERC20Mock = new ContractFactory(
+ ERC20MockJSON.abi,
+ ERC20MockJSON.bytecode,
+ minter,
+ )
+
+ this.Factory__Timelock = new ContractFactory(
+ TimelockJSON.abi,
+ TimelockJSON.bytecode,
+ bob,
+ )
+ })
+
+ beforeEach(async function () {
+ this.sushi = await this.Factory__SushiToken.deploy()
+ await this.sushi.deployTransaction.wait()
+ this.timelock = await this.Factory__Timelock.deploy(bob.address, "259200")
+ await this.timelock.deployTransaction.wait()
+ })
+
+ it("should not allow non-owner to do operation", async function () {
+ let transferOwnership
+ transferOwnership = await this.sushi.transferOwnership(this.timelock.address);
+ await transferOwnership.wait()
+
+ transferOwnership = await this.sushi.transferOwnership(carol.address);
+ await expect(transferOwnership.wait()).to.be.eventually.rejected;
+
+ transferOwnership = await this.sushi.connect(alice).transferOwnership(carol.address);
+ await expect(transferOwnership.wait()).to.be.eventually.rejected;
+
+ const timelock = await this.timelock.connect(alice).queueTransaction(
+ this.sushi.address,
+ "0",
+ "transferOwnership(address)",
+ encodeParameters(["address"], [carol.address]),
+ (await latest()).add(duration.days(4))
+ )
+ await expect(timelock.wait()).to.be.eventually.rejected;
+ })
+
+ /******************************************************************/
+ /************* evm_increaseTime is not supported ****************/
+ /**** this could be something Optimism adds in the near future! ***/
+ /******************************************************************/
+
+ // it("should do the timelock thing", async function () {
+ // let transferOwnership, queueTransaction
+ // transferOwnership = await this.sushi.connect(bob).transferOwnership(this.timelock.address);
+ // await transferOwnership.wait()
+
+ // const eta = (await latest()).add(duration.days(4))
+ // queueTransaction = await this.timelock
+ // .connect(bob)
+ // .queueTransaction(this.sushi.address, "0", "transferOwnership(address)", encodeParameters(["address"], [carol.address]), eta)
+ // await queueTransaction.wait()
+
+ // await increase(duration.days(1))
+
+ // queueTransaction = await this.timelock
+ // .connect(bob)
+ // .executeTransaction(this.sushi.address, "0", "transferOwnership(address)", encodeParameters(["address"], [carol.address]), eta)
+ // await expect(queueTransaction.wait()).to.be.eventually.rejected;
+
+ // await increase(duration.days(4))
+ // await this.timelock
+ // .connect(alice)
+ // .executeTransaction(this.sushi.address, "0", "transferOwnership(address)", encodeParameters(["address"], [carol.address]), eta)
+ // expect(await this.sushi.owner()).to.equal(carol.address)
+ // })
+
+ // it("should also work with MasterChef", async function () {
+ // let transferOwner
+ // this.lp1 = await this.Factory__ERC20Mock.deploy("LPToken", "LP", "10000000000")
+ // await this.lp1.deployTransaction.wait()
+ // this.lp2 = await this.Factory__ERC20Mock.deploy("LPToken", "LP", "10000000000")
+ // await this.lp2.deployTransaction.wait()
+ // this.chef = await this.Factory__MasterChef.deploy(this.sushi.address, dev.address, "1000", "0", "1000")
+ // await this.chef.deployTransaction.wait()
+ // transferOwner = await this.sushi.transferOwnership(this.chef.address)
+ // await transferOwner.wait()
+ // const deposit = await this.chef.add("100", this.lp1.address, true)
+ // await deposit.wait()
+ // transferOwner = await this.chef.transferOwnership(this.timelock.address)
+ // await transferOwner.wait()
+ // const eta = (await latest()).add(duration.days(4))
+ // await this.timelock
+ // .connect(this.bob)
+ // .queueTransaction(
+ // this.chef.address,
+ // "0",
+ // "set(uint256,uint256,bool)",
+ // encodeParameters(["uint256", "uint256", "bool"], ["0", "200", false]),
+ // eta
+ // )
+ // await this.timelock
+ // .connect(this.bob)
+ // .queueTransaction(
+ // this.chef.address,
+ // "0",
+ // "add(uint256,address,bool)",
+ // encodeParameters(["uint256", "address", "bool"], ["100", this.lp2.address, false]),
+ // eta
+ // )
+ // await increase(duration.days(4))
+ // await this.timelock
+ // .connect(this.bob)
+ // .executeTransaction(
+ // this.chef.address,
+ // "0",
+ // "set(uint256,uint256,bool)",
+ // encodeParameters(["uint256", "uint256", "bool"], ["0", "200", false]),
+ // eta
+ // )
+ // await this.timelock
+ // .connect(this.bob)
+ // .executeTransaction(
+ // this.chef.address,
+ // "0",
+ // "add(uint256,address,bool)",
+ // encodeParameters(["uint256", "address", "bool"], ["100", this.lp2.address, false]),
+ // eta
+ // )
+ // expect((await this.chef.poolInfo("0")).allocPoint).to.equal("200")
+ // expect(await this.chef.totalAllocPoint()).to.equal("300")
+ // expect(await this.chef.poolLength()).to.equal("2")
+ // })
+})
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/utilities/index.js b/omgx_utilities/contracts-analyzer/test/utilities/index.js
new file mode 100644
index 000000000000..c04cf4df4ea2
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/utilities/index.js
@@ -0,0 +1,57 @@
+const { Contract, Wallet, ContractFactory, BigNumber, providers } = require('ethers');
+const { bob } = require('./wallet');
+
+const BASE_TEN = 10
+const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"
+
+function encodeParameters(types, values) {
+ const abi = new ethers.utils.AbiCoder()
+ return abi.encode(types, values)
+}
+
+async function deploy(thisObject, contracts) {
+ for (let i in contracts) {
+ let contract = contracts[i]
+ // console.log(`Deploying ${contract[0]}...`)
+ let Factory__contract = new ContractFactory(
+ contract[1].abi,
+ contract[1].bytecode,
+ bob,
+ )
+ thisObject[contract[0]] = await Factory__contract.deploy(...(contract[2] || []))
+ await thisObject[contract[0]].deployTransaction.wait()
+ }
+}
+
+async function createSLP(thisObject, name, tokenA, tokenB, amount) {
+ let transfer, mint
+ // console.log(`Creating SLP ${name}...`)
+ const createPairTx = await thisObject.factory.createPair(tokenA.address, tokenB.address)
+ const pairTX = await createPairTx.wait()
+
+ const _pair = pairTX.events[1].args.pair
+
+ thisObject[name] = await thisObject.Factory__UniswapV2Pair.attach(_pair)
+
+ transfer = await tokenA.transfer(thisObject[name].address, amount)
+ await transfer.wait()
+ transfer = await tokenB.transfer(thisObject[name].address, amount)
+ await transfer.wait()
+
+ mint = await thisObject[name].mint(bob.address)
+ await mint.wait()
+}
+
+// Defaults to e18 using amount * 10^18
+function getBigNumber(amount, decimals = 18) {
+ return BigNumber.from(amount).mul(BigNumber.from(BASE_TEN).pow(decimals))
+}
+
+module.exports = {
+ getBigNumber,
+ createSLP,
+ deploy,
+ encodeParameters,
+ BASE_TEN,
+ ADDRESS_ZERO,
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/utilities/time.js b/omgx_utilities/contracts-analyzer/test/utilities/time.js
new file mode 100644
index 000000000000..8bfcad74cfb0
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/utilities/time.js
@@ -0,0 +1,68 @@
+const { ethers } = require("hardhat")
+const { BigNumber, providers } = require('ethers');
+const { Provider } = require('./wallet');
+
+async function advanceBlock() {
+ const mine = await Provider.send("evm_mine", [])
+ await mine.wait()
+}
+
+async function advanceBlockTo(blockNumber) {
+ const block = await Provider.getBlockNumber()
+ console.log({ block })
+ for (let i = await Provider.getBlockNumber(); i < blockNumber; i++) {
+ await advanceBlock()
+ }
+}
+
+async function increase(value) {
+ const increaseTime = await Provider.send("evm_increaseTime", [value.toNumber()])
+ console.log(increaseTime)
+ await increaseTime.wait()
+ await advanceBlock()
+}
+
+async function latest() {
+ const block = await Provider.getBlock("latest")
+ return BigNumber.from(block.timestamp)
+}
+
+async function advanceTimeAndBlock(time) {
+ await advanceTime(time)
+ await advanceBlock()
+}
+
+async function advanceTime(time) {
+ await Provider.send("evm_increaseTime", [time])
+}
+
+const duration = {
+ seconds: function (val) {
+ return BigNumber.from(val)
+ },
+ minutes: function (val) {
+ return BigNumber.from(val).mul(this.seconds("60"))
+ },
+ hours: function (val) {
+ return BigNumber.from(val).mul(this.minutes("60"))
+ },
+ days: function (val) {
+ return BigNumber.from(val).mul(this.hours("24"))
+ },
+ weeks: function (val) {
+ return BigNumber.from(val).mul(this.days("7"))
+ },
+ years: function (val) {
+ return BigNumber.from(val).mul(this.days("365"))
+ },
+}
+
+module.exports = {
+ advanceBlock,
+ advanceBlockTo,
+ increase,
+ latest,
+ advanceTimeAndBlock,
+ advanceTime,
+ duration,
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/test/utilities/wallet.js b/omgx_utilities/contracts-analyzer/test/utilities/wallet.js
new file mode 100644
index 000000000000..967529c55e81
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/test/utilities/wallet.js
@@ -0,0 +1,24 @@
+const {
+ Contract,
+ Wallet,
+ ContractFactory,
+ BigNumber,
+ providers
+} = require('ethers');
+require('dotenv').config();
+
+const Provider = new providers.JsonRpcProvider(process.env.L2_NODE_WEB3_URL || "http://localhost:8545");
+const bob = new Wallet(process.env.TEST_PRIVATE_KEY_1, Provider);
+const alice = new Wallet(process.env.TEST_PRIVATE_KEY_2, Provider);
+const carol = new Wallet(process.env.TEST_PRIVATE_KEY_3, Provider);
+const dev = new Wallet(process.env.TEST_PRIVATE_KEY_4, Provider);
+const minter = new Wallet(process.env.TEST_PRIVATE_KEY_5, Provider);
+
+module.exports = {
+ bob,
+ alice,
+ carol,
+ dev,
+ minter,
+ Provider,
+}
\ No newline at end of file
diff --git a/omgx_utilities/contracts-analyzer/tsconfig.json b/omgx_utilities/contracts-analyzer/tsconfig.json
new file mode 100644
index 000000000000..5c82c7386fa4
--- /dev/null
+++ b/omgx_utilities/contracts-analyzer/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./dist",
+ "resolveJsonModule": true
+ },
+ "include": ["./test"],
+ "files": ["./hardhat.config.ts"]
+}
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/.env.example b/omgx_utilities/fraud-prover/.env.example
new file mode 100644
index 000000000000..92dea0ef99c1
--- /dev/null
+++ b/omgx_utilities/fraud-prover/.env.example
@@ -0,0 +1,21 @@
+# Local
+NODE_ENV=local
+L1_NODE_WEB3_URL=http://localhost:9545
+L2_NODE_WEB3_URL=http://localhost:8545
+VERIFIER_WEB3_URL=http://localhost:8045
+ADDRESS_MANAGER_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3
+ETH1_ADDRESS_RESOLVER_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3
+L1_WALLET_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
+TEST_PRIVATE_KEY_1=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
+TEST_PRIVATE_KEY_2=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
+FRAUD_PRIVATE_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
+L1_BLOCK_OFFSET=0
+L1_START_OFFSET=0
+L2_BLOCK_OFFSET=1
+NO_TIMEOUT=true
+POLLING_INTERVAL=5000
+RUN_GAS_LIMIT=8999999
+RELAY_GAS_LIMIT=8999999
+TARGET_GAS_LIMIT=9000000000
+RETRIES=60
+CHAIN_ID=28
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/.prettierrc.js b/omgx_utilities/fraud-prover/.prettierrc.js
new file mode 100644
index 000000000000..6b3fa8e2ce23
--- /dev/null
+++ b/omgx_utilities/fraud-prover/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ ...require('../../.prettierrc.js'),
+};
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/Dockerfile.fraud-prover b/omgx_utilities/fraud-prover/Dockerfile.fraud-prover
new file mode 100644
index 000000000000..c2c09298d087
--- /dev/null
+++ b/omgx_utilities/fraud-prover/Dockerfile.fraud-prover
@@ -0,0 +1,23 @@
+FROM node:14-buster as base
+
+RUN apt-get update && apt-get install -y bash curl jq
+
+FROM base as build
+
+RUN apt-get update && apt-get install -y bash git python build-essential
+
+ADD . /opt/fraud-prover
+RUN cd /opt/fraud-prover yarn install yarn build
+
+FROM base
+
+RUN apt-get update && apt-get install -y bash curl jq
+
+COPY --from=build /opt/fraud-prover /opt/fraud-prover
+
+COPY wait-for-l1-and-l2.sh /opt/
+RUN chmod +x /opt/wait-for-l1-and-l2.sh
+RUN chmod +x /opt/fraud-prover/exec/run.js
+RUN ln -s /opt/fraud-prover/exec/run.js /usr/local/bin/
+
+ENTRYPOINT ["/opt/wait-for-l1-and-l2.sh", "run.js"]
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/README.md b/omgx_utilities/fraud-prover/README.md
new file mode 100644
index 000000000000..b4764c73d985
--- /dev/null
+++ b/omgx_utilities/fraud-prover/README.md
@@ -0,0 +1,354 @@
+# Fraud Prover
+
+Contains an executable fraud prover. This repo allows you to:
+
+1. Generate a fraud prover Docker
+2. Run that docker and the associated L2 in Verifier mode, pointed at a local OMGX.
+3. Inject fraudulant state roots to debug the currently non-operational fraud-prover.
+
+## 1. FIRST TERMINAL WINDOW: Building & Running a local system with Verifier and Fraud Prover
+
+Make sure dependencies are installed and everything is built - just run `yarn` and `yarn build` in the top directory (/optimsm). Then spin up the entire system with the L2, the Verifier, and the Fraud Prover:
+
+```bash
+
+./up_local.sh #to spin up and verify a local OMGX
+
+```
+
+At this point you will have the *L1*, *L2*, the *Verifier*, the *data_transport_layer*, the *batch_submitter*, *the *message_relayer*, the *deployer*, and the *fraud_prover* all running and talking to one another. So far so good.
+
+## 2. SECOND TERMINAL WINDOW: Injecting Fraudulant State Roots
+
+The `docker-compose-local.env.yaml` sets:
+
+```bash
+
+#this is the address that will trigger the batch_submitter to inject fake state roots
+x-var: &FRAUD_SUBMISSION_ADDRESS
+ FRAUD_SUBMISSION_ADDRESS=0xb0dd88dfcc929a78fec13daa1bd77843e267c729
+
+```
+
+Any transactions fron this wallet will cause the `batch_submitter` to submit a bad state root (`0xbad1bad1......`) instead of the correct state root. Normnally, the batch submitter only does this once, but we patched the batch submitter to allow many fraudulant transaction to be submitted. **Open a second terminal** and then:
+
+```bash
+
+yarn build:fraud
+yarn deploy
+
+```
+
+You will see a few contracts get deployed, and you will see *Mr. Fraud* transferring some funds to Alice. Running `yarn deploy` **does** trigger the batch submitter to inject a bad state root, but then, the system reverts, proably due to indexing and other issues. Note that hardhat needs a `.env` for the deploy - see the `example.env` for working settings.
+
+```bash
+#expected terminal output
+
+ System setup
+L1ERC20 deployed to: 0x196A1b2750D9d39ECcC7667455DdF1b8d5D65696
+L2DepositedERC20 deployed to: 0x3e4CFaa8730092552d9425575E49bB542e329981
+L1ERC20Gateway deployed to: 0x60ba97F7cE0CD19Df71bAd0C3BE9400541f6548E
+L2 ERC20 initialized: 0x2b4793dfe3a8241d776cacd604904c30601f7a895debc59ff66bef1b187d3899
+ Bob Depositing L1 ERC20 to L2...
+ On L1, Bob has: BigNumber { _hex: '0x204fce5e3e25026110000000', _isBigNumber: true }
+ On L2, Bob has: BigNumber { _hex: '0x00', _isBigNumber: true }
+ On L1, Bob now has: BigNumber { _hex: '0x204fce561c79f51cfb680000', _isBigNumber: true }
+ On L2, Bob now has: BigNumber { _hex: '0x0821ab0d4414980000', _isBigNumber: true }
+ ✓ Bob Approve and Deposit ERC20 from L1 to L2 (5233ms)
+ ✓ should transfer ERC20 token to Alice and Fraud (4166ms)
+ On L2, Alice has: 10000000000000000000
+ On L2, Fraud has: 10000000000000000000
+ On L2, Alice now has: 7000000000000000000
+ On L2, Fraud now has: 13000000000000000000
+ ✓ should transfer ERC20 token from Alice to Fraud (4119ms)
+ On L2, Bob has: 130000000000000000000
+ On L2, Fraud has: 13000000000000000000
+ On L2, Bob now has: 131000000000000000000
+ On L2, Fraud now has: 12000000000000000000
+ ✓ should transfer ERC20 token from Fraud to Bob and commit fraud (4123ms)
+
+```
+
+## 3. THIRD TERMINAL WINDOW: Running a local Fraud Prover for rapid debugging purposes
+
+First, *terminate the dockerized fraud-prover service* and then `yarn build` and `yarn start` a fraud-prover from your command line - this makes it much easier and faster to debug, since you get better debug and console.log output, and its easier to make code changes and see what happens. This fraud-prover will also use whatever you set in the .env (which should match of couse with what all the dockerized services are getting from the `docker-compose-local.env.yaml`)
+
+```bash
+
+yarn build
+yarn start
+
+```
+
+## CURRENTLY BROKEN AT One of three places - Lib_MerkleTree.sol, OVM_FraudVerifier.sol, or "makeStateTrie for this proof"
+
+If you do all of the above, while using the standard contracts, you will get stuck at *EITHER*:
+
+```bash
+# this is in Lib_MerkleTree.sol
+
+require(
+ _siblings.length == _ceilLog2(_totalLeaves),
+ "Lib_MerkleTree: Total siblings does not correctly correspond to total leaves."
+);
+
+```
+
+*OR* you will get through that but then revert at `VM Exception while processing transaction: revert Pre-state root global index must equal to the transaction root global index`:
+
+```bash
+# this is in OVM_FraudVerifier.sol
+
+line 134
+
+require (
+ _preStateRootBatchHeader.prevTotalElements + _preStateRootProof.index + 1 == _transactionBatchHeader.prevTotalElements + _transactionProof.index,
+ "Pre-state root global index must equal to the transaction root global index."
+);
+
+```
+
+*OR* you will get stuck at `_makeStateTrie for this proof`. There are also assorted and sundy other ways for this to fail, mostly relating to out of bounds access to various arrays, most notably, in the transactions.
+
+## 4. Generating the Fraud Prover Docker
+
+To build the Docker:
+
+```bash
+
+docker build . --file Dockerfile.fraud-prover --tag omgx/fraud-prover:latest
+docker push omgx/fraud-prover:latest
+
+```
+
+## NOT UPDATED 5. Configuration
+
+All configuration is done via environment variables. See below for more information.
+
+## NOT UPDATED 6. Testing & linting
+
+- See lint errors with `yarn lint`; auto-fix with `yarn lint --fix`
+
+## NOT UPDATED 7. Envs (Need to reconcile with the below - ToDo)
+
+| Environment Variable | Required? | Default Value | Description |
+| ----------- | --------- | ------------- | ----------- |
+| `L1_WALLET_KEY` | Yes | N/A | Private key for an account on Layer 1 (Ethereum) to be used to submit fraud proof transactions. |
+| `L2_NODE_WEB3_URL` | No | http://localhost:9545 | HTTP endpoint for a Layer 2 (Optimism) Verifier node. |
+| `L1_NODE_WEB3_URL` | No | http://localhost:8545 | HTTP endpoint for a Layer 1 (Ethereum) node. |
+| `RELAY_GAS_LIMIT` | No | 9,000,000 | Maximum amount of gas to provide to fraud proof transactions (except for the "transaction execution" step). |
+| `RUN_GAS_LIMIT` | No | 9,000,000 | Maximum amount of gas to provide to the "transaction execution" step. |
+| `POLLING_INTERVAL` | No | 5,000 | Time (in milliseconds) to wait while polling for new transactions. |
+| `L2_BLOCK_OFFSET` | No | 1 | Offset between the `CanonicalTransactionChain` contract on Layer 1 and the blocks on Layer 2. Currently defaults to 1, but will likely be removed as soon as possible. |
+| `L1_BLOCK_FINALITY` | No | 0 | Number of Layer 1 blocks to wait before considering a given event. |
+| `L1_START_OFFSET` | No | 0 | Layer 1 block number to start scanning for transactions from. |
+| `FROM_L2_TRANSACTION_INDEX` | No | 0 | Layer 2 block number to start scanning for transactions from. |
+
+## NOT UPDATED 8. Local testing
+
+The fraud prover will first connect to the relevant chains and then look for mismatched state roots. Note that the *Fraud Prover* does not connect to the *Sequencer*, rather, it connects to the *Verifier*, and the Verifier in turn is looking at the L1. Assuming _your sequencer is not fraudulant_, the standard Fraud Prover output looks like this:
+
+```
+
+{"level":30,"time":1619122304289,"msg":"Looking for mismatched state roots..."}
+{"level":30,"time":1619122304295,"nextAttemptInS":5,"msg":"Did not find any mismatched state roots"}
+{"level":30,"time":1619122309301,"msg":"Looking for mismatched state roots..."}
+{"level":30,"time":1619122309306,"nextAttemptInS":5,"msg":"Did not find any mismatched state roots"}
+{"level":30,"time":1619122314311,"msg":"Looking for mismatched state roots..."}
+
+```
+
+When you spin up your local test system some small changes to the generic `local.env.yaml` and `local.yaml` may be needed. Also, you will have to provide two extra files, `wait-for-l1-and-l2.sh`. For your testing conveniance, there is also a `Dockerfile.fraud_prover`.
+
+### local.yaml Settings
+
+Add to your `local.yaml`
+```bash
+#all the usual things here (L2, Batch submitter, Message Relay, Hardhat, Deployer), but then...
+
+ verifier:
+ image: omgx/go-ethereum
+ volumes:
+ - verifier:/root/.ethereum:rw
+ ports:
+ - 8045:8045
+ - 8046:8046
+
+ fraud_prover:
+ image: omgx/fraud-prover:latest
+
+volumes:
+
+ geth:
+
+ verifier:
+```
+
+### local.env.yaml Settings
+
+Add to your `local.env.yaml`
+
+```bash
+
+x-var: &L1_NODE_WEB3_URL
+ L1_NODE_WEB3_URL=http://l1_chain:9545
+
+x-var: &DEPLOYER_HTTP
+ DEPLOYER_HTTP=http://deployer:8080
+
+x-var: &ADDRESS_MANAGER_ADDRESS
+ ADDRESS_MANAGER_ADDRESS=0xYOUR_ADDRESS_MANAGER_HERE
+
+services:
+
+#all the usual things here (L2, Batch submitter, Message Relay, Hardhat, Deployer), but then...
+
+ verifier:
+ environment:
+ - *DEPLOYER_HTTP
+ - *L1_NODE_WEB3_URL
+ - ROLLUP_VERIFIER_ENABLE=true
+ - ETH1_SYNC_SERVICE_ENABLE=true
+ - ETH1_CTC_DEPLOYMENT_HEIGHT=8
+ - ETH1_CONFIRMATION_DEPTH=0
+ - ROLLUP_CLIENT_HTTP=http://data_transport_layer:7878
+ - ROLLUP_POLL_INTERVAL_FLAG=3s
+ - USING_OVM=true
+ - CHAIN_ID=420
+ - NETWORK_ID=420
+ - DEV=true
+ - DATADIR=/root/.ethereum
+ - RPC_ENABLE=true
+ - RPC_ADDR=verifier
+ - RPC_CORS_DOMAIN=*
+ - RPC_VHOSTS=*
+ - RPC_PORT=8045
+ - WS=true
+ - WS_ADDR=0.0.0.0
+ - IPC_DISABLE=true
+ - TARGET_GAS_LIMIT=9000000
+ - RPC_API=eth,net,rollup,web3
+ - WS_API=eth,net,rollup,web3
+ - WS_ORIGINS=*
+ - GASPRICE=0
+ - NO_USB=true
+ - GCMODE=archive
+ - NO_DISCOVER=true
+ - ROLLUP_STATE_DUMP_PATH=http://deployer:8080/state-dump.latest.json
+ - RETRIES=60
+
+ fraud_prover:
+ environment:
+ - NO_TIMEOUT=true
+ - *L1_NODE_WEB3_URL
+ - *ADDRESS_MANAGER_ADDRESS
+ - L2_NODE_WEB3_URL=http://verifier:8045
+ - L1_WALLET_KEY=0xYOUR_FP_WALLET_KEY_HERE
+ - POLLING_INTERVAL=5000
+ - RUN_GAS_LIMIT=8999999
+ - RELAY_GAS_LIMIT=8999999
+ - FROM_L2_TRANSACTION_INDEX=0
+ - L2_BLOCK_OFFSET=1
+ - L1_START_OFFSET=8
+ - RETRIES=60
+
+```
+
+### Fraud Prover spinup wait-for-l1-and-l2.sh
+
+```bash
+
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+cmd="$@"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+RETRIES=${RETRIES:-50}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L1_NODE_WEB3_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $L1_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $L1_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $L1_NODE_WEB3_URL"
+
+RETRIES=${RETRIES:-50}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $L2_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $L2_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Verifier Node at $L2_NODE_WEB3_URL"
+
+if [ ! -z "$DEPLOYER_HTTP" ]; then
+ RETRIES=${RETRIES:-50}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$DEPLOYER_HTTP/addresses.json"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $DEPLOYER_HTTP to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+ ADDRESS_MANAGER_ADDRESS=$(curl --silent $DEPLOYER_HTTP/addresses.json | jq -r .AddressManager)
+ exec env \
+ ADDRESS_MANAGER_ADDRESS=$ADDRESS_MANAGER_ADDRESS \
+ L1_BLOCK_OFFSET=$L1_BLOCK_OFFSET \
+ $cmd
+else
+ exec $cmd
+fi
+
+```
+
+### Fraud Prover Dockerfile.fraud_prover
+
+```
+
+FROM node:14-buster as base
+
+RUN apt-get update && apt-get install -y bash curl jq
+
+FROM base as build
+
+RUN apt-get update && apt-get install -y bash git python build-essential
+
+ADD . /opt/fraud-prover
+
+RUN cd /opt/fraud-prover yarn install yarn build
+
+FROM base
+
+RUN apt-get update && apt-get install -y bash curl jq
+
+COPY --from=build /opt/fraud-prover /opt/fraud-prover
+
+COPY wait-for-l1-and-l2.sh /opt/
+RUN chmod +x /opt/wait-for-l1-and-l2.sh
+RUN chmod +x /opt/fraud-prover/exec/run.js
+RUN ln -s /opt/fraud-prover/exec/run.js /usr/local/bin/
+
+ENTRYPOINT ["/opt/wait-for-l1-and-l2.sh", "run.js"]
+
+```
diff --git a/omgx_utilities/fraud-prover/contracts/ERC20.sol b/omgx_utilities/fraud-prover/contracts/ERC20.sol
new file mode 100644
index 000000000000..07f3b9c88155
--- /dev/null
+++ b/omgx_utilities/fraud-prover/contracts/ERC20.sol
@@ -0,0 +1,254 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.8.0;
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+/**
+ * @title ERC20
+ * @dev A super simple ERC20 implementation!
+ */
+contract ERC20 is IERC20 {
+ /*************
+ * Variables *
+ *************/
+ uint256 constant private MAX_UINT256 = 2**256 - 1;
+ mapping (address => uint256) public balances;
+ mapping (address => mapping (address => uint256)) public allowances;
+
+ // Some optional extra goodies
+ string public name;
+ uint8 public decimals;
+ string public symbol; //An identifier: eg SBX
+ uint256 public override totalSupply;
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _initialSupply Initial maximum token supply.
+ * @param _name A name for our ERC20 (technically optional, but it's fun ok jeez).
+ */
+ constructor(
+ uint256 _initialSupply,
+ string memory _name,
+ uint8 _decimalUnits,
+ string memory _tokenSymbol
+ ) {
+ balances[msg.sender] = _initialSupply;
+ totalSupply = _initialSupply;
+ name = _name;
+ decimals = _decimalUnits;
+ symbol = _tokenSymbol;
+ }
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Mints new coins to the sender.
+ * @param _amount Amount to mint.
+ * @return true if the mint was successful.
+ */
+ function mint(
+ uint256 _amount
+ )
+ public
+ returns (
+ bool
+ )
+ {
+ //TODO SafeMath here
+ balances[msg.sender] += _amount;
+ totalSupply += _amount;
+ return true;
+ }
+
+ /**
+ * Checks the balance of an address.
+ * @param _owner Address to check a balance for.
+ * @return Balance of the address.
+ */
+ function balanceOf(
+ address _owner
+ )
+ external
+ override
+ view
+ returns (
+ uint256
+ )
+ {
+ return balances[_owner];
+ }
+
+ /**
+ * Transfers a balance from your account to someone else's account!
+ * @param _to Address to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transfer(
+ address _to,
+ uint256 _amount
+ )
+ external
+ override
+ returns (
+ bool
+ )
+ {
+ require(
+ balances[msg.sender] >= _amount,
+ "Cannot Transfer: Insufficent Balance"
+ );
+
+ balances[msg.sender] -= _amount;
+ balances[_to] += _amount;
+
+ emit Transfer(
+ msg.sender,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Transfers a balance from someone else's account to another account. You need an allowance
+ * from the sending account for this to work!
+ * @param _from Account to transfer a balance from.
+ * @param _to Account to transfer a balance to.
+ * @param _amount Amount to transfer to the other account.
+ * @return true if the transfer was successful.
+ */
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _amount
+ )
+ external
+ override
+ returns (
+ bool
+ )
+ {
+
+ uint256 allowAmount = allowances[_from][msg.sender];
+
+ require(
+ balances[_from] >= _amount,
+ "Cannot TransferFrom: Balance too small."
+ );
+
+ require(
+ allowAmount >= _amount,
+ "Cannot TransferFrom: Allowance too small."
+ );
+
+ balances[_to] += _amount;
+ balances[_from] -= _amount;
+
+ if (allowAmount < MAX_UINT256) {
+ allowances[_from][msg.sender] -= _amount;
+ }
+
+ emit Transfer(
+ _from,
+ _to,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Approves an account to spend some amount from your account.
+ * @param _spender Account to approve a balance for.
+ * @param _amount Amount to allow the account to spend from your account.
+ * @return true if the allowance was successful.
+ */
+ function approve(
+ address _spender,
+ uint256 _amount
+ )
+ external
+ override
+ returns (
+ bool
+ )
+ {
+ allowances[msg.sender][_spender] = _amount;
+
+ emit Approval(
+ msg.sender,
+ _spender,
+ _amount
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks how much a given account is allowed to spend from another given account.
+ * @param _owner Address of the account to check an allowance from.
+ * @param _spender Address of the account trying to spend from the owner.
+ * @return Allowance for the spender from the owner.
+ */
+ function allowance(
+ address _owner,
+ address _spender
+ )
+ external
+ override
+ view
+ returns (
+ uint256
+ )
+ {
+ return allowances[_owner][_spender];
+ }
+
+ /**
+ * Mints new coins to an account.
+ * @param _owner Address of the account to mint to.
+ * @param _amount Amount to mint.
+ * @return true if the mint was successful.
+ */
+ function _mint(
+ address _owner,
+ uint256 _amount
+ )
+ internal
+ returns (
+ bool
+ )
+ {
+ //TODO SafeMath here
+ balances[_owner] += _amount;
+ totalSupply += _amount;
+ return true;
+ }
+
+ /**
+ * Burns coins from an account.
+ * @param _owner Address of the account to mint to.
+ * @param _amount Amount to mint.
+ * @return true if the mint was successful.
+ */
+ function _burn(
+ address _owner,
+ uint256 _amount
+ )
+ internal
+ returns (
+ bool
+ )
+ {
+ require(balances[_owner] >= _amount, "Account doesn't have enough coins to burn");
+ balances[_owner] -= _amount;
+ totalSupply -= _amount; //TODO SafeMath here
+ return true;
+ }
+}
diff --git a/omgx_utilities/fraud-prover/contracts/L1ERC20Gateway.sol b/omgx_utilities/fraud-prover/contracts/L1ERC20Gateway.sol
new file mode 100644
index 000000000000..d3e373b181f1
--- /dev/null
+++ b/omgx_utilities/fraud-prover/contracts/L1ERC20Gateway.sol
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: MIT
+// @unsupported: ovm
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Interface Imports */
+import { OVM_L1ERC20Gateway } from '@eth-optimism/contracts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L1ERC20Gateway.sol';
+import { iOVM_ERC20 } from '@eth-optimism/contracts/contracts/optimistic-ethereum/iOVM/predeploys/iOVM_ERC20.sol';
+
+/**
+ * @title OVM_L1ERC20Gateway
+ * @dev The L1 ERC20 Gateway is a contract which stores deposited L1 funds that are in use on L2.
+ * It synchronizes a corresponding L2 ERC20 Gateway, informing it of deposits, and listening to it
+ * for newly finalized withdrawals.
+ *
+ * This contract extends OVM_L1ERC20Gateway, which is where we
+ * takes care of most of the initialization and the cross-chain logic.
+ * If you are looking to implement your own deposit/withdrawal contracts, you
+ * may also want to extend this contract in a similar manner.
+ *
+ * Compiler used: solc
+ * Runtime target: EVM
+ */
+contract L1ERC20Gateway is OVM_L1ERC20Gateway {
+
+
+ constructor(
+ iOVM_ERC20 _l1ERC20,
+ address _l2DepositedERC20,
+ address _l1messenger
+ )
+ OVM_L1ERC20Gateway(
+ _l1ERC20,
+ _l2DepositedERC20,
+ _l1messenger
+ )
+ {
+ }
+
+}
diff --git a/omgx_utilities/fraud-prover/contracts/L2DepositedERC20.sol b/omgx_utilities/fraud-prover/contracts/L2DepositedERC20.sol
new file mode 100644
index 000000000000..1eb529e36df7
--- /dev/null
+++ b/omgx_utilities/fraud-prover/contracts/L2DepositedERC20.sol
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/* Library Imports */
+import { OVM_L2DepositedERC20 } from '@eth-optimism/contracts/contracts/optimistic-ethereum/OVM/bridge/tokens/OVM_L2DepositedERC20.sol';
+
+/**
+ * @title L2DepositedERC20
+ * @dev The L2 Deposited ERC20 is an ERC20 implementation which represents L1 assets deposited into L2.
+ * This contract mints new tokens when it hears about deposits into the L1 ERC20 gateway.
+ * This contract also burns the tokens intended for withdrawal, informing the L1 gateway to release L1 funds.
+ *
+ * Compiler used: optimistic-solc
+ * Runtime target: OVM
+ */
+contract L2DepositedERC20 is OVM_L2DepositedERC20 {
+
+ constructor(
+ address _l2CrossDomainMessenger,
+ string memory _name,
+ string memory _symbol
+ )
+ OVM_L2DepositedERC20(_l2CrossDomainMessenger, _name, _symbol)
+ {}
+
+}
diff --git a/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol b/omgx_utilities/fraud-prover/contracts/interfaces/iOVM_L1ETHGateway.sol
similarity index 87%
rename from packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol
rename to omgx_utilities/fraud-prover/contracts/interfaces/iOVM_L1ETHGateway.sol
index 32a9918d9cca..69e5f06638a9 100644
--- a/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L1ETHGateway.sol
+++ b/omgx_utilities/fraud-prover/contracts/interfaces/iOVM_L1ETHGateway.sol
@@ -22,6 +22,7 @@ interface iOVM_L1ETHGateway {
uint256 _amount
);
+
/********************
* Public Functions *
********************/
@@ -45,11 +46,4 @@ interface iOVM_L1ETHGateway {
uint _amount
)
external;
-
- function getFinalizeDepositL2Gas()
- external
- view
- returns(
- uint32
- );
}
diff --git a/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol b/omgx_utilities/fraud-prover/contracts/interfaces/iOVM_L2DepositedERC20.sol
similarity index 92%
rename from packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol
rename to omgx_utilities/fraud-prover/contracts/interfaces/iOVM_L2DepositedERC20.sol
index 40088bfc2d48..a5177083f84e 100644
--- a/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/tokens/iOVM_L2DepositedToken.sol
+++ b/omgx_utilities/fraud-prover/contracts/interfaces/iOVM_L2DepositedERC20.sol
@@ -3,9 +3,9 @@ pragma solidity >0.5.0;
pragma experimental ABIEncoderV2;
/**
- * @title iOVM_L2DepositedToken
+ * @title iOVM_L2DepositedERC20
*/
-interface iOVM_L2DepositedToken {
+interface iOVM_L2DepositedERC20 {
/**********
* Events *
diff --git a/omgx_utilities/fraud-prover/docker-compose-local.env.yml b/omgx_utilities/fraud-prover/docker-compose-local.env.yml
new file mode 100644
index 000000000000..5046b3b6f55a
--- /dev/null
+++ b/omgx_utilities/fraud-prover/docker-compose-local.env.yml
@@ -0,0 +1,201 @@
+version: "3.4"
+
+x-var: &SEQUENCER_PRIVATE_KEY
+ SEQUENCER_PRIVATE_KEY=0xd2ab07f7c10ac88d5f86f1b4c1035d5195e81f27dbe62ad65e59cbf88205629b
+
+x-var: &DEPLOYER_PRIVATE_KEY
+ DEPLOYER_PRIVATE_KEY=0x754fde3f5e60ef2c7649061e06957c29017fe21032a8017132c0078e37f6193a
+
+x-var: &RELAY_L1_WALLET_PRIV_KEY
+ L1_WALLET_KEY=0xea8b000efb33c49d819e8d6452f681eed55cdf7de47d655887fc0e318906f2e7
+
+#anything will do, as long as it has ETH in it, I think
+x-var: &FRAUD_PROVER_WALLET_PRIV_KEY
+ L1_WALLET_KEY=0x5b1c2653250e5c580dcb4e51c2944455e144c57ebd6a0645bd359d2e69ca0f0c
+
+#this is the address that will trigger the batch_submitter to inject fake state roots
+x-var: &FRAUD_SUBMISSION_ADDRESS
+ FRAUD_SUBMISSION_ADDRESS=0xb0dd88dfcc929a78fec13daa1bd77843e267c729
+
+x-var: &L1_NODE_WEB3_URL
+ L1_NODE_WEB3_URL=http://l1_chain:9545
+
+x-var: &L2_NODE_WEB3_URL
+ L2_NODE_WEB3_URL=http://geth_l2:8545
+
+x-var: &VERIFIER_URL
+ L2_NODE_WEB3_URL=http://verifier:8045
+
+x-var: &ROLLUP_CLIENT_HTTP
+ ROLLUP_CLIENT_HTTP=http://data_transport_layer:7878
+
+x-var: &ROLLUP_STATE_DUMP_PATH
+ ROLLUP_STATE_DUMP_PATH=http://deployer:8080/state-dump.latest.json
+
+x-var: &DEPLOYER_HTTP
+ DEPLOYER_HTTP=http://deployer:8080
+
+x-var: &DEPLOYER_URL
+ DEPLOYER_URL=http://deployer:8080
+
+x-var: &DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT
+ DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT=http://l1_chain:9545
+
+x-var: &DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT
+ DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT=http://geth_l2:8545
+
+x-var: &ADDRESS_MANAGER_ADDRESS
+ ADDRESS_MANAGER_ADDRESS=0x3e4CFaa8730092552d9425575E49bB542e329981
+
+services:
+
+ data_transport_layer:
+ environment:
+ - *L1_NODE_WEB3_URL
+ - *DEPLOYER_HTTP
+ - *DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT
+ - *DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT
+ - DATA_TRANSPORT_LAYER__SYNC_FROM_L1=true
+ - DATA_TRANSPORT_LAYER__SYNC_FROM_L2=false
+ - DATA_TRANSPORT_LAYER__L2_CHAIN_ID=28
+ - DATA_TRANSPORT_LAYER__DB_PATH=/db
+ - DATA_TRANSPORT_LAYER__SERVER_PORT=7878
+ - DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL=1000
+ - DATA_TRANSPORT_LAYER__CONFIRMATIONS=0
+ - DATA_TRANSPORT_LAYER__POLLING_INTERVAL=500
+ - DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL=2000
+ - DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS=true
+ - DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=0.0.0.0
+ - DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=
+ - RETRIES=100
+
+ geth_l2:
+ environment:
+ - *DEPLOYER_HTTP
+ - *L1_NODE_WEB3_URL
+ - *ROLLUP_STATE_DUMP_PATH
+ - *ROLLUP_CLIENT_HTTP
+ - ETH1_SYNC_SERVICE_ENABLE=true
+ - ETH1_CTC_DEPLOYMENT_HEIGHT=8
+ - ETH1_CONFIRMATION_DEPTH=0
+ - ROLLUP_POLL_INTERVAL_FLAG=3s
+ - USING_OVM=true
+ - CHAIN_ID=28
+ - NETWORK_ID=28
+ - DEV=true
+ - DATADIR=/root/.ethereum
+ - RPC_ENABLE=true
+ - RPC_ADDR=geth_l2
+ - RPC_CORS_DOMAIN=*
+ - RPC_VHOSTS=*
+ - RPC_PORT=8545
+ - WS=true
+ - WS_ADDR=0.0.0.0
+ - IPC_DISABLE=true
+ - TARGET_GAS_LIMIT=9000000
+ - RPC_API=eth,net,rollup,web3
+ - WS_API=eth,net,rollup,web3
+ - WS_ORIGINS=*
+ - GASPRICE=0
+ - NO_USB=true
+ - GCMODE=archive
+ - NO_DISCOVER=true
+ - RETRIES=100
+
+ batch_submitter:
+ environment:
+ - *SEQUENCER_PRIVATE_KEY
+ - *L1_NODE_WEB3_URL
+ - *L2_NODE_WEB3_URL
+ - *DEPLOYER_HTTP
+ - *ADDRESS_MANAGER_ADDRESS
+ - *FRAUD_SUBMISSION_ADDRESS
+ - DEBUG=info*,error*,warn*,debug*
+ - MAX_L1_TX_SIZE=90000
+ - MIN_L1_TX_SIZE=0
+ - MAX_TX_BATCH_COUNT=50
+ - MAX_STATE_BATCH_COUNT=50
+ - POLL_INTERVAL=15000
+ - NUM_CONFIRMATIONS=0
+ - RESUBMISSION_TIMEOUT=15
+ - FINALITY_CONFIRMATIONS=0
+ - RUN_TX_BATCH_SUBMITTER=true
+ - RUN_STATE_BATCH_SUBMITTER=true
+ - MAX_BATCH_SUBMISSION_TIME=0
+ - SAFE_MINIMUM_ETHER_BALANCE=0
+ - CLEAR_PENDING_TXS=false
+ - RETRIES=100
+
+ l1_chain:
+ environment:
+ - ETH1_HTTP_PORT=9545
+ - MNEMONIC=abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
+
+ deployer:
+ environment:
+ - *L1_NODE_WEB3_URL
+ - *DEPLOYER_PRIVATE_KEY
+ - *SEQUENCER_PRIVATE_KEY
+ - HARDHAT=true
+ - FRAUD_PROOF_WINDOW_SECONDS=0
+
+ message_relayer:
+ environment:
+ - *L1_NODE_WEB3_URL
+ - *L2_NODE_WEB3_URL
+ - *DEPLOYER_HTTP
+ - *RELAY_L1_WALLET_PRIV_KEY
+ - *ADDRESS_MANAGER_ADDRESS
+ - RETRIES=100
+
+ verifier:
+ environment:
+ - ROLLUP_VERIFIER_ENABLE=true
+ - *DEPLOYER_HTTP
+ - *L1_NODE_WEB3_URL
+ - *ROLLUP_CLIENT_HTTP
+ - *ROLLUP_STATE_DUMP_PATH
+ - ETH1_SYNC_SERVICE_ENABLE=true
+ - ETH1_CTC_DEPLOYMENT_HEIGHT=8
+ - ETH1_CONFIRMATION_DEPTH=0
+ - ROLLUP_POLL_INTERVAL_FLAG=3s
+ - USING_OVM=true
+ - CHAIN_ID=28
+ - NETWORK_ID=28
+ - DEV=true
+ - DATADIR=/root/.ethereum
+ - RPC_ENABLE=true
+ - RPC_ADDR=verifier
+ - RPC_CORS_DOMAIN=*
+ - RPC_VHOSTS=*
+ - RPC_PORT=8045
+ - WS=true
+ - WS_ADDR=0.0.0.0
+ - IPC_DISABLE=true
+ - TARGET_GAS_LIMIT=9000000
+ - RPC_API=eth,net,rollup,web3
+ - WS_API=eth,net,rollup,web3
+ - WS_ORIGINS=*
+ - GASPRICE=0
+ - NO_USB=true
+ - GCMODE=archive
+ - NO_DISCOVER=true
+ - RETRIES=60
+
+
+ fraud_prover:
+ environment:
+ - *L1_NODE_WEB3_URL
+ - *FRAUD_PROVER_WALLET_PRIV_KEY
+ - *ADDRESS_MANAGER_ADDRESS
+# - *VERIFIER_URL
+ - L2_NODE_WEB3_URL=http://verifier:8045
+ - NO_TIMEOUT=true
+ - POLLING_INTERVAL=5000
+ - RUN_GAS_LIMIT=8999999
+ - RELAY_GAS_LIMIT=8999999
+# - FROM_L2_TRANSACTION_INDEX=0
+ - L1_BLOCK_OFFSET=0
+ - L2_BLOCK_OFFSET=1
+ - L1_START_OFFSET=8
+ - RETRIES=60
diff --git a/omgx_utilities/fraud-prover/docker-compose.yml b/omgx_utilities/fraud-prover/docker-compose.yml
new file mode 100644
index 000000000000..79f67d6329ea
--- /dev/null
+++ b/omgx_utilities/fraud-prover/docker-compose.yml
@@ -0,0 +1,49 @@
+version: "3"
+
+services:
+
+ l1_chain:
+ image: omgx/hardhat:latest
+ ports:
+ - 9545:9545
+
+ geth_l2:
+ image: omgx/go-ethereum:latest
+ volumes:
+ - geth:/l2-node/l2:rw
+ ports:
+ - 8545:8545
+ - 8546:8546
+
+ batch_submitter:
+ image: omgx/batch-submitter:latest
+
+ data_transport_layer:
+ image: omgx/data-transport-layer:latest
+ ports:
+ - 7878:7878
+
+ deployer:
+ image: omgx/deployer:latest
+ ports:
+ - 8080:8080
+
+ message_relayer:
+ image: omgx/message-relayer:latest
+
+ verifier:
+ image: omgx/go-ethereum:latest
+ volumes:
+ - verifier:/root/.ethereum:rw
+ ports:
+ - 8045:8045
+ - 8046:8046
+
+ fraud_prover:
+ image: omgx/fraud-prover:latest
+
+volumes:
+
+ geth:
+
+ verifier:
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/exec/run-fraud-prover.js b/omgx_utilities/fraud-prover/exec/run-fraud-prover.js
new file mode 100644
index 000000000000..734b4a1499b1
--- /dev/null
+++ b/omgx_utilities/fraud-prover/exec/run-fraud-prover.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+
+const main = require("../dist/exec/run").default
+
+;(async () => {
+ await main()
+})().catch((err) => {
+ console.log(err)
+ process.exit(1)
+})
diff --git a/omgx_utilities/fraud-prover/hardhat.config.ts b/omgx_utilities/fraud-prover/hardhat.config.ts
new file mode 100644
index 000000000000..d304e0d00717
--- /dev/null
+++ b/omgx_utilities/fraud-prover/hardhat.config.ts
@@ -0,0 +1,27 @@
+import { HardhatUserConfig } from 'hardhat/types'
+
+// Hardhat plugins
+import '@nomiclabs/hardhat-ethers'
+import '@eth-optimism/hardhat-ovm'
+
+const config: HardhatUserConfig = {
+ mocha: {
+ timeout: 300000,
+ },
+ networks: {
+ omgx: {
+ url: 'http://localhost:8545', //never is actually used - set by the .env
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true,
+ },
+ },
+ solidity: '0.7.6',
+ ovm: {
+ solcVersion: '0.7.6',
+ },
+}
+
+export default config
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/package.json b/omgx_utilities/fraud-prover/package.json
new file mode 100644
index 000000000000..b80b26039e48
--- /dev/null
+++ b/omgx_utilities/fraud-prover/package.json
@@ -0,0 +1,57 @@
+{
+ "name": "@omgx/fraud-prover",
+ "version": "0.0.1",
+ "private": true,
+ "description": "Fraud Prover Service",
+ "main": "dist/index",
+ "types": "dist/index",
+ "files": [
+ "dist/index"
+ ],
+ "scripts": {
+ "start": "node ./exec/run-fraud-prover.js",
+ "build": "tsc -p ./tsconfig.build.json",
+ "clean": "rimraf dist/ ./tsconfig.build.tsbuildinfo",
+ "lint": "yarn lint:fix && yarn lint:check",
+ "lint:fix": "prettier --config .prettierrc.json --write \"{src,exec,test}/**/*.ts\"",
+ "lint:check": "tslint --format stylish --project .",
+ "build:contracts": "hardhat compile",
+ "build:contracts:ovm": "hardhat compile --network omgx",
+ "build:fraud": "yarn build:contracts && yarn build:contracts:ovm",
+ "deploy": "yarn build:contracts && yarn build:contracts:ovm && hardhat --network omgx test"
+ },
+ "keywords": [
+ "optimism",
+ "ethereum",
+ "fraud-prover"
+ ],
+ "homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/fraud-prover#readme",
+ "license": "MIT",
+ "author": "Optimism",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ethereum-optimism/optimism.git"
+ },
+ "dependencies": {
+ "@eth-optimism/common-ts": "^0.1.2",
+ "@eth-optimism/contracts": "^0.3.4",
+ "@eth-optimism/core-utils": "^0.4.4",
+ "@eth-optimism/hardhat-ovm": "^0.2.2",
+ "bcfg": "^0.1.6",
+ "dotenv": "^8.2.0",
+ "merkletreejs": "^0.2.18",
+ "rlp": "^2.2.6",
+ "hardhat": "^2.2.1"
+ },
+ "devDependencies": {
+ "prettier": "^2.2.1",
+ "tslint": "^6.1.3",
+ "tslint-config-prettier": "^1.18.0",
+ "tslint-no-focused-test": "^0.5.0",
+ "tslint-plugin-prettier": "^2.3.0",
+ "merkle-patricia-tree": "^4.0.0",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "ethereumjs-util": "^7.0.5",
+ "chai": "^4.2.0"
+ }
+}
diff --git a/omgx_utilities/fraud-prover/src/exec/run.ts b/omgx_utilities/fraud-prover/src/exec/run.ts
new file mode 100644
index 000000000000..4b4b5c6cd7c7
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/exec/run.ts
@@ -0,0 +1,105 @@
+import { Wallet, providers } from 'ethers'
+import { FraudProverService } from '../service'
+import { Bcfg } from '@eth-optimism/core-utils'
+import * as dotenv from 'dotenv'
+import Config from 'bcfg'
+
+dotenv.config()
+
+const main = async () => {
+ const config: Bcfg = new Config('fraud-prover')
+ config.load({
+ env: true,
+ argv: true,
+ })
+
+ const env = process.env
+ const L1_NODE_WEB3_URL = config.str('l1-node-web3-url', env.L1_NODE_WEB3_URL)
+ const L2_NODE_WEB3_URL = config.str(
+ 'verifier-web3-url',
+ env.VERIFIER_WEB3_URL
+ )
+
+ const ADDRESS_MANAGER_ADDRESS = config.str(
+ 'address-manager-address',
+ env.ADDRESS_MANAGER_ADDRESS
+ )
+ const L1_WALLET_KEY = config.str('l1-wallet-key', env.L1_WALLET_KEY)
+ const MNEMONIC = config.str('mnemonic', env.MNEMONIC)
+ const HD_PATH = config.str('hd-path', env.HD_PATH)
+ const RELAY_GAS_LIMIT = config.uint(
+ 'relay-gas-limit',
+ parseInt(env.RELAY_GAS_LIMIT, 10) || 4000000
+ )
+ const POLLING_INTERVAL = config.uint(
+ 'polling-interval',
+ parseInt(env.POLLING_INTERVAL, 10) || 5000
+ )
+ const GET_LOGS_INTERVAL = config.uint(
+ 'get-logs-interval',
+ parseInt(env.GET_LOGS_INTERVAL, 10) || 2000
+ )
+ const L2_BLOCK_OFFSET = config.uint(
+ 'l2-start-offset',
+ parseInt(env.L2_BLOCK_OFFSET, 10) || 1
+ )
+ const L1_START_OFFSET = config.uint(
+ 'l1-start-offset',
+ parseInt(env.L1_BLOCK_OFFSET, 10) || 1
+ )
+ const FROM_L2_TRANSACTION_INDEX = config.uint(
+ 'from-l2-transaction-index',
+ parseInt(env.FROM_L2_TRANSACTION_INDEX, 10) || 0
+ )
+ const RUN_GAS_LIMIT = config.uint(
+ 'run-gas-limit',
+ parseInt(env.RUN_GAS_LIMIT, 10) || 95000000
+ )
+ const L1_BLOCK_FINALITY = config.uint(
+ 'l1-block-finality',
+ parseInt(env.L1_BLOCK_FINALITY, 10) || 0
+ )
+
+ if (!ADDRESS_MANAGER_ADDRESS) {
+ throw new Error('Must pass ADDRESS_MANAGER_ADDRESS')
+ }
+ if (!L1_NODE_WEB3_URL) {
+ throw new Error('Must pass L1_NODE_WEB3_URL')
+ }
+ if (!L2_NODE_WEB3_URL) {
+ throw new Error('Must pass L2_NODE_WEB3_URL')
+ }
+
+ console.log('The L2 block offset is:', L2_BLOCK_OFFSET)
+
+ const l2Provider = new providers.JsonRpcProvider(L2_NODE_WEB3_URL)
+ const l1Provider = new providers.JsonRpcProvider(L1_NODE_WEB3_URL)
+
+ let wallet: Wallet
+ if (L1_WALLET_KEY) {
+ wallet = new Wallet(L1_WALLET_KEY, l1Provider)
+ } else if (MNEMONIC) {
+ wallet = Wallet.fromMnemonic(MNEMONIC, HD_PATH)
+ wallet = wallet.connect(l1Provider)
+ } else {
+ throw new Error('Must pass one of L1_WALLET_KEY or MNEMONIC')
+ }
+
+ const service = new FraudProverService({
+ l1RpcProvider: l1Provider,
+ l2RpcProvider: l2Provider,
+ addressManagerAddress: ADDRESS_MANAGER_ADDRESS,
+ l1Wallet: wallet,
+ deployGasLimit: RELAY_GAS_LIMIT, //should reconcile naming
+ runGasLimit: RUN_GAS_LIMIT, //should reconcile naming
+ fromL2TransactionIndex: FROM_L2_TRANSACTION_INDEX,
+ pollingInterval: POLLING_INTERVAL,
+ l2BlockOffset: L2_BLOCK_OFFSET,
+ l1StartOffset: L1_START_OFFSET,
+ l1BlockFinality: L1_BLOCK_FINALITY,
+ //getLogsInterval: GET_LOGS_INTERVAL,
+ })
+
+ await service.start()
+}
+export default main
diff --git a/omgx_utilities/fraud-prover/src/service.ts b/omgx_utilities/fraud-prover/src/service.ts
new file mode 100644
index 000000000000..9325dfcc4f81
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/service.ts
@@ -0,0 +1,1222 @@
+/* Imports: External */
+import { Contract, Signer, ethers, Wallet, BigNumber, providers } from 'ethers'
+import * as rlp from 'rlp'
+import { MerkleTree } from 'merkletreejs'
+
+import { BaseTrie } from 'merkle-patricia-tree'
+import { BaseService } from '@eth-optimism/common-ts'
+
+import { loadContract, loadContractFromManager } from '@eth-optimism/contracts'
+
+/* Imports: Internal */
+import {
+ ZERO_ADDRESS,
+ L1ProviderWrapper,
+ L2ProviderWrapper,
+ encodeAccountState,
+ hashOvmTransaction,
+ makeTrieFromProofs,
+ shuffle,
+ toStrippedHexString,
+ toBytes32,
+ toHexString,
+ fromHexString,
+ sleep,
+} from './utils'
+
+import {
+ StateDiffProof,
+ StateTransitionPhase,
+ FraudProofData,
+ OvmTransaction,
+ StateRootBatchProof,
+ TransactionBatchProof,
+ AccountStateProof,
+ StorageStateProof,
+} from './types'
+
+interface FraudProverOptions {
+ // Providers for interacting with L1 and L2.
+ l1RpcProvider: providers.JsonRpcProvider
+ l2RpcProvider: providers.JsonRpcProvider
+
+ // Address of the AddressManager contract, used to resolve the various addresses we'll need
+ // within this service.
+ addressManagerAddress: string
+
+ // Wallet instance, used to sign the L1 transactions.
+ l1Wallet: Wallet // l1Wallet: Signer
+
+ // Max gas.
+ deployGasLimit: number
+ runGasLimit: number
+
+ // Height of the L2 transaction to start searching for L2->L1 messages.
+ fromL2TransactionIndex?: number
+
+ // Interval in seconds to wait between loops.
+ pollingInterval?: number
+
+ // Number of blocks that L2 is "ahead" of transaction indices. Can happen if blocks are created
+ // on L2 after the genesis but before the first state commitment is published.
+ l2BlockOffset?: number
+
+ // L1 block to start querying events from. Recommended to set to the StateCommitmentChain deploy height
+ l1StartOffset?: number
+
+ // When L1 blocks are considered final
+ l1BlockFinality: number
+
+ // Number of blocks within each getLogs query - max is 2000
+ getLogsInterval?: number
+}
+
+const optionSettings = {
+ pollingInterval: { default: 5000 },
+ deployGasLimit: { default: 4_000_000 },
+ runGasLimit: { default: 9_500_000 },
+ fromL2TransactionIndex: { default: 0 },
+ l2BlockOffset: { default: 1 },
+ l1StartOffset: { default: 0 },
+ l1BlockFinality: { default: 0 },
+ getLogsInterval: { default: 2000 },
+}
+
+export class FraudProverService extends BaseService {
+ constructor(options: FraudProverOptions) {
+ super('Fraud_Prover', options, optionSettings)
+ }
+
+ private state: {
+ nextUnverifiedStateRoot: number
+ lastFinalizedTxHeight: number
+ nextUnfinalizedTxHeight: number
+ lastQueriedL1Block: number
+ eventCache: ethers.Event[]
+ Lib_AddressManager: Contract
+ OVM_StateCommitmentChain: Contract
+ OVM_L1CrossDomainMessenger: Contract
+ OVM_L2CrossDomainMessenger: Contract
+ OVM_L2ToL1MessagePasser: Contract
+ l1Provider: L1ProviderWrapper
+ l2Provider: L2ProviderWrapper
+ OVM_CanonicalTransactionChain: Contract
+ OVM_FraudVerifier: Contract
+ OVM_ExecutionManager: Contract
+ }
+
+ protected async _init(): Promise {
+ this.logger.info('Initializing fraud prover', { options: this.options })
+
+ // Need to improve this, sorry.
+ // haha - cry
+ this.state = {} as any
+
+ const address = await this.options.l1Wallet.getAddress()
+ this.logger.info('Using L1 EOA', { address })
+
+ this.logger.info('Trying to connect to the L1 network...')
+ for (let i = 0; i < 10; i++) {
+ try {
+ await this.options.l1RpcProvider.detectNetwork()
+ this.logger.info('Successfully connected to the L1 network.')
+ break
+ } catch (err) {
+ if (i < 9) {
+ this.logger.info('Unable to connect to L1 network', {
+ retryAttemptsRemaining: 10 - i,
+ })
+ await sleep(1000)
+ } else {
+ throw new Error(
+ `Unable to connect to the L1 network, check that your L1 endpoint is correct.`
+ )
+ }
+ }
+ }
+
+ this.logger.info('Trying to connect to the L2 network...')
+ for (let i = 0; i < 10; i++) {
+ try {
+ await this.options.l2RpcProvider.detectNetwork()
+ this.logger.info('Successfully connected to the L2 network.')
+ break
+ } catch (err) {
+ if (i < 9) {
+ this.logger.info('Unable to connect to L2 network', {
+ retryAttemptsRemaining: 10 - i,
+ })
+ await sleep(1000)
+ } else {
+ throw new Error(
+ `Unable to connect to the L2 network, check that your L2 endpoint is correct.`
+ )
+ }
+ }
+ }
+
+ this.logger.info('Connecting to Lib_AddressManager...')
+
+ this.state.Lib_AddressManager = loadContract(
+ 'Lib_AddressManager',
+ this.options.addressManagerAddress,
+ this.options.l1RpcProvider
+ )
+
+ this.logger.info('Connected to Lib_AddressManager', {
+ address: this.state.Lib_AddressManager.address,
+ })
+
+ this.logger.info('Connecting to OVM_StateCommitmentChain...')
+ this.state.OVM_StateCommitmentChain = await loadContractFromManager({
+ name: 'OVM_StateCommitmentChain',
+ Lib_AddressManager: this.state.Lib_AddressManager,
+ provider: this.options.l1RpcProvider,
+ })
+ this.logger.info('Connected to OVM_StateCommitmentChain', {
+ address: this.state.OVM_StateCommitmentChain.address,
+ })
+
+ this.logger.info('Connecting to OVM_CanonicalTransactionChain...')
+ this.state.OVM_CanonicalTransactionChain = await loadContractFromManager({
+ name: 'OVM_CanonicalTransactionChain',
+ Lib_AddressManager: this.state.Lib_AddressManager,
+ provider: this.options.l1RpcProvider,
+ })
+ this.logger.info('Connected to OVM_CanonicalTransactionChain', {
+ address: this.state.OVM_CanonicalTransactionChain.address,
+ })
+
+ this.logger.info('Connecting to OVM_FraudVerifier...')
+ this.state.OVM_FraudVerifier = await loadContractFromManager({
+ name: 'OVM_FraudVerifier',
+ Lib_AddressManager: this.state.Lib_AddressManager,
+ provider: this.options.l1RpcProvider,
+ })
+ this.logger.info('Connected to OVM_FraudVerifier', {
+ address: this.state.OVM_FraudVerifier.address,
+ })
+
+ this.logger.info('Connecting to OVM_ExecutionManager...')
+ this.state.OVM_ExecutionManager = await loadContractFromManager({
+ name: 'OVM_ExecutionManager',
+ Lib_AddressManager: this.state.Lib_AddressManager,
+ provider: this.options.l1RpcProvider,
+ })
+ this.logger.info('Connected to OVM_ExecutionManager', {
+ address: this.state.OVM_ExecutionManager.address,
+ })
+
+ this.logger.info('Connected to all contracts.')
+
+ this.state.l1Provider = new L1ProviderWrapper(
+ this.options.l1RpcProvider,
+ this.state.OVM_StateCommitmentChain,
+ this.state.OVM_CanonicalTransactionChain,
+ this.state.OVM_ExecutionManager,
+ this.options.l1StartOffset,
+ this.options.l1BlockFinality
+ )
+
+ this.state.l2Provider = new L2ProviderWrapper(this.options.l2RpcProvider)
+
+ this.logger.info(
+ 'Caching events for relevant contracts, this might take a while...'
+ )
+
+ this.logger.info('Caching events for OVM_StateCommitmentChain...')
+ await this.state.l1Provider.findAllEvents(
+ this.state.OVM_StateCommitmentChain,
+ this.state.OVM_StateCommitmentChain.filters.StateBatchAppended()
+ )
+
+ this.logger.info('Caching events for OVM_CanonicalTransactionChain...')
+ await this.state.l1Provider.findAllEvents(
+ this.state.OVM_CanonicalTransactionChain,
+ this.state.OVM_CanonicalTransactionChain.filters.TransactionBatchAppended()
+ )
+
+ await this.state.l1Provider.findAllEvents(
+ this.state.OVM_CanonicalTransactionChain,
+ this.state.OVM_CanonicalTransactionChain.filters.SequencerBatchAppended()
+ )
+
+ this.state.lastQueriedL1Block = this.options.l1StartOffset
+ this.state.eventCache = []
+
+ this.state.lastFinalizedTxHeight = this.options.fromL2TransactionIndex || 0
+ this.state.nextUnfinalizedTxHeight =
+ this.options.fromL2TransactionIndex || 0
+ this.state.nextUnverifiedStateRoot =
+ this.options.fromL2TransactionIndex || 0
+ }
+
+ /*
+{"level":30,"time":1621896406019,"proof":{"header":{"number":6,"hash":"0xdf2e2dc16c24dcd3385d8965de1ac205e883199af730313915a3b971dc018f68","stateRoot":"0xf121b2f028e2f1810f16e9138712b14532ff6cf5ca101e8b93a2300aa87c2c61","timestamp":1621896367},"accountStateProofs":null},"msg":"_makeStateTrie"}
+
+{"level":50,"time":1621896406019,"err":{"type":"TypeError","message":"
+Cannot read property 'map' of null","stack":"TypeError: Cannot read property 'map' of null\n at
+FraudProverService._makeStateTrie (/opt/fraud-prover/src/service.ts:661:32)\n at
+FraudProverService._getFraudProofData (/opt/fraud-prover/src/service.ts:556:34)\n at
+runMicrotasks ()\n at processTicksAndRejections (internal/process/task_queues.js:95:5)\n at
+FraudProverService._start (/opt/fraud-prover/src/service.ts:283:23)\n at FraudProverService.start
+(/opt/fraud-prover/node_modules/@eth-optimism/core-utils/src/base-service.ts:57:5)\n at main (/opt/fraud-prover/src/exec/run.ts:63:3)\n at /opt/fraud-prover/exec/run.js:6:3"},"msg":"Caught an unhandled error"}
+*/
+
+ protected async _start(): Promise {
+ while (this.running) {
+ await sleep(this.options.pollingInterval)
+
+ try {
+ this.logger.info('Looking for mismatched state roots...')
+
+ const fraudulentStateRootIndex =
+ await this._findNextFraudulentStateRoot()
+
+ if (fraudulentStateRootIndex === undefined) {
+ this.logger.info('Did not find any mismatched state roots', {
+ nextAttemptInS: this.options.pollingInterval / 1000,
+ })
+ continue
+ }
+
+ this.logger.info('Found a mismatched state root: index', {
+ index: fraudulentStateRootIndex,
+ })
+
+ this.logger.info('Pulling fraud proof data for this index...')
+
+ const proof = await this._getFraudProofData(fraudulentStateRootIndex)
+
+ this.logger.info('Initializing the fraud verification process...')
+ this.logger.info('The proof:', {
+ pre: proof.preStateRootProof,
+ tra: proof.transactionProof,
+ })
+
+ try {
+ await this._initializeFraudVerification(
+ proof.preStateRootProof,
+ proof.transactionProof
+ )
+ } catch (err) {
+ if (err.toString().includes('Reverted 0x')) {
+ this.logger.info(
+ 'Fraud proof was initialized by someone else, moving on...'
+ )
+ } else {
+ throw err
+ }
+ }
+
+ this.logger.info('Loading fraud proof contracts...')
+
+ const { OVM_StateTransitioner, OVM_StateManager } =
+ await this._getFraudProofContracts(
+ await this.state.l1Provider.getStateRoot(
+ fraudulentStateRootIndex - 1
+ ),
+ proof.transactionProof.transaction
+ )
+
+ // PRE_EXECUTION phase.
+ if (
+ (await OVM_StateTransitioner.phase()) ===
+ StateTransitionPhase.PRE_EXECUTION
+ ) {
+ try {
+ this.logger.info('Fraud proof is now in the PRE_EXECUTION phase.')
+
+ this.logger.info('Proving account states...')
+ await this._proveAccountStates(
+ OVM_StateTransitioner,
+ OVM_StateManager,
+ proof.stateDiffProof.accountStateProofs,
+ fraudulentStateRootIndex
+ )
+
+ this.logger.info('Proving storage slot states...')
+ await this._proveContractStorageStates(
+ OVM_StateTransitioner,
+ OVM_StateManager,
+ proof.stateDiffProof.accountStateProofs
+ )
+
+ this.logger.info('Executing transaction...')
+ try {
+ await (
+ await OVM_StateTransitioner.applyTransaction(
+ proof.transactionProof.transaction,
+ {
+ gasLimit: this.options.runGasLimit,
+ }
+ )
+ ).wait()
+ } catch (err) {
+ await OVM_StateTransitioner.callStatic.applyTransaction(
+ proof.transactionProof.transaction,
+ {
+ gasLimit: this.options.runGasLimit,
+ }
+ )
+ }
+
+ this.logger.info('Transaction successfully executed.')
+ } catch (err) {
+ if (
+ err
+ .toString()
+ .includes(
+ 'Function must be called during the correct phase.'
+ ) ||
+ err
+ .toString()
+ .includes(
+ '46756e6374696f6e206d7573742062652063616c6c656420647572696e672074686520636f72726563742070686173652e'
+ )
+ ) {
+ this.logger.info(
+ 'Phase was completed by someone else, moving on.'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+
+ // POST_EXECUTION phase.
+ if (
+ (await OVM_StateTransitioner.phase()) ===
+ StateTransitionPhase.POST_EXECUTION
+ ) {
+ try {
+ this.logger.info('Fraud proof is now in the POST_EXECUTION phase.')
+
+ this.logger.info('Committing storage slot state updates...')
+ await this._updateContractStorageStates(
+ OVM_StateTransitioner,
+ OVM_StateManager,
+ proof.stateDiffProof.accountStateProofs,
+ proof.storageTries
+ )
+
+ this.logger.info('Committing account state updates...')
+ await this._updateAccountStates(
+ OVM_StateTransitioner,
+ OVM_StateManager,
+ proof.stateDiffProof.accountStateProofs,
+ proof.stateTrie
+ )
+
+ this.logger.info('Completing the state transition...')
+ try {
+ await (await OVM_StateTransitioner.completeTransition()).wait()
+ } catch (err) {
+ try {
+ await OVM_StateTransitioner.callStatic.completeTransition()
+ } catch (err) {
+ if (err.toString().includes('Reverted 0x')) {
+ this.logger.info(
+ 'State transition was completed by someone else, moving on.'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+
+ this.logger.info('State transition completed.')
+ } catch (err) {
+ if (
+ err
+ .toString()
+ .includes(
+ 'Function must be called during the correct phase.'
+ ) ||
+ err
+ .toString()
+ .includes(
+ '46756e6374696f6e206d7573742062652063616c6c656420647572696e672074686520636f72726563742070686173652e'
+ )
+ ) {
+ this.logger.info(
+ 'Phase was completed by someone else, moving on.'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+
+ // COMPLETE phase.
+ if (
+ (await OVM_StateTransitioner.phase()) ===
+ StateTransitionPhase.COMPLETE
+ ) {
+ this.logger.info('Fraud proof is now in the COMPLETE phase.')
+
+ this.logger.info('Attempting to finalize the fraud proof...')
+ try {
+ await this._finalizeFraudVerification(
+ proof.preStateRootProof,
+ proof.postStateRootProof,
+ proof.transactionProof.transaction
+ )
+
+ this.logger.info('Fraud proof finalized! Congrats.')
+ } catch (err) {
+ if (
+ err.toString().includes('Invalid batch header.') ||
+ err.toString().includes('Index out of bounds.') ||
+ err.toString().includes('Reverted 0x')
+ ) {
+ this.logger.info('Fraud proof was finalized by someone else.')
+ } else {
+ throw err
+ }
+ }
+ }
+
+ this.state.nextUnverifiedStateRoot =
+ proof.preStateRootProof.stateRootBatchHeader.prevTotalElements.toNumber()
+ } catch (err) {
+ this.logger.error('Caught an unhandled error', {
+ err,
+ })
+ }
+ }
+ }
+
+ /**
+ * Finds the index of the next fraudulent state root.
+ * @return Index of the next fraudulent state root, if any.
+ */
+ private async _findNextFraudulentStateRoot(): Promise {
+ this.logger.info('getStateRootBatchHeader', {
+ nUSR: this.state.nextUnverifiedStateRoot,
+ })
+
+ let nextBatchHeader = await this.state.l1Provider.getStateRootBatchHeader(
+ this.state.nextUnverifiedStateRoot
+ )
+
+ this.logger.info('_findNextFraudulentStateRoot(): nextBatchHeader', {
+ nextBatchHeader,
+ })
+
+ while (nextBatchHeader !== undefined) {
+ //this.logger.info("ok, let's have a look", { nextBatchHeader })
+
+ const nextBatchStateRoots =
+ await this.state.l1Provider.getBatchStateRoots(
+ this.state.nextUnverifiedStateRoot
+ )
+
+ for (let i = 0; i < nextBatchHeader.batchSize.toNumber(); i++) {
+ const index = i + nextBatchHeader.prevTotalElements.toNumber()
+
+ this.logger.info('Checking state root for mismatch', { index })
+
+ const l1StateRoot = nextBatchStateRoots[i]
+
+ const l2StateRoot = await this.state.l2Provider.getStateRoot(
+ index + this.options.l2BlockOffset
+ )
+
+ if (l1StateRoot !== l2StateRoot) {
+ this.logger.info('State roots do not match')
+ this.logger.info('L1 State Root', { l1StateRoot })
+ this.logger.info('L2 State Root', { l2StateRoot })
+ this.logger.info('Returning index of the mismatch', { index })
+ return index
+ } else {
+ this.logger.info('State root was not mismatched ✓')
+ }
+ }
+
+ this.state.nextUnverifiedStateRoot =
+ nextBatchHeader.prevTotalElements.toNumber() +
+ nextBatchHeader.batchSize.toNumber()
+
+ nextBatchHeader = await this.state.l1Provider.getStateRootBatchHeader(
+ this.state.nextUnverifiedStateRoot
+ )
+ }
+ }
+
+ /**
+ * Generates all transaction proof data for a given transaction index.
+ * @param transactionIndex Transaction index to get proof data for.
+ * @return Transaction proof data.
+ */
+ private async _getFraudProofData(
+ transactionIndex: number
+ ): Promise {
+ this.logger.info(
+ 'Getting pre-state root inclusion proof for index - 1...',
+ { preIndex: transactionIndex - 1 }
+ )
+ const preStateRootProof =
+ await this.state.l1Provider.getStateRootBatchProof(transactionIndex - 1)
+
+ this.logger.info('Getting post-state root inclusion proof for index...', {
+ postIndex: transactionIndex,
+ })
+ const postStateRootProof =
+ await this.state.l1Provider.getStateRootBatchProof(transactionIndex)
+
+ this.logger.info('Getting transaction inclusion proof...')
+ const transactionProof =
+ await this.state.l1Provider.getTransactionBatchProof(transactionIndex)
+ //this might be ok at this point?
+ //this.logger.info('Transaction inclusion proof...',{transactionProof})
+
+ console.log(
+ 'The right index?',
+ transactionIndex + this.options.l2BlockOffset
+ )
+ this.logger.info('Getting state diff proof...')
+
+ const stateDiffProof: StateDiffProof =
+ await this.state.l2Provider.getStateDiffProof(
+ transactionIndex + this.options.l2BlockOffset
+ )
+ //this.logger.info('State diff proof...',{stateDiffProof})
+
+ const stateTrie = await this._makeStateTrie(stateDiffProof)
+ const storageTries = await this._makeAccountTries(stateDiffProof)
+
+ return {
+ stateDiffProof,
+ transactionProof,
+ preStateRootProof,
+ postStateRootProof,
+ stateTrie,
+ storageTries,
+ }
+ }
+
+ /**
+ * Pulls the fraud proof contracts.
+ * @param preStateRoot Pre-state root to pull contracts for.
+ * @param transaction Transaction to pull contracts for.
+ * @return Fraud proof contracts.
+ */
+ private async _getFraudProofContracts(
+ preStateRoot: string,
+ transaction: OvmTransaction
+ ): Promise<{
+ OVM_StateTransitioner: Contract
+ OVM_StateManager: Contract
+ }> {
+ this.logger.info('Loading the state transitioner...')
+
+ const stateTransitionerAddress = await this._getStateTransitioner(
+ preStateRoot,
+ transaction
+ )
+
+ const OVM_StateTransitioner = loadContract(
+ 'OVM_StateTransitioner',
+ stateTransitionerAddress,
+ this.options.l1RpcProvider as any
+ ).connect(this.options.l1Wallet as any)
+
+ this.logger.info('State transitioner', { stateTransitionerAddress })
+
+ this.logger.info('Loading the corresponding state manager...')
+
+ const stateManagerAddress = await OVM_StateTransitioner.ovmStateManager()
+
+ this.logger.info('stateManagerAddress...', { stateManagerAddress })
+
+ const OVM_StateManager = loadContract(
+ 'OVM_StateManager',
+ stateManagerAddress,
+ this.options.l1RpcProvider as any
+ ).connect(this.options.l1Wallet as any)
+
+ this.logger.info('State manager', { stateManagerAddress })
+
+ return {
+ OVM_StateTransitioner,
+ OVM_StateManager,
+ }
+ }
+
+ /**
+ * Generates a view of the state trie from a state diff proof.
+ * @param proof State diff proof to generate a trie from.
+ * @return View of the state trie.
+ */
+ private async _makeStateTrie(proof: StateDiffProof): Promise {
+ this.logger.info('_makeStateTrie for this proof:', { proof })
+
+ if (proof.accountStateProofs === null) {
+ //not sure why this is happening
+ this.logger.info('_makeStateTrie proof.accountStateProofs === null')
+ return
+ }
+
+ return makeTrieFromProofs(
+ proof.accountStateProofs.map((accountStateProof) => {
+ return accountStateProof.accountProof
+ })
+ )
+ }
+
+ /**
+ * Generates a view of a set of account tries from a state diff proof.
+ * @param proof State diff proof to generate tries from.
+ * @return View of a set of all account tries.
+ */
+ private async _makeAccountTries(proof: StateDiffProof): Promise<{
+ [address: string]: BaseTrie
+ }> {
+ const accountTries: { [address: string]: BaseTrie } = {}
+
+ for (const accountStateProof of proof.accountStateProofs) {
+ accountTries[accountStateProof.address] = await makeTrieFromProofs(
+ accountStateProof.storageProof.map((storageProof) => {
+ return storageProof.proof
+ })
+ )
+ }
+
+ return accountTries
+ }
+
+ /**
+ * Retrieves the state transitioner corresponding to a given pre-state root and transaction.
+ * @param preStateRoot Pre-state root to retreive a state transitioner for.
+ * @param transaction Transaction to retreive a state transitioner for.
+ * @return Address of the corresponding state transitioner.
+ */
+ private async _getStateTransitioner(
+ preStateRoot: string,
+ transaction: OvmTransaction
+ ): Promise {
+ return this.state.OVM_FraudVerifier.getStateTransitioner(
+ preStateRoot,
+ hashOvmTransaction(transaction)
+ )
+ }
+
+ /**
+ * Simple mechanism for deploying an exact bytecode to a given address. Resulting contract will
+ * have code exactly matching the given `code` variable, and none of the code will be executed
+ * during creation.
+ * @param code Code to store at a given address.
+ * @return Address of the newly created contract.
+ */
+ private async _deployContractCode(code: string): Promise {
+ // "Magic" prefix to be prepended to the contract code. Contains a series of opcodes that will
+ // copy the given code into memory and return it, thereby storing at the contract address.
+ const prefix = '0x600D380380600D6000396000f3'
+ const deployCode = prefix + toHexString(code).slice(2)
+
+ const response = await this.options.l1Wallet.sendTransaction({
+ to: null,
+ data: deployCode,
+ gasLimit: this.options.deployGasLimit,
+ })
+
+ const result = await response.wait()
+ return result.contractAddress
+ }
+
+ /**
+ * Proves the state of all given accounts.
+ * @param OVM_StateTransitioner Ethers contract instance pointed at the state transitioner.
+ * @param OVM_StateManager Ethers contract instance pointed at the state manager.
+ * @param accountStateProofs All account state proofs.
+ * @param fraudulentStateRootIndex Index of the fraudulent state root.
+ */
+ private async _proveAccountStates(
+ OVM_StateTransitioner: Contract,
+ OVM_StateManager: Contract,
+ accountStateProofs: AccountStateProof[],
+ fraudulentStateRootIndex: number
+ ): Promise {
+ for (const accountStateProof of shuffle(accountStateProofs)) {
+ this.logger.info('Attempting to prove account state', {
+ address: accountStateProof.address,
+ })
+
+ if (await OVM_StateManager.hasAccount(accountStateProof.address)) {
+ this.logger.info(
+ 'Someone else already proved this account, skipping...'
+ )
+ continue
+ }
+
+ const accountCode = await this.options.l2RpcProvider.getCode(
+ accountStateProof.address,
+ fraudulentStateRootIndex + this.options.l2BlockOffset
+ )
+
+ let ethContractAddress = '0x0000c0De0000C0DE0000c0de0000C0DE0000c0De'
+ if (accountCode !== '0x') {
+ this.logger.info('Need to deploy a copy of the account first...')
+ ethContractAddress = await this._deployContractCode(accountCode)
+ this.logger.info('Deployed a copy of the account, attempting proof...')
+ }
+
+ try {
+ await (
+ await OVM_StateTransitioner.proveContractState(
+ accountStateProof.address,
+ ethContractAddress,
+ rlp.encode(accountStateProof.accountProof)
+ )
+ ).wait()
+
+ this.logger.info('Account state proven.')
+ } catch (err) {
+ try {
+ await OVM_StateTransitioner.callStatic.proveContractState(
+ accountStateProof.address,
+ ethContractAddress,
+ rlp.encode(accountStateProof.accountProof)
+ )
+ } catch (err) {
+ if (
+ err.toString().includes('Account state has already been proven') ||
+ err.toString().includes('Reverted 0x')
+ ) {
+ this.logger.info(
+ 'Someone else has already proven this account, skipping.'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Proves all contract storage slot states.
+ * @param OVM_StateTransitioner Ethers contract instance pointed at the state transitioner.
+ * @param OVM_StateManager Ethers contract instance pointed at the state manager.
+ * @param accountStateProofs All account state proofs.
+ */
+ private async _proveContractStorageStates(
+ OVM_StateTransitioner: Contract,
+ OVM_StateManager: Contract,
+ accountStateProofs: AccountStateProof[]
+ ): Promise {
+ for (const accountStateProof of shuffle(accountStateProofs)) {
+ for (const slot of shuffle(accountStateProof.storageProof)) {
+ this.logger.info('Attempting to prove slot.', {
+ address: accountStateProof.address,
+ key: slot.key,
+ value: slot.value,
+ })
+ if (
+ await OVM_StateManager.hasContractStorage(
+ accountStateProof.address,
+ toBytes32(slot.key)
+ )
+ ) {
+ this.logger.info(
+ 'Someone else has already proven this slot, skipping...'
+ )
+ continue
+ }
+
+ try {
+ await (
+ await OVM_StateTransitioner.proveStorageSlot(
+ accountStateProof.address,
+ toBytes32(slot.key),
+ rlp.encode(slot.proof)
+ )
+ ).wait()
+
+ this.logger.info('Slot value proven.')
+ } catch (err) {
+ try {
+ await OVM_StateTransitioner.callStatic.proveStorageSlot(
+ accountStateProof.address,
+ toBytes32(slot.key),
+ rlp.encode(slot.proof)
+ )
+ } catch (err) {
+ if (
+ err
+ .toString()
+ .includes('Storage slot has already been proven.') ||
+ err.toString().includes('Reverted 0x')
+ ) {
+ this.logger.info(
+ 'Someone else has already proven this slot, skipping.'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Commits all account state changes.
+ * @param OVM_StateTransitioner Ethers contract instance pointed at the state transitioner.
+ * @param OVM_StateManager Ethers contract instance pointed at the state manager.
+ * @param accountStateProofs All account state proofs.
+ * @param stateTrie State trie view generated from proof data.
+ */
+ private async _updateAccountStates(
+ OVM_StateTransitioner: Contract,
+ OVM_StateManager: Contract,
+ accountStateProofs: AccountStateProof[],
+ stateTrie: BaseTrie
+ ): Promise {
+ while ((await OVM_StateManager.getTotalUncommittedAccounts()) > 0) {
+ const accountCommittedEvents = await this.state.l1Provider.findAllEvents(
+ OVM_StateTransitioner,
+ OVM_StateTransitioner.filters.AccountCommitted()
+ )
+
+ // Use events to figure out which accounts we've already committed.
+ const committedAccounts = accountStateProofs.filter((account) => {
+ return accountCommittedEvents.some((event) => {
+ return (
+ event.args._address.toLowerCase() === account.address.toLowerCase()
+ )
+ })
+ })
+
+ // Update our trie with the values of any accounts that have already been committed. Order
+ // here doesn't matter because the trie will still end up with the same root. We can also
+ // repeatedly update a key with the same value since it won't have an impact on the trie.
+ for (const account of committedAccounts) {
+ const accountState = await OVM_StateManager.getAccount(account.address)
+
+ await stateTrie.put(
+ fromHexString(ethers.utils.keccak256(account.address)),
+ encodeAccountState({
+ ...accountState,
+ ...{
+ nonce: accountState.nonce.toNumber(),
+ },
+ })
+ )
+ }
+
+ // Find an uncommitted account to attempt to commit.
+ let nextUncommittedAccount: AccountStateProof
+ for (const account of shuffle(accountStateProofs)) {
+ if (
+ !(await OVM_StateManager.wasAccountCommitted(account.address)) &&
+ (await OVM_StateManager.wasAccountChanged(account.address))
+ ) {
+ nextUncommittedAccount = account
+ break
+ }
+ }
+
+ if (nextUncommittedAccount === undefined) {
+ if ((await OVM_StateManager.getTotalUncommittedAccounts()) > 0) {
+ throw new Error(
+ `We still have accounts to commit, but we don't have any more proof data. Something went very wrong.`
+ )
+ } else {
+ return
+ }
+ }
+
+ // Generate an inclusion proof for the account, will be used to update the value on-chain.
+ const accountInclusionProof = toHexString(
+ rlp.encode(
+ await BaseTrie.createProof(
+ stateTrie,
+ fromHexString(
+ ethers.utils.keccak256(nextUncommittedAccount.address)
+ )
+ )
+ )
+ )
+
+ const updatedAccountState = await OVM_StateManager.getAccount(
+ nextUncommittedAccount.address
+ )
+
+ this.logger.info('Attempting to commit account.', {
+ address: nextUncommittedAccount.address,
+ balance: updatedAccountState.balance,
+ nonce: updatedAccountState.nonce,
+ storageRoot: updatedAccountState.storageRoot,
+ codeHash: updatedAccountState.codeHash,
+ })
+
+ try {
+ await (
+ await OVM_StateTransitioner.commitContractState(
+ nextUncommittedAccount.address,
+ accountInclusionProof,
+ {
+ gasLimit: this.options.deployGasLimit,
+ }
+ )
+ ).wait()
+
+ this.logger.info('Account committed.')
+ } catch (err) {
+ try {
+ await OVM_StateTransitioner.callStatic.commitContractState(
+ nextUncommittedAccount.address,
+ accountInclusionProof,
+ {
+ gasLimit: this.options.deployGasLimit,
+ }
+ )
+ } catch (err) {
+ if (
+ err.toString().includes('invalid opcode') ||
+ err.toString().includes('Invalid root hash') ||
+ err
+ .toString()
+ .includes(
+ `Account state wasn't changed or has already been committed.`
+ ) ||
+ err.toString().includes('Reverted 0x')
+ ) {
+ this.logger.info(
+ 'Could not commit account because another commitment invalidated our proof, skipping for now...'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Commits all contract storage slot changes.
+ * @param OVM_StateTransitioner Ethers contract instance pointed at the state transitioner.
+ * @param OVM_StateManager Ethers contract instance pointed at the state manager.
+ * @param accountStateProofs All account state proofs.
+ * @param stateTrie State trie view generated from proof data.
+ * @param storageTries Storage trie views generated from proof data.
+ */
+ private async _updateContractStorageStates(
+ OVM_StateTransitioner: Contract,
+ OVM_StateManager: Contract,
+ accountStateProofs: AccountStateProof[],
+ storageTries: {
+ [address: string]: BaseTrie
+ }
+ ) {
+ while ((await OVM_StateManager.getTotalUncommittedContractStorage()) > 0) {
+ const storageCommittedEvents = await this.state.l1Provider.findAllEvents(
+ OVM_StateTransitioner,
+ OVM_StateTransitioner.filters.ContractStorageCommitted()
+ )
+
+ for (const accountStateProof of accountStateProofs) {
+ const committedStorageSlots = accountStateProof.storageProof.filter(
+ (storageProof) => {
+ return storageCommittedEvents.some((event) => {
+ return (
+ event.args._address.toLowerCase() ===
+ accountStateProof.address.toLowerCase() &&
+ event.args._key.toLowerCase() === storageProof.key.toLowerCase()
+ )
+ })
+ }
+ )
+
+ for (const storageProof of committedStorageSlots) {
+ const updatedSlotValue = await OVM_StateManager.getContractStorage(
+ accountStateProof.address,
+ storageProof.key
+ )
+
+ await storageTries[accountStateProof.address].put(
+ fromHexString(ethers.utils.keccak256(storageProof.key)),
+ fromHexString(rlp.encode(toStrippedHexString(updatedSlotValue)))
+ )
+ }
+ }
+
+ for (const accountStateProof of accountStateProofs) {
+ let nextUncommittedStorageProof: StorageStateProof
+ for (const storageProof of accountStateProof.storageProof) {
+ if (
+ !(await OVM_StateManager.wasContractStorageCommitted(
+ accountStateProof.address,
+ storageProof.key
+ )) &&
+ (await OVM_StateManager.wasContractStorageChanged(
+ accountStateProof.address,
+ storageProof.key
+ ))
+ ) {
+ nextUncommittedStorageProof = storageProof
+ break
+ }
+ }
+
+ if (nextUncommittedStorageProof === undefined) {
+ continue
+ }
+
+ const slotInclusionProof = toHexString(
+ rlp.encode(
+ await BaseTrie.createProof(
+ storageTries[accountStateProof.address],
+ fromHexString(
+ ethers.utils.keccak256(nextUncommittedStorageProof.key)
+ )
+ )
+ )
+ )
+
+ const updatedSlotValue = await OVM_StateManager.getContractStorage(
+ accountStateProof.address,
+ nextUncommittedStorageProof.key
+ )
+
+ this.logger.info('Attempting to commit storage slot.', {
+ address: accountStateProof.address,
+ key: nextUncommittedStorageProof.key,
+ value: updatedSlotValue,
+ })
+
+ try {
+ await (
+ await OVM_StateTransitioner.commitStorageSlot(
+ accountStateProof.address,
+ nextUncommittedStorageProof.key,
+ slotInclusionProof,
+ {
+ gasLimit: this.options.deployGasLimit,
+ }
+ )
+ ).wait()
+
+ this.logger.info('Storage slot committed.')
+ } catch (err) {
+ try {
+ await OVM_StateTransitioner.callStatic.commitStorageSlot(
+ accountStateProof.address,
+ nextUncommittedStorageProof.key,
+ slotInclusionProof,
+ {
+ gasLimit: this.options.deployGasLimit,
+ }
+ )
+ } catch (err) {
+ if (
+ err.toString().includes('invalid opcode') ||
+ err.toString().includes('Invalid root hash') ||
+ err
+ .toString()
+ .includes(
+ `Storage slot value wasn't changed or has already been committed.`
+ ) ||
+ err.toString().includes('Reverted 0x')
+ ) {
+ this.logger.info(
+ 'Could not commit slot because another commitment invalidated our proof, skipping for now...'
+ )
+ } else {
+ throw err
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Initializes the fraud verification process.
+ * @param preStateRootProof Proof data for the pre-state root.
+ * @param transactionProof Proof data for the transaction being verified.
+ */
+ private async _initializeFraudVerification(
+ preStateRootProof: StateRootBatchProof,
+ transactionProof: TransactionBatchProof
+ ): Promise {
+ const stateTransitionerAddress = await this._getStateTransitioner(
+ preStateRootProof.stateRoot,
+ transactionProof.transaction
+ )
+
+ if (stateTransitionerAddress !== ZERO_ADDRESS) {
+ return
+ }
+
+ try {
+ await (
+ await this.state.OVM_FraudVerifier.connect(
+ this.options.l1Wallet
+ ).initializeFraudVerification(
+ preStateRootProof.stateRoot,
+ preStateRootProof.stateRootBatchHeader,
+ preStateRootProof.stateRootProof,
+ transactionProof.transaction,
+ transactionProof.transactionChainElement,
+ transactionProof.transactionBatchHeader,
+ transactionProof.transactionProof
+ )
+ ).wait()
+ } catch (err) {
+ await this.state.OVM_FraudVerifier.connect(
+ this.options.l1Wallet
+ ).callStatic.initializeFraudVerification(
+ preStateRootProof.stateRoot,
+ preStateRootProof.stateRootBatchHeader,
+ preStateRootProof.stateRootProof,
+ transactionProof.transaction,
+ transactionProof.transactionChainElement,
+ transactionProof.transactionBatchHeader,
+ transactionProof.transactionProof
+ )
+ }
+ }
+
+ /**
+ * Finalizes the fraud verification process.
+ * @param preStateRootProof Proof data for the pre-state root.
+ * @param postStateRootProof Proof data for the post-state root.
+ * @param transaction Transaction being verified.
+ */
+ private async _finalizeFraudVerification(
+ preStateRootProof: StateRootBatchProof,
+ postStateRootProof: StateRootBatchProof,
+ transaction: OvmTransaction
+ ): Promise {
+ try {
+ await (
+ await this.state.OVM_FraudVerifier.connect(
+ this.options.l1Wallet
+ ).finalizeFraudVerification(
+ preStateRootProof.stateRoot,
+ preStateRootProof.stateRootBatchHeader,
+ preStateRootProof.stateRootProof,
+ hashOvmTransaction(transaction),
+ postStateRootProof.stateRoot,
+ postStateRootProof.stateRootBatchHeader,
+ postStateRootProof.stateRootProof
+ )
+ ).wait()
+ } catch (err) {
+ await this.state.OVM_FraudVerifier.connect(
+ this.options.l1Wallet
+ ).callStatic.finalizeFraudVerification(
+ preStateRootProof.stateRoot,
+ preStateRootProof.stateRootBatchHeader,
+ preStateRootProof.stateRootProof,
+ hashOvmTransaction(transaction),
+ postStateRootProof.stateRoot,
+ postStateRootProof.stateRootBatchHeader,
+ postStateRootProof.stateRootProof
+ )
+ }
+ }
+}
diff --git a/omgx_utilities/fraud-prover/src/types.ts b/omgx_utilities/fraud-prover/src/types.ts
new file mode 100644
index 000000000000..ff5a3143c6fe
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/types.ts
@@ -0,0 +1,123 @@
+import { BigNumber } from 'ethers'
+import { BaseTrie } from 'merkle-patricia-tree'
+
+export interface StateRootBatchHeader {
+ batchIndex: BigNumber
+ batchRoot: string
+ batchSize: BigNumber
+ prevTotalElements: BigNumber
+ extraData: string
+}
+
+export interface SentMessage {
+ target: string
+ sender: string
+ message: string
+ messageNonce: number
+ encodedMessage: string
+ encodedMessageHash: string
+ parentTransactionIndex: number
+ parentTransactionHash: string
+}
+
+export interface SentMessageProof {
+ stateRoot: string
+ stateRootBatchHeader: StateRootBatchHeader
+ stateRootProof: StateRootProof
+ stateTrieWitness: string | Buffer
+ storageTrieWitness: string | Buffer
+}
+
+export interface StateRootProof {
+ index: number
+ siblings: string[]
+}
+
+export interface TransactionBatchHeader {
+ batchIndex: BigNumber
+ batchRoot: string
+ batchSize: BigNumber
+ prevTotalElements: BigNumber
+ extraData: string
+}
+
+export interface TransactionProof {
+ index: number
+ siblings: string[]
+}
+
+export interface StateRootBatchProof {
+ stateRoot: string
+ stateRootBatchHeader: StateRootBatchHeader
+ stateRootProof: StateRootProof
+}
+
+export interface TransactionBatchProof {
+ transaction: OvmTransaction
+ transactionChainElement: TransactionChainElement
+ transactionBatchHeader: TransactionBatchHeader
+ transactionProof: TransactionProof
+}
+
+export enum StateTransitionPhase {
+ PRE_EXECUTION,
+ POST_EXECUTION,
+ COMPLETE,
+}
+
+export interface AccountStateProof {
+ address: string
+ balance: string
+ nonce: string
+ codeHash: string
+ storageHash: string
+ accountProof: string[]
+ storageProof: StorageStateProof[]
+}
+
+export interface StorageStateProof {
+ key: string
+ value: string
+ proof: string[]
+}
+
+export interface StateDiffProof {
+ header: {
+ number: number
+ hash: string
+ stateRoot: string
+ timestamp: number
+ }
+
+ accountStateProofs: AccountStateProof[]
+}
+
+export interface OvmTransaction {
+ blockNumber: number
+ timestamp: number
+ entrypoint: string
+ gasLimit: number
+ l1TxOrigin: string
+ l1QueueOrigin: number
+ data: string
+}
+
+export interface FraudProofData {
+ stateDiffProof: StateDiffProof
+ transactionProof: TransactionBatchProof
+ preStateRootProof: StateRootBatchProof
+ postStateRootProof: StateRootBatchProof
+
+ stateTrie: BaseTrie
+ storageTries: {
+ [address: string]: BaseTrie
+ }
+}
+
+export interface TransactionChainElement {
+ isSequenced: boolean
+ queueIndex?: number
+ timestamp?: number
+ blockNumber?: number
+ txData?: string
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/common.ts b/omgx_utilities/fraud-prover/src/utils/common.ts
new file mode 100644
index 000000000000..fd725abc960c
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/common.ts
@@ -0,0 +1,7 @@
+export const shuffle = (array: any[]): any[] => {
+ for (let i = array.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1))
+ ;[array[i], array[j]] = [array[j], array[i]]
+ }
+ return array
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/constants.ts b/omgx_utilities/fraud-prover/src/utils/constants.ts
new file mode 100644
index 000000000000..aab266df5fd2
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/constants.ts
@@ -0,0 +1 @@
+export const ZERO_ADDRESS = '0x' + '00'.repeat(20)
diff --git a/omgx_utilities/fraud-prover/src/utils/eth-utils.ts b/omgx_utilities/fraud-prover/src/utils/eth-utils.ts
new file mode 100644
index 000000000000..0f39f122ad83
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/eth-utils.ts
@@ -0,0 +1,23 @@
+import * as rlp from 'rlp'
+import { BigNumber } from 'ethers'
+import { Account, BN } from 'ethereumjs-util'
+import { toHexString, fromHexString } from './hex-utils'
+
+export const encodeAccountState = (state: Partial): Buffer => {
+ return new Account(
+ new BN(state.nonce),
+ new BN(state.balance.toNumber()),
+ fromHexString(state.storageRoot),
+ fromHexString(state.codeHash)
+ ).serialize()
+}
+
+export const decodeAccountState = (state: Buffer): any => {
+ const account = Account.fromRlpSerializedAccount(state)
+ return {
+ nonce: account.nonce.toNumber(),
+ balance: BigNumber.from(account.nonce.toNumber()),
+ storageRoot: toHexString(account.stateRoot),
+ codeHash: toHexString(account.codeHash),
+ }
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/hex-utils.ts b/omgx_utilities/fraud-prover/src/utils/hex-utils.ts
new file mode 100644
index 000000000000..64a52ac4fbdb
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/hex-utils.ts
@@ -0,0 +1,75 @@
+import { BigNumber } from 'ethers'
+
+export const toUnpaddedHexString = (buf: Buffer | string | number): string => {
+ // prettier-ignore
+ const hex =
+ '0x' +
+ toHexString(buf)
+ .slice(2)
+ .replace(/^0+/, '')
+
+ if (hex === '0x') {
+ return '0x0'
+ } else {
+ return hex
+ }
+}
+
+export const toStrippedHexString = (buf: Buffer | string | number): string => {
+ const hex = toUnpaddedHexString(buf).slice(2)
+
+ if (hex === '0') {
+ return '0x'
+ } else if (hex.length % 2 === 1) {
+ return '0x' + '0' + hex
+ } else {
+ return '0x' + hex
+ }
+}
+
+export const toBytes32 = (buf: Buffer | string | number): string => {
+ return toBytesN(buf, 32)
+}
+
+export const toBytesN = (buf: Buffer | string | number, n: number): string => {
+ return (
+ '0x' +
+ toHexString(buf)
+ .slice(2)
+ .padStart(n * 2, '0')
+ )
+}
+
+export const toUint256 = (num: number): string => {
+ return toUintN(num, 32)
+}
+
+export const toUint8 = (num: number): string => {
+ return toUintN(num, 1)
+}
+
+export const toUintN = (num: number, n: number): string => {
+ return (
+ '0x' +
+ BigNumber.from(num)
+ .toHexString()
+ .slice(2)
+ .padStart(n * 2, '0')
+ )
+}
+
+export const fromHexString = (buf: Buffer | string): Buffer => {
+ if (typeof buf === 'string' && buf.startsWith('0x')) {
+ return Buffer.from(buf.slice(2), 'hex')
+ }
+
+ return Buffer.from(buf)
+}
+
+export const toHexString = (buf: Buffer | string | number | null): string => {
+ if (typeof buf === 'number') {
+ return BigNumber.from(buf).toHexString()
+ } else {
+ return '0x' + fromHexString(buf).toString('hex')
+ }
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/index.ts b/omgx_utilities/fraud-prover/src/utils/index.ts
new file mode 100644
index 000000000000..da23084873a8
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/index.ts
@@ -0,0 +1,10 @@
+export * from './l1-provider-wrapper'
+export * from './l2-provider-wrapper'
+export * from './common'
+export * from './constants'
+export * from './eth-utils'
+export * from './hex-utils'
+export * from './ovm-contracts'
+export * from './ovm-utils'
+export * from './trie-utils'
+export * from './misc'
diff --git a/omgx_utilities/fraud-prover/src/utils/l1-provider-wrapper.ts b/omgx_utilities/fraud-prover/src/utils/l1-provider-wrapper.ts
new file mode 100644
index 000000000000..925499b919c6
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/l1-provider-wrapper.ts
@@ -0,0 +1,506 @@
+import { ethers, Event, Contract, BigNumber, providers } from 'ethers'
+import { MerkleTree } from 'merkletreejs'
+
+import {
+ StateRootBatchHeader,
+ StateRootBatchProof,
+ TransactionBatchHeader,
+ TransactionBatchProof,
+ TransactionChainElement,
+ OvmTransaction,
+} from '../types'
+
+import { fromHexString, toHexString } from './hex-utils'
+
+export class L1ProviderWrapper {
+ private eventCache: {
+ [topic: string]: {
+ startingBlockNumber: number
+ events: ethers.Event[]
+ }
+ } = {}
+
+ constructor(
+ public provider: providers.JsonRpcProvider,
+ public OVM_StateCommitmentChain: Contract,
+ public OVM_CanonicalTransactionChain: Contract,
+ public OVM_ExecutionManager: Contract,
+ public l1StartOffset: number,
+ public l1BlockFinality: number
+ ) {}
+
+ public async findAllEvents(
+ contract: Contract,
+ filter: ethers.EventFilter,
+ fromBlock?: number
+ ): Promise {
+ const cache = this.eventCache[filter.topics[0] as string] || {
+ startingBlockNumber: fromBlock || this.l1StartOffset,
+ events: [],
+ }
+
+ let events: ethers.Event[] = []
+ let startingBlockNumber = cache.startingBlockNumber
+ let latestL1BlockNumber = await this.provider.getBlockNumber()
+
+ while (startingBlockNumber < latestL1BlockNumber) {
+ events = events.concat(
+ await contract.queryFilter(
+ filter,
+ startingBlockNumber,
+ Math.min(
+ startingBlockNumber + 2000,
+ latestL1BlockNumber - this.l1BlockFinality
+ )
+ )
+ )
+
+ if (startingBlockNumber + 2000 > latestL1BlockNumber) {
+ cache.startingBlockNumber = latestL1BlockNumber
+ cache.events = cache.events.concat(events)
+ break
+ }
+
+ startingBlockNumber += 2000
+ latestL1BlockNumber = await this.provider.getBlockNumber()
+ }
+
+ this.eventCache[filter.topics[0] as string] = cache
+
+ return cache.events
+ }
+
+ public async getStateRootBatchHeader(
+ index: number
+ ): Promise {
+ const event = await this._getStateRootBatchEvent(index)
+
+ if (!event) {
+ return
+ }
+
+ return {
+ batchIndex: event.args._batchIndex,
+ batchRoot: event.args._batchRoot,
+ batchSize: event.args._batchSize,
+ prevTotalElements: event.args._prevTotalElements,
+ extraData: event.args._extraData,
+ }
+ }
+
+ public async getStateRoot(index: number): Promise {
+ const stateRootBatchHeader = await this.getStateRootBatchHeader(index)
+
+ if (stateRootBatchHeader === undefined) {
+ return
+ }
+
+ console.log('We found a stateRootBatchHeader on L1:', stateRootBatchHeader)
+
+ const batchStateRoots = await this.getBatchStateRoots(index)
+
+ console.log('We found the batchStateRoots on L1:', batchStateRoots)
+
+ return batchStateRoots[
+ index - stateRootBatchHeader.prevTotalElements.toNumber()
+ ]
+ }
+
+ public async getBatchStateRoots(index: number): Promise {
+ const event = await this._getStateRootBatchEvent(index)
+
+ if (!event) {
+ return
+ }
+
+ const transaction = await this.provider.getTransaction(
+ event.transactionHash
+ )
+
+ const [stateRoots] =
+ this.OVM_StateCommitmentChain.interface.decodeFunctionData(
+ 'appendStateBatch',
+ transaction.data
+ )
+
+ return stateRoots
+ }
+
+ public async getStateRootBatchProof(
+ index: number
+ ): Promise {
+ const batchHeader = await this.getStateRootBatchHeader(index)
+
+ const stateRoots = await this.getBatchStateRoots(index)
+
+ console.log('\nIndex:', index)
+ console.log('Batch Header:', batchHeader)
+ console.log('State roots:', stateRoots)
+
+ const elements = []
+ for (
+ let i = 0;
+ i < Math.pow(2, Math.ceil(Math.log2(stateRoots.length)));
+ i++
+ ) {
+ if (i < stateRoots.length) {
+ elements.push(stateRoots[i])
+ } else {
+ elements.push(ethers.utils.keccak256('0x' + '00'.repeat(32)))
+ }
+ }
+
+ const hash = (el: Buffer | string): Buffer => {
+ return Buffer.from(ethers.utils.keccak256(el).slice(2), 'hex')
+ }
+
+ // State roots aren't hashed since they're already bytes32
+ const leaves = elements.map((element) => {
+ return fromHexString(element)
+ })
+
+ const tree = new MerkleTree(leaves, hash)
+
+ //this might be off by one as well??
+ const batchIndex = index - batchHeader.prevTotalElements.toNumber()
+
+ const treeProof = tree
+ .getProof(leaves[batchIndex], batchIndex)
+ .map((element) => {
+ return element.data
+ })
+
+ return {
+ stateRoot: stateRoots[batchIndex],
+ stateRootBatchHeader: batchHeader,
+ stateRootProof: {
+ index: batchIndex,
+ siblings: treeProof,
+ },
+ }
+ }
+
+ public async getTransactionBatchHeader(
+ index: number
+ ): Promise {
+ const event = await this._getTransactionBatchEvent(index)
+
+ if (!event) {
+ return
+ }
+
+ return {
+ batchIndex: event.args._batchIndex,
+ batchRoot: event.args._batchRoot,
+ batchSize: event.args._batchSize,
+ prevTotalElements: event.args._prevTotalElements,
+ extraData: event.args._extraData,
+ }
+ }
+
+ public async getBatchTransactions(index: number): Promise<
+ {
+ transaction: OvmTransaction
+ transactionChainElement: TransactionChainElement
+ }[]
+ > {
+ const event = await this._getTransactionBatchEvent(index)
+
+ if (!event) {
+ return
+ }
+
+ const emGasLimit =
+ await this.OVM_ExecutionManager.getMaxTransactionGasLimit()
+
+ const transaction = await this.provider.getTransaction(
+ event.transactionHash
+ )
+
+ if ((event as any).isSequencerBatch) {
+ const transactions = []
+
+ const txdata = fromHexString(transaction.data)
+ const shouldStartAtBatch = BigNumber.from(txdata.slice(4, 9))
+ const totalElementsToAppend = BigNumber.from(txdata.slice(9, 12))
+ const numContexts = BigNumber.from(txdata.slice(12, 15))
+
+ let nextTxPointer = 15 + 16 * numContexts.toNumber()
+
+ for (let i = 0; i < numContexts.toNumber(); i++) {
+ const contextPointer = 15 + 16 * i
+
+ const context = {
+ numSequencedTransactions: BigNumber.from(
+ txdata.slice(contextPointer, contextPointer + 3)
+ ),
+ numSubsequentQueueTransactions: BigNumber.from(
+ txdata.slice(contextPointer + 3, contextPointer + 6)
+ ),
+ ctxTimestamp: BigNumber.from(
+ txdata.slice(contextPointer + 6, contextPointer + 11)
+ ),
+ ctxBlockNumber: BigNumber.from(
+ txdata.slice(contextPointer + 11, contextPointer + 16)
+ ),
+ }
+
+ for (let j = 0; j < context.numSequencedTransactions.toNumber(); j++) {
+ const txDataLength = BigNumber.from(
+ txdata.slice(nextTxPointer, nextTxPointer + 3)
+ )
+
+ const txData = txdata.slice(
+ nextTxPointer + 3,
+ nextTxPointer + 3 + txDataLength.toNumber()
+ )
+
+ transactions.push({
+ transaction: {
+ blockNumber: context.ctxBlockNumber.toNumber(),
+ timestamp: context.ctxTimestamp.toNumber(),
+ gasLimit: emGasLimit,
+ entrypoint: '0x4200000000000000000000000000000000000005',
+ l1TxOrigin: '0x' + '00'.repeat(20),
+ l1QueueOrigin: 0,
+ data: toHexString(txData),
+ },
+ transactionChainElement: {
+ isSequenced: true,
+ queueIndex: 0,
+ timestamp: context.ctxTimestamp.toNumber(),
+ blockNumber: context.ctxBlockNumber.toNumber(),
+ txData: toHexString(txData),
+ },
+ })
+
+ nextTxPointer += 3 + txDataLength.toNumber()
+ }
+ }
+
+ return transactions
+ } else {
+ return []
+ }
+ }
+
+ public async getTransactionBatchProof(
+ index: number
+ ): Promise {
+ const batchHeader = await this.getTransactionBatchHeader(index)
+ console.log('\nbatchHeader:', batchHeader)
+
+ const transactions = await this.getBatchTransactions(index)
+ //this will be empty if the transactions were not batch transactions to begin with
+
+ console.log('\nWe found a problem in Batch:', index)
+ console.log('Number of Transactions in this batch:', transactions.length)
+ console.log('Transactions:', transactions)
+
+ const elements = []
+ const n_elements = Math.pow(2, Math.ceil(Math.log2(transactions.length)))
+ console.log('Elements to generate:', n_elements)
+
+ for (let i = 0; i < n_elements; i++) {
+ console.log('Generating element:', i)
+ if (i < transactions.length) {
+ // TODO: FIX - more info would have been great
+ // fix what???
+ const tx = transactions[i]
+ elements.push(
+ `0x01${BigNumber.from(tx.transaction.timestamp)
+ .toHexString()
+ .slice(2)
+ .padStart(64, '0')}${BigNumber.from(tx.transaction.blockNumber)
+ .toHexString()
+ .slice(2)
+ .padStart(64, '0')}${tx.transaction.data.slice(2)}`
+ )
+ } else {
+ elements.push('0x' + '00'.repeat(32))
+ }
+ }
+
+ console.log('Final Elements Array:', elements)
+
+ const hash = (el: Buffer | string): Buffer => {
+ return Buffer.from(ethers.utils.keccak256(el).slice(2), 'hex')
+ }
+
+ const leaves = elements.map((element) => {
+ return hash(element)
+ })
+
+ console.log('leaves:', leaves)
+
+ const tree = new MerkleTree(leaves, hash)
+
+ //this seems to be off by one sometimes?????
+ const batchIndex = index - batchHeader.prevTotalElements.toNumber() - 1 //I HAVE NO IDEA WHY - 1 IS NEEDED HERE? JTL
+
+ console.log('leaves:', leaves)
+ console.log('leaves batchindex?:', leaves[batchIndex])
+
+ if (batchIndex >= transactions.length) {
+ console.log(
+ '\n\n************************\nbatchIndex out of array bounds:',
+ batchIndex
+ )
+ console.log('But transactions.length is only:', transactions.length)
+ console.log('transactions[batchIndex]:', transactions[batchIndex])
+ }
+
+ const treeProof = tree
+ .getProof(leaves[batchIndex], batchIndex)
+ .map((element) => {
+ return element.data
+ })
+
+ //console.log("*****************************\n")
+ //console.log("Transactions",transactions)
+ console.log('batchIndex', index) //the problem is in this batch
+ console.log(
+ 'batchHeader.prevTotalElements.toNumber()',
+ batchHeader.prevTotalElements.toNumber()
+ )
+ console.log('The fraudulant transaction array position:', batchIndex)
+ //console.log("transactions[0]",transactions[0])
+ //console.log("transactions[1]",transactions[1])
+ //console.log("transactions[batchIndex-1]",transactions[batchIndex-1])
+ //console.log("treeProof",treeProof)
+ //console.log("\n***************************")
+
+ return {
+ //transactions sometimes not defined here
+ //due to batchIndex being incorrect - off by one
+ transaction: transactions[batchIndex].transaction,
+ transactionChainElement: transactions[batchIndex].transactionChainElement,
+ transactionBatchHeader: batchHeader,
+ transactionProof: {
+ index: batchIndex,
+ siblings: treeProof,
+ },
+ }
+ }
+
+ private async _getStateRootBatchEvent(index: number): Promise {
+ const events = await this.findAllEvents(
+ this.OVM_StateCommitmentChain,
+ this.OVM_StateCommitmentChain.filters.StateBatchAppended()
+ )
+
+ console.log('All events in the OVM_StateCommitmentChain:', events)
+
+ if (events.length === 0) {
+ return
+ }
+
+ const matching = events.filter((event) => {
+ console.log('index', index)
+ console.log(
+ 'event.args._prevTotalElements.toNumber():',
+ event.args._prevTotalElements.toNumber()
+ )
+ console.log(
+ 'event.args._batchSize.toNumber()',
+ event.args._batchSize.toNumber()
+ )
+
+ return (
+ event.args._prevTotalElements.toNumber() <= index &&
+ event.args._prevTotalElements.toNumber() +
+ event.args._batchSize.toNumber() >
+ index
+ )
+ })
+
+ console.log('This StateRootBatchEvent matches:', matching)
+
+ const deletions = await this.findAllEvents(
+ this.OVM_StateCommitmentChain,
+ this.OVM_StateCommitmentChain.filters.StateBatchDeleted()
+ )
+
+ const results: ethers.Event[] = []
+
+ for (const event of matching) {
+ const wasDeleted = deletions.some((deletion) => {
+ return (
+ deletion.blockNumber > event.blockNumber &&
+ deletion.args._batchIndex.toNumber() ===
+ event.args._batchIndex.toNumber()
+ )
+ })
+
+ if (!wasDeleted) {
+ results.push(event)
+ }
+ }
+
+ if (results.length === 0) {
+ return
+ }
+
+ if (results.length > 2) {
+ throw new Error(
+ `Found more than one batch header for the same state root, this shouldn't happen.`
+ )
+ }
+
+ return results[results.length - 1]
+ }
+
+ private async _getTransactionBatchEvent(
+ index: number
+ ): Promise {
+ const events = await this.findAllEvents(
+ this.OVM_CanonicalTransactionChain,
+ this.OVM_CanonicalTransactionChain.filters.TransactionBatchAppended()
+ )
+
+ if (events.length === 0) {
+ return
+ }
+
+ // tslint:disable-next-line
+ const event = events.find((event) => {
+ return (
+ event.args._prevTotalElements.toNumber() <= index &&
+ event.args._prevTotalElements.toNumber() +
+ event.args._batchSize.toNumber() >
+ index
+ )
+ })
+
+ if (!event) {
+ return
+ }
+
+ const batchSubmissionEvents = await this.findAllEvents(
+ this.OVM_CanonicalTransactionChain,
+ this.OVM_CanonicalTransactionChain.filters.SequencerBatchAppended()
+ )
+
+ if (batchSubmissionEvents.length === 0) {
+ ;(event as any).isSequencerBatch = false
+ } else {
+ // tslint:disable-next-line
+ const batchSubmissionEvent = batchSubmissionEvents.find((event) => {
+ return (
+ event.args._startingQueueIndex.toNumber() <= index &&
+ event.args._startingQueueIndex.toNumber() +
+ event.args._totalElements.toNumber() >
+ index
+ )
+ })
+
+ if (batchSubmissionEvent) {
+ ;(event as any).isSequencerBatch = true
+ } else {
+ ;(event as any).isSequencerBatch = false
+ }
+ }
+
+ return event as any
+ }
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/l2-provider-wrapper.ts b/omgx_utilities/fraud-prover/src/utils/l2-provider-wrapper.ts
new file mode 100644
index 000000000000..a33f301cf075
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/l2-provider-wrapper.ts
@@ -0,0 +1,110 @@
+//import { JsonRpcProvider } from '@ethersproject/providers'
+
+import { providers } from 'ethers'
+import { StateDiffProof } from '../types'
+import { toUnpaddedHexString } from './hex-utils'
+
+export class L2ProviderWrapper {
+ constructor(public provider: providers.JsonRpcProvider) {}
+
+ public async getStateRoot(index: number): Promise {
+ const block = await this.provider.send('eth_getBlockByNumber', [
+ toUnpaddedHexString(index),
+ false,
+ ])
+ return block.stateRoot
+ }
+
+ public async getTransaction(index: number): Promise {
+ const transaction = await this.provider.send(
+ 'eth_getTransactionByBlockNumberAndIndex',
+ [toUnpaddedHexString(index), '0x0']
+ )
+
+ return transaction.input
+ }
+
+ public async getProof(
+ index: number,
+ address: string,
+ slots: string[] = []
+ ): Promise {
+ return this.provider.send('eth_getProof', [
+ address,
+ slots,
+ toUnpaddedHexString(index),
+ ])
+ }
+
+ /*
+{"level":30,"time":1621976500683,"l1StateRoot":"0xbad1bad1bad1bad1bad1bad1bad1bad1bad1bad1bad1bad1bad1bad1bad1bad1","msg":"L1 State Root"}
+{"level":30,"time":1621976500683,"l2StateRoot":"0x701a046ebe69e7a2745a7aeccaa3c7f3d1148cca6c8cbca445736b27f06326ca","msg":"L2 State Root"}
+*/
+
+ public async getStateDiffProof(index: number): Promise {
+ let proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(0),
+ ])
+
+ console.log('proof 0:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(1),
+ ])
+
+ console.log('proof 1:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(2),
+ ])
+
+ console.log('proof 2:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(3),
+ ])
+
+ console.log('proof 3:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(4),
+ ])
+ console.log('proof 4:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(5),
+ ])
+ console.log('proof 5:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(6),
+ ])
+ console.log('proof 6:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(7),
+ ])
+ console.log('proof 7:', proof)
+
+ proof = await this.provider.send('eth_getStateDiffProof', [
+ toUnpaddedHexString(index),
+ ])
+
+ console.log('If this is empty, there is a major problem')
+ console.log('proof:', proof)
+
+ return {
+ header: proof.header,
+ accountStateProofs: proof.accounts,
+ }
+ }
+
+ public async getRollupInfo(): Promise {
+ return this.provider.send('rollup_getInfo', [])
+ }
+
+ public async getAddressManagerAddress(): Promise {
+ const rollupInfo = await this.getRollupInfo()
+ return rollupInfo.addresses.addressResolver
+ }
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/misc.ts b/omgx_utilities/fraud-prover/src/utils/misc.ts
new file mode 100644
index 000000000000..1a5fada81643
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/misc.ts
@@ -0,0 +1,11 @@
+/**
+ * Basic timeout-based async sleep function.
+ * @param ms Number of milliseconds to sleep.
+ */
+export const sleep = async (ms: number): Promise => {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ resolve(null)
+ }, ms)
+ })
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/ovm-contracts.ts b/omgx_utilities/fraud-prover/src/utils/ovm-contracts.ts
new file mode 100644
index 000000000000..5c4af1015c70
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/ovm-contracts.ts
@@ -0,0 +1,44 @@
+import { Contract, providers } from 'ethers'
+import { getContractInterface } from '@eth-optimism/contracts'
+import { ZERO_ADDRESS } from './constants'
+
+export const loadContract = (
+ name: string,
+ address: string,
+ provider: providers.JsonRpcProvider
+): Contract => {
+ return new Contract(address, getContractInterface(name) as any, provider)
+}
+
+export const loadContractFromManager = async (
+ name: string,
+ Lib_AddressManager: Contract,
+ provider: providers.JsonRpcProvider
+): Promise => {
+ const address = await Lib_AddressManager.getAddress(name)
+
+ if (address === ZERO_ADDRESS) {
+ throw new Error(
+ `Lib_AddressManager does not have a record for a contract named: ${name}`
+ )
+ }
+
+ return loadContract(name, address, provider)
+}
+
+export const loadProxyFromManager = async (
+ name: string,
+ proxy: string,
+ Lib_AddressManager: Contract,
+ provider: providers.JsonRpcProvider
+): Promise => {
+ const address = await Lib_AddressManager.getAddress(proxy)
+
+ if (address === ZERO_ADDRESS) {
+ throw new Error(
+ `Lib_AddressManager does not have a record for a contract named: ${proxy}`
+ )
+ }
+
+ return loadContract(name, address, provider)
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/ovm-utils.ts b/omgx_utilities/fraud-prover/src/utils/ovm-utils.ts
new file mode 100644
index 000000000000..8328facc3dc3
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/ovm-utils.ts
@@ -0,0 +1,22 @@
+import { ethers } from 'ethers'
+
+import { OvmTransaction } from '../types'
+import { toUint256, toUint8, toHexString, fromHexString } from './hex-utils'
+
+export const encodeOvmTransaction = (transaction: OvmTransaction): string => {
+ return toHexString(
+ Buffer.concat([
+ fromHexString(toUint256(transaction.timestamp)),
+ fromHexString(toUint256(transaction.blockNumber)),
+ fromHexString(toUint8(transaction.l1QueueOrigin)),
+ fromHexString(transaction.l1TxOrigin),
+ fromHexString(transaction.entrypoint),
+ fromHexString(toUint256(transaction.gasLimit)),
+ fromHexString(transaction.data),
+ ])
+ )
+}
+
+export const hashOvmTransaction = (transaction: OvmTransaction): string => {
+ return ethers.utils.keccak256(encodeOvmTransaction(transaction))
+}
diff --git a/omgx_utilities/fraud-prover/src/utils/trie-utils.ts b/omgx_utilities/fraud-prover/src/utils/trie-utils.ts
new file mode 100644
index 000000000000..c9e336d932b1
--- /dev/null
+++ b/omgx_utilities/fraud-prover/src/utils/trie-utils.ts
@@ -0,0 +1,31 @@
+import { BaseTrie } from 'merkle-patricia-tree'
+import { fromHexString } from './hex-utils'
+
+export const makeTrieFromProofs = (proofs: string[][]): Promise => {
+ if (
+ proofs.length === 0 ||
+ proofs.every((proof) => {
+ return proof.length === 0
+ })
+ ) {
+ return BaseTrie.fromProof([])
+ }
+
+ const nodes = proofs.reduce(
+ // tslint:disable-next-line
+ (nodes, proof) => {
+ if (proof.length > 1) {
+ return nodes.concat(proof.slice(1))
+ } else {
+ return nodes
+ }
+ },
+ [proofs[0][0]]
+ )
+
+ return BaseTrie.fromProof(
+ nodes.map((node) => {
+ return fromHexString(node)
+ })
+ )
+}
diff --git a/omgx_utilities/fraud-prover/test/a_setup.spec.ts b/omgx_utilities/fraud-prover/test/a_setup.spec.ts
new file mode 100644
index 000000000000..4001ec9070ab
--- /dev/null
+++ b/omgx_utilities/fraud-prover/test/a_setup.spec.ts
@@ -0,0 +1,273 @@
+import { expect } from 'chai'
+import {
+ Contract,
+ ContractFactory,
+ BigNumber,
+ Wallet,
+ utils,
+ providers,
+} from 'ethers'
+import { Direction } from './shared/watcher-utils'
+
+import L1ERC20Json from '../artifacts/contracts/ERC20.sol/ERC20.json'
+import L1ERC20GatewayJson from '../artifacts/contracts/L1ERC20Gateway.sol/L1ERC20Gateway.json'
+import L2DepositedERC20Json from '../artifacts-ovm/contracts/L2DepositedERC20.sol/L2DepositedERC20.json'
+
+import { OptimismEnv } from './shared/env'
+
+import * as fs from 'fs'
+
+describe('System setup', async () => {
+ let Factory__L1ERC20: ContractFactory
+ let Factory__L2DepositedERC20: ContractFactory
+ let Factory__L1ERC20Gateway: ContractFactory
+
+ let L1ERC20: Contract
+ let L2DepositedERC20: Contract
+ let L1ERC20Gateway: Contract
+
+ let env: OptimismEnv
+
+ //Test ERC20
+ const initialAmount = utils.parseEther('10000000000')
+ const tokenName = 'OMGX Test'
+ const tokenDecimals = 18
+ const tokenSymbol = 'OMG'
+
+ before(async () => {
+ env = await OptimismEnv.new()
+
+ Factory__L1ERC20 = new ContractFactory(
+ L1ERC20Json.abi,
+ L1ERC20Json.bytecode,
+ env.bobl1Wallet
+ )
+
+ Factory__L2DepositedERC20 = new ContractFactory(
+ L2DepositedERC20Json.abi,
+ L2DepositedERC20Json.bytecode,
+ env.bobl2Wallet
+ )
+
+ Factory__L1ERC20Gateway = new ContractFactory(
+ L1ERC20GatewayJson.abi,
+ L1ERC20GatewayJson.bytecode,
+ env.bobl1Wallet
+ )
+ })
+
+ before(async () => {
+ //Mint a new token on L1 and set up the L1 and L2 infrastructure
+ // [initialSupply, name, decimals, symbol]
+ // this is owned by bobl1Wallet
+ L1ERC20 = await Factory__L1ERC20.deploy(
+ initialAmount,
+ tokenName,
+ tokenDecimals,
+ tokenSymbol
+ )
+ await L1ERC20.deployTransaction.wait()
+ console.log('L1ERC20 deployed to:', L1ERC20.address)
+
+ //Set up things on L2 for this new token
+ // [l2MessengerAddress, name, symbol]
+ L2DepositedERC20 = await Factory__L2DepositedERC20.deploy(
+ env.watcher.l2.messengerAddress,
+ tokenName,
+ tokenSymbol,
+ { gasLimit: 800000, gasPrice: 0 }
+ )
+ await L2DepositedERC20.deployTransaction.wait()
+ console.log('L2DepositedERC20 deployed to:', L2DepositedERC20.address)
+
+ //Deploy a gateway for the new token
+ // [L1_ERC20.address, OVM_L2DepositedERC20.address, l1MessengerAddress]
+ L1ERC20Gateway = await Factory__L1ERC20Gateway.deploy(
+ L1ERC20.address,
+ L2DepositedERC20.address,
+ env.watcher.l1.messengerAddress
+ )
+ await L1ERC20Gateway.deployTransaction.wait()
+ console.log('L1ERC20Gateway deployed to:', L1ERC20Gateway.address)
+
+ //Initialize the contracts for the new token
+ const initL2 = await L2DepositedERC20.init(L1ERC20Gateway.address, {
+ gasLimit: 800000,
+ gasPrice: 0,
+ })
+ await initL2.wait()
+ console.log('L2 ERC20 initialized:', initL2.hash)
+ })
+
+ it('Bob Approve and Deposit ERC20 from L1 to L2', async () => {
+ const depositL2ERC20Amount = utils.parseEther('150')
+ const preL1ERC20Balance = await L1ERC20.balanceOf(env.bobl1Wallet.address)
+ const preL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.bobl2Wallet.address
+ )
+
+ console.log(' Bob Depositing L1 ERC20 to L2...')
+ console.log(' On L1, Bob has:', preL1ERC20Balance)
+ console.log(' On L2, Bob has:', preL2ERC20Balance)
+
+ const approveL1ERC20TX = await L1ERC20.approve(
+ L1ERC20Gateway.address,
+ depositL2ERC20Amount
+ )
+ await approveL1ERC20TX.wait()
+
+ const { tx, receipt } = await env.waitForXDomainTransaction(
+ L1ERC20Gateway.deposit(depositL2ERC20Amount),
+ Direction.L1ToL2
+ )
+
+ const l1FeePaid = receipt.gasUsed.mul(tx.gasPrice)
+ const postL1ERC20Balance = await L1ERC20.balanceOf(env.bobl1Wallet.address)
+ const postL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.bobl2Wallet.address
+ )
+
+ console.log(' On L1, Bob now has:', postL1ERC20Balance)
+ console.log(' On L2, Bob now has:', postL2ERC20Balance)
+
+ expect(preL1ERC20Balance).to.deep.eq(
+ postL1ERC20Balance.add(depositL2ERC20Amount)
+ )
+ expect(preL2ERC20Balance).to.deep.eq(
+ postL2ERC20Balance.sub(depositL2ERC20Amount)
+ )
+ })
+
+ it('should transfer ERC20 token to Alice and Fraud', async () => {
+ const transferL2ERC20Amount = utils.parseEther('10')
+
+ const preBobL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.bobl2Wallet.address
+ )
+ const preAliceL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.alicel2Wallet.address
+ )
+ const preFraudL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.fraudl2Wallet.address
+ )
+
+ const tranferToAliceTX = await L2DepositedERC20.transfer(
+ env.alicel2Wallet.address,
+ transferL2ERC20Amount,
+ { gasLimit: 800000, gasPrice: 0 }
+ )
+ await tranferToAliceTX.wait()
+
+ const tranferToFraudTX = await L2DepositedERC20.transfer(
+ env.fraudl2Wallet.address,
+ transferL2ERC20Amount,
+ { gasLimit: 800000, gasPrice: 0 }
+ )
+ await tranferToFraudTX.wait()
+
+ const postBobL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.bobl2Wallet.address
+ )
+ const postAliceL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.alicel2Wallet.address
+ )
+ const postFraudL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.fraudl2Wallet.address
+ )
+
+ //because i'm sending the same amount out, twice....
+ expect(preBobL2ERC20Balance).to.deep.eq(
+ postBobL2ERC20Balance
+ .add(transferL2ERC20Amount)
+ .add(transferL2ERC20Amount)
+ )
+
+ expect(preAliceL2ERC20Balance).to.deep.eq(
+ postAliceL2ERC20Balance.sub(transferL2ERC20Amount)
+ )
+
+ expect(preFraudL2ERC20Balance).to.deep.eq(
+ postFraudL2ERC20Balance.sub(transferL2ERC20Amount)
+ )
+ })
+
+ it('should transfer ERC20 token from Alice to Fraud', async () => {
+ const transferL2ERC20Amount = utils.parseEther('3')
+
+ const preAliceL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.alicel2Wallet.address
+ )
+ const preFraudL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.fraudl2Wallet.address
+ )
+
+ console.log(' On L2, Alice has:', preAliceL2ERC20Balance.toString())
+ console.log(' On L2, Fraud has:', preFraudL2ERC20Balance.toString())
+
+ const tranferToFraudTX = await L2DepositedERC20.connect(
+ env.alicel2Wallet
+ ).transfer(env.fraudl2Wallet.address, transferL2ERC20Amount, {
+ gasLimit: 800000,
+ gasPrice: 0,
+ })
+ await tranferToFraudTX.wait()
+
+ const postAliceL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.alicel2Wallet.address
+ )
+ const postFraudL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.fraudl2Wallet.address
+ )
+
+ console.log(' On L2, Alice now has:', postAliceL2ERC20Balance.toString())
+ console.log(' On L2, Fraud now has:', postFraudL2ERC20Balance.toString())
+
+ expect(postAliceL2ERC20Balance).to.deep.eq(
+ preAliceL2ERC20Balance.sub(transferL2ERC20Amount)
+ )
+
+ expect(postFraudL2ERC20Balance).to.deep.eq(
+ preFraudL2ERC20Balance.add(transferL2ERC20Amount)
+ )
+ })
+
+ it('should transfer ERC20 token from Fraud to Bob and commit fraud', async () => {
+ const transferL2ERC20Amount = utils.parseEther('1')
+
+ const preBobL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.bobl2Wallet.address
+ )
+ const preFraudL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.fraudl2Wallet.address
+ )
+
+ console.log(' On L2, Bob has:', preBobL2ERC20Balance.toString())
+ console.log(' On L2, Fraud has:', preFraudL2ERC20Balance.toString())
+
+ const tranferToFraudTX = await L2DepositedERC20.connect(
+ env.fraudl2Wallet
+ ).transfer(env.bobl2Wallet.address, transferL2ERC20Amount, {
+ gasLimit: 800000,
+ gasPrice: 0,
+ })
+ await tranferToFraudTX.wait()
+
+ const postBobL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.bobl2Wallet.address
+ )
+ const postFraudL2ERC20Balance = await L2DepositedERC20.balanceOf(
+ env.fraudl2Wallet.address
+ )
+
+ console.log(' On L2, Bob now has:', postBobL2ERC20Balance.toString())
+ console.log(' On L2, Fraud now has:', postFraudL2ERC20Balance.toString())
+
+ expect(postBobL2ERC20Balance).to.deep.eq(
+ preBobL2ERC20Balance.add(transferL2ERC20Amount)
+ )
+
+ expect(postFraudL2ERC20Balance).to.deep.eq(
+ preFraudL2ERC20Balance.sub(transferL2ERC20Amount)
+ )
+ })
+})
diff --git a/omgx_utilities/fraud-prover/test/shared/env.ts b/omgx_utilities/fraud-prover/test/shared/env.ts
new file mode 100644
index 000000000000..4c50a3f12afa
--- /dev/null
+++ b/omgx_utilities/fraud-prover/test/shared/env.ts
@@ -0,0 +1,128 @@
+import {
+ getContractInterface,
+ getContractFactory,
+} from '@eth-optimism/contracts'
+import { Contract, utils, Wallet } from 'ethers'
+import { Watcher } from './watcher'
+
+import {
+ getAddressManager,
+ l1Provider,
+ l2Provider,
+ bobl1Wallet,
+ bobl2Wallet,
+ getL2ETHGateway,
+ getL1ETHGateway,
+ alicel1Wallet,
+ alicel2Wallet,
+ fraudl1Wallet,
+ fraudl2Wallet,
+} from './utils'
+
+import {
+ initWatcher,
+ CrossDomainMessagePair,
+ Direction,
+ waitForXDomainTransaction,
+} from './watcher-utils'
+
+import * as fs from 'fs'
+
+import { TransactionResponse } from '@ethersproject/providers'
+
+/// Helper class for instantiating a test environment with a funded account
+export class OptimismEnv {
+ // L1 Contracts
+ addressManager: Contract
+ L1ETHGateway: Contract
+ l1Messenger: Contract
+ l1MessengerAddress: String
+ ctc: Contract
+
+ l2Provider
+
+ // L2 Contracts
+ L2ETHGateway: Contract
+ l2Messenger: Contract
+
+ // The L1 <> L2 State watcher
+ watcher: Watcher
+
+ // The wallets
+ bobl1Wallet: Wallet
+ bobl2Wallet: Wallet
+
+ alicel2Wallet: Wallet
+ alicel1Wallet: Wallet
+
+ fraudl2Wallet: Wallet
+ fraudl1Wallet: Wallet
+
+ constructor(args: any) {
+ this.addressManager = args.addressManager
+ this.L1ETHGateway = args.L1ETHGateway
+ this.l1Messenger = args.l1Messenger
+ this.l1MessengerAddress = args.l1MessengerAddress
+ this.L2ETHGateway = args.L2ETHGateway
+ this.l2Messenger = args.l2Messenger
+ this.watcher = args.watcher
+ this.bobl1Wallet = args.bobl1Wallet
+ this.bobl2Wallet = args.bobl2Wallet
+ this.alicel1Wallet = args.alicel1Wallet
+ this.alicel2Wallet = args.alicel2Wallet
+ this.fraudl1Wallet = args.fraudl1Wallet
+ this.fraudl2Wallet = args.fraudl2Wallet
+ this.l2Provider = args.l2Provider
+ this.ctc = args.ctc
+ }
+
+ static async new(): Promise {
+ const addressManager = getAddressManager(bobl1Wallet)
+ const watcher = await initWatcher(l1Provider, l2Provider, addressManager)
+
+ const L1ETHGateway = await getL1ETHGateway(bobl1Wallet, addressManager)
+ const L2ETHGateway = getL2ETHGateway(bobl2Wallet)
+
+ const l1Messenger = getContractFactory('iOVM_L1CrossDomainMessenger')
+ .connect(bobl1Wallet)
+ .attach(watcher.l1.messengerAddress)
+
+ const l1MessengerAddress = l1Messenger.address
+
+ const l2Messenger = getContractFactory('iOVM_L2CrossDomainMessenger')
+ .connect(bobl2Wallet)
+ .attach(watcher.l2.messengerAddress)
+
+ const ctcAddress = await addressManager.getAddress(
+ 'OVM_CanonicalTransactionChain'
+ )
+ const ctc = getContractFactory('OVM_CanonicalTransactionChain')
+ .connect(bobl1Wallet)
+ .attach(ctcAddress)
+
+ return new OptimismEnv({
+ addressManager,
+ L1ETHGateway,
+ ctc,
+ l1Messenger,
+ l1MessengerAddress,
+ L2ETHGateway,
+ l2Messenger,
+ watcher,
+ bobl1Wallet,
+ bobl2Wallet,
+ alicel1Wallet,
+ alicel2Wallet,
+ fraudl1Wallet,
+ fraudl2Wallet,
+ l2Provider,
+ })
+ }
+
+ async waitForXDomainTransaction(
+ tx: Promise | TransactionResponse,
+ direction: Direction
+ ): Promise {
+ return waitForXDomainTransaction(this.watcher, tx, direction)
+ }
+}
diff --git a/omgx_utilities/fraud-prover/test/shared/utils.ts b/omgx_utilities/fraud-prover/test/shared/utils.ts
new file mode 100644
index 000000000000..15360085f6af
--- /dev/null
+++ b/omgx_utilities/fraud-prover/test/shared/utils.ts
@@ -0,0 +1,89 @@
+/* eslint @typescript-eslint/no-var-requires: 0 */
+
+import { injectL2Context } from '@eth-optimism/core-utils'
+import {
+ getContractInterface,
+ getContractFactory,
+} from '@eth-optimism/contracts'
+import { Contract, Wallet, constants, providers, BigNumber } from 'ethers'
+
+require('dotenv').config()
+
+export const GWEI = BigNumber.from(0)
+
+// The hardhat instance
+//const l1HttpPort = 9545
+export const l1Provider = new providers.JsonRpcProvider(
+ process.env.L1_NODE_WEB3_URL
+)
+export const l2Provider = new providers.JsonRpcProvider(
+ process.env.L2_NODE_WEB3_URL
+)
+// export const l2Provider = injectL2Context(l2P)
+
+// An account for testing which is funded on L1
+export const bobl1Wallet = new Wallet(
+ process.env.TEST_PRIVATE_KEY_1,
+ l1Provider
+)
+export const bobl2Wallet = bobl1Wallet.connect(l2Provider)
+
+// Another test user with some eth
+export const alicel1Wallet = new Wallet(process.env.TEST_PRIVATE_KEY_2).connect(
+ l1Provider
+)
+export const alicel2Wallet = new Wallet(process.env.TEST_PRIVATE_KEY_2).connect(
+ l2Provider
+)
+
+// Any transactions from this wallet will trigger a fake state root
+export const fraudl1Wallet = new Wallet(process.env.FRAUD_PRIVATE_KEY).connect(
+ l1Provider
+)
+export const fraudl2Wallet = new Wallet(process.env.FRAUD_PRIVATE_KEY).connect(
+ l2Provider
+)
+
+// Predeploys
+export const PROXY_SEQUENCER_ENTRYPOINT_ADDRESS =
+ '0x4200000000000000000000000000000000000004'
+export const OVM_ETH_ADDRESS = '0x4200000000000000000000000000000000000006'
+export const Proxy__OVM_L2CrossDomainMessenger =
+ '0x4200000000000000000000000000000000000007'
+export const addressManagerAddress = process.env.ETH1_ADDRESS_RESOLVER_ADDRESS
+
+export const getAddressManager = (provider: any) => {
+ return getContractFactory('Lib_AddressManager')
+ .connect(provider)
+ .attach(addressManagerAddress) as any
+}
+
+// Gets the gateway using the proxy if available
+export const getL1ETHGateway = async (
+ wallet: Wallet,
+ AddressManager: Contract
+) => {
+ const l1GatewayInterface = getContractInterface('OVM_L1ETHGateway')
+ const ProxyGatewayAddress = await AddressManager.getAddress(
+ 'Proxy__OVM_L1ETHGateway'
+ )
+
+ const L1ETHGateway = new Contract(
+ ProxyGatewayAddress,
+ l1GatewayInterface as any,
+ wallet
+ )
+
+ return L1ETHGateway
+}
+
+export const getL2ETHGateway = (wallet: Wallet) => {
+ const OVM_ETH = new Contract(
+ OVM_ETH_ADDRESS,
+ getContractInterface('OVM_ETH') as any,
+ wallet
+ )
+ return OVM_ETH
+}
+
+export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))
diff --git a/omgx_utilities/fraud-prover/test/shared/watcher-utils.ts b/omgx_utilities/fraud-prover/test/shared/watcher-utils.ts
new file mode 100644
index 000000000000..cba69e0f1f79
--- /dev/null
+++ b/omgx_utilities/fraud-prover/test/shared/watcher-utils.ts
@@ -0,0 +1,72 @@
+import {
+ JsonRpcProvider,
+ TransactionReceipt,
+ TransactionResponse,
+} from '@ethersproject/providers'
+import { Watcher } from './watcher'
+import { Contract, Transaction } from 'ethers'
+
+export const initWatcher = async (
+ l1Provider: JsonRpcProvider,
+ l2Provider: JsonRpcProvider,
+ AddressManager: Contract
+) => {
+ const l1MessengerAddress = await AddressManager.getAddress(
+ 'Proxy__OVM_L1CrossDomainMessenger'
+ )
+
+ return new Watcher({
+ l1: {
+ provider: l1Provider,
+ messengerAddress: l1MessengerAddress,
+ },
+ l2: {
+ provider: l2Provider,
+ messengerAddress: '0x4200000000000000000000000000000000000007',
+ },
+ })
+}
+
+export interface CrossDomainMessagePair {
+ tx: Transaction
+ receipt: TransactionReceipt
+ remoteReceipt: TransactionReceipt
+}
+
+export enum Direction {
+ L1ToL2,
+ L2ToL1,
+}
+
+export const waitForXDomainTransaction = async (
+ watcher: Watcher,
+ tx: Promise | TransactionResponse,
+ direction: Direction
+): Promise => {
+ // await it if needed
+ tx = await tx
+
+ // get the receipt and the full transaction
+ const receipt = await tx.wait()
+
+ let remoteReceipt: TransactionReceipt
+ if (direction === Direction.L1ToL2) {
+ // DEPOSIT
+ const [xDomainMsgHash] = await watcher.getMessageHashesFromL1Tx(tx.hash)
+ // console.log(' Got L1->L2 message hash', xDomainMsgHash)
+ remoteReceipt = await watcher.getL2TransactionReceipt(xDomainMsgHash)
+ // console.log(' Completed Deposit! L2 tx hash:', remoteReceipt.transactionHash)
+ } else {
+ // WITHDRAWAL
+ const [xDomainMsgHash] = await watcher.getMessageHashesFromL2Tx(tx.hash)
+ // console.log(' Got L2->L1 message hash', xDomainMsgHash)
+ remoteReceipt = await watcher.getL1TransactionReceipt(xDomainMsgHash)
+ // console.log(' Completed Withdrawal! L1 tx hash:', remoteReceipt.transactionHash)
+ }
+
+ return {
+ tx,
+ receipt,
+ remoteReceipt,
+ }
+}
diff --git a/omgx_utilities/fraud-prover/test/shared/watcher.ts b/omgx_utilities/fraud-prover/test/shared/watcher.ts
new file mode 100644
index 000000000000..6db77acf0a1e
--- /dev/null
+++ b/omgx_utilities/fraud-prover/test/shared/watcher.ts
@@ -0,0 +1,127 @@
+/* External Imports */
+import { ethers } from 'ethers'
+import { Provider, TransactionReceipt } from '@ethersproject/abstract-provider'
+
+export interface Layer {
+ provider: Provider
+ messengerAddress: string
+}
+
+export interface WatcherOptions {
+ l1: Layer
+ l2: Layer
+}
+
+export class Watcher {
+ public NUM_BLOCKS_TO_FETCH: number = 10000
+ public l1: Layer
+ public l2: Layer
+
+ constructor(opts: WatcherOptions) {
+ this.l1 = opts.l1
+ this.l2 = opts.l2
+ }
+
+ public async getMessageHashesFromL1Tx(l1TxHash: string): Promise {
+ return this.getMessageHashesFromTx(this.l1, l1TxHash)
+ }
+ public async getMessageHashesFromL2Tx(l2TxHash: string): Promise {
+ return this.getMessageHashesFromTx(this.l2, l2TxHash)
+ }
+
+ public async getL1TransactionReceipt(
+ l2ToL1MsgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ return this.getTransactionReceipt(this.l1, l2ToL1MsgHash, pollForPending)
+ }
+
+ public async getL2TransactionReceipt(
+ l1ToL2MsgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ return this.getTransactionReceipt(this.l2, l1ToL2MsgHash, pollForPending)
+ }
+
+ public async getMessageHashesFromTx(
+ layer: Layer,
+ txHash: string
+ ): Promise {
+ const receipt = await layer.provider.getTransactionReceipt(txHash)
+
+ if (!receipt) {
+ return []
+ }
+
+ const msgHashes = []
+
+ for (const log of receipt.logs) {
+ if (
+ log.address === layer.messengerAddress &&
+ log.topics[0] === ethers.utils.id('SentMessage(bytes)')
+ ) {
+ const [message] = ethers.utils.defaultAbiCoder.decode(
+ ['bytes'],
+ log.data
+ )
+ msgHashes.push(ethers.utils.solidityKeccak256(['bytes'], [message]))
+ }
+ }
+ return msgHashes
+ }
+
+ public async getTransactionReceipt(
+ layer: Layer,
+ msgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ // console.log(" Watcher::getTransactionReceipt")
+
+ const blockNumber = await layer.provider.getBlockNumber()
+ const startingBlock = Math.max(blockNumber - this.NUM_BLOCKS_TO_FETCH, 0)
+
+ const filter = {
+ address: layer.messengerAddress,
+ topics: [ethers.utils.id(`RelayedMessage(bytes32)`)],
+ fromBlock: startingBlock,
+ }
+
+ const logs = await layer.provider.getLogs(filter)
+
+ const matches = logs.filter((log: any) => log.data === msgHash)
+
+ // Message was relayed in the past
+ if (matches.length > 0) {
+ if (matches.length > 1) {
+ throw Error(
+ ' Found multiple transactions relaying the same message hash.'
+ )
+ }
+ return layer.provider.getTransactionReceipt(matches[0].transactionHash)
+ }
+
+ if (!pollForPending) {
+ return Promise.resolve(undefined)
+ }
+
+ // Message has yet to be relayed, poll until it is found
+ return new Promise(async (resolve, reject) => {
+ // console.log(" Watcher polling::layer.provider.getTransactionReceipt pre filter")
+ //listener that triggers on filter event
+ layer.provider.on(filter, async (log: any) => {
+ // console.log(" Watcher polling::layer.provider.getTransactionReceipt post filter")
+ if (log.data === msgHash) {
+ try {
+ const txReceipt = await layer.provider.getTransactionReceipt(
+ log.transactionHash
+ )
+ layer.provider.off(filter)
+ resolve(txReceipt)
+ } catch (e) {
+ reject(e)
+ }
+ }
+ })
+ })
+ }
+}
diff --git a/omgx_utilities/fraud-prover/tsconfig.build.json b/omgx_utilities/fraud-prover/tsconfig.build.json
new file mode 100644
index 000000000000..d281af932ef1
--- /dev/null
+++ b/omgx_utilities/fraud-prover/tsconfig.build.json
@@ -0,0 +1,12 @@
+{
+ "extends": "../../../tsconfig.build.json",
+
+ "compilerOptions": {
+ "rootDir": "./src",
+ "outDir": "./dist"
+ },
+
+ "include": [
+ "src/**/*"
+ ]
+}
\ No newline at end of file
diff --git a/omgx_utilities/fraud-prover/tsconfig.json b/omgx_utilities/fraud-prover/tsconfig.json
new file mode 100644
index 000000000000..ce4dd793f441
--- /dev/null
+++ b/omgx_utilities/fraud-prover/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../../tsconfig.json",
+
+ "compilerOptions": {
+ "resolveJsonModule": true
+ }
+}
diff --git a/omgx_utilities/fraud-prover/tslint.json b/omgx_utilities/fraud-prover/tslint.json
new file mode 100644
index 000000000000..02a70d789d7f
--- /dev/null
+++ b/omgx_utilities/fraud-prover/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../../tslint.base.json"
+}
diff --git a/omgx_utilities/fraud-prover/up_local.sh b/omgx_utilities/fraud-prover/up_local.sh
new file mode 100755
index 000000000000..7e96a9bc1b50
--- /dev/null
+++ b/omgx_utilities/fraud-prover/up_local.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Start Rinkeby services
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
+DOCKERFILE="docker-compose.yml"
+
+SERVICES=$(docker-compose \
+ -f $DIR/$DOCKERFILE \
+ -f $DIR/docker-compose-local.env.yml \
+ config --services \
+ | tr '\n' ' ')
+
+docker-compose \
+ -f $DIR/$DOCKERFILE \
+ -f $DIR/docker-compose-local.env.yml \
+ down -v --remove-orphans
+
+docker-compose \
+ -f $DIR/$DOCKERFILE \
+ -f $DIR/docker-compose-local.env.yml \
+ up $SERVICES
diff --git a/omgx_utilities/fraud-prover/wait-for-l1-and-l2.sh b/omgx_utilities/fraud-prover/wait-for-l1-and-l2.sh
new file mode 100644
index 000000000000..7832617d872e
--- /dev/null
+++ b/omgx_utilities/fraud-prover/wait-for-l1-and-l2.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+cmd="$@"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+RETRIES=${RETRIES:-50}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L1_NODE_WEB3_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $L1_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $L1_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $L1_NODE_WEB3_URL"
+
+RETRIES=${RETRIES:-50}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $L2_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $L2_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Verifier Node at $L2_NODE_WEB3_URL"
+
+if [ ! -z "$DEPLOYER_HTTP" ]; then
+ RETRIES=${RETRIES:-50}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$DEPLOYER_HTTP/addresses.json"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $DEPLOYER_HTTP to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+ ADDRESS_MANAGER_ADDRESS=$(curl --silent $DEPLOYER_HTTP/addresses.json | jq -r .AddressManager)
+ exec env \
+ ADDRESS_MANAGER_ADDRESS=$ADDRESS_MANAGER_ADDRESS \
+ L1_BLOCK_OFFSET=$L1_BLOCK_OFFSET \
+ $cmd
+else
+ exec $cmd
+fi
\ No newline at end of file
diff --git a/ops/README.md b/ops/README.md
index df841dfc61ea..a367997cebcb 100644
--- a/ops/README.md
+++ b/ops/README.md
@@ -14,6 +14,8 @@ The base `docker-compose.yml` file will start the required components for a full
Supplementing the base configuration is an additional metric enabling file, `docker-compose-metrics.yml`. Adding this configuration to the stack will enable metric emission for l2geth and start grafana (for metrics visualisation) and influxdb (for metric collection) instances.
+Also available for testing is the `rpc-proxy` service in the `docker-compose-rpc-proxy.yml` file. It can be used to restrict what RPC methods are allowed to the Sequencer.
+
The base stack can be started and stopped with a command like this (there is no need to specify the default docker-compose.yml)
```
docker-compose \
@@ -28,6 +30,13 @@ docker-compose \
up --build --detach
```
+Optionally, run a verifier along the rest of the stack. Run a replica with the same command by switching the service name!
+```
+docker-compose up --scale \
+ verifier=1 \
+ --build --detach
+```
+
A Makefile has been provided for convience. The following targets are available.
- make up
- make down
diff --git a/ops/docker-compose-metrics.yml b/ops/docker-compose-metrics.yml
index 3bd70a7d9e93..466024556811 100644
--- a/ops/docker-compose-metrics.yml
+++ b/ops/docker-compose-metrics.yml
@@ -4,6 +4,12 @@ services:
l2geth:
command: ["--metrics", "--metrics.influxdb", "--metrics.influxdb.endpoint", "http://influxdb:8086", "--metrics.influxdb.database", "l2geth"]
+ batch_submitter:
+ environment:
+ BATCH_SUBMITTER_RUN_METRICS_SERVER: "true"
+ BATCH_SUBMITTER_METRICS_PORT: 7300
+ BATCH_SUBMITTER_METRICS_HOSTNAME: 0.0.0.0
+
grafana:
image: grafana/grafana:7.5.5
env_file:
diff --git a/ops/docker-compose-omgx-services.yml b/ops/docker-compose-omgx-services.yml
new file mode 100644
index 000000000000..d1ed6a914df3
--- /dev/null
+++ b/ops/docker-compose-omgx-services.yml
@@ -0,0 +1,107 @@
+version: "3"
+
+services:
+
+# base service builder
+
+ omgx_builder:
+ image: omgx/omgx_builder
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.omgx_monorepo
+
+# deploys OMGX contracts and serves contract addresses
+
+ omgx_deployer:
+ depends_on:
+ - l1_chain
+ - deployer
+ - l2geth
+ image: omgx/omgx_deployer
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.omgx_deployer
+ environment:
+ SERVE_ONLY: 0 #if EQ 1, then do not deploy any contracts
+ IF_SERVE_ONLY_EQ_1_THEN_SERVE: rinkeby #e.g. serve whatever is in /deployments/rinkeby
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ L2_NODE_WEB3_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ # DO NOT use in production
+ DEPLOYER_PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
+ RETRIES: 70
+ ports:
+ # expose the service to the host for getting the contract addrs
+ - ${OMGX_DEPLOYER_PORT:-8078}:8079
+
+# a second relay system for messages that need to get to L1 quickly
+# NOTE - all withdrawal messenges use the standard relayer with its 7 day window
+
+ omgx_message-relayer-fast:
+ depends_on:
+ - l1_chain
+ - deployer
+ - omgx_deployer
+ - l2geth
+ image: omgx/omgx_message-relayer-fast
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.omgx_message-relayer-fast
+ environment:
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ L2_NODE_WEB3_URL: http://l2geth:8545
+ # This is who pays for the fast message relayer
+ L1_WALLET_KEY: "0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0"
+ URL: http://deployer:8081/addresses.json
+ OMGX_URL: http://omgx_deployer:8079/addresses.json
+ POLLING_INTERVAL: 1500
+ GET_LOGS_INTERVAL: 500
+ FILTER_ENDPOINT: http://omgx_deployer:8079/addresses.json
+ FILTER_POLLING_INTERVAL: 30000
+ RETRIES: 70
+
+# and, tests for all the OMGX-specific services
+
+ omgx_test_contracts:
+ image: omgx/omgx_builder
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.omgx_monorepo
+ entrypoint:
+ - "/bin/sh"
+ - -ecx
+ - |
+ cd /optimism/packages/omgx/contracts
+ yarn test:integration
+ environment:
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ L2_NODE_WEB3_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ OMGX_URL: http://omgx_deployer:8079/addresses.json
+ TEST_PRIVATE_KEY_1: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
+ TEST_PRIVATE_KEY_2: "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba"
+ TEST_PRIVATE_KEY_3: "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e"
+
+ omgx_test_relayer:
+ image: omgx/omgx_builder
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.omgx_monorepo
+ entrypoint:
+ - "/bin/sh"
+ - -ecx
+ - |
+ cd /optimism/packages/omgx/message-relayer-fast
+ yarn test:integration
+ environment:
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ L2_NODE_WEB3_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ OMGX_URL: http://omgx_deployer:8079/addresses.json
+ TEST_PRIVATE_KEY_1: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
+ TEST_PRIVATE_KEY_2: "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba"
+ TEST_PRIVATE_KEY_3: "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e"
diff --git a/ops/docker-compose-omgx.yml b/ops/docker-compose-omgx.yml
new file mode 100644
index 000000000000..89747738991f
--- /dev/null
+++ b/ops/docker-compose-omgx.yml
@@ -0,0 +1,180 @@
+version: "3"
+
+services:
+
+ # base service builder
+ builder:
+ image: omgx/builder:latest
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.monorepo
+
+ # this is a helper service used because there's no official hardhat image
+ l1_chain:
+ image: omgx/hardhat:latest
+ build:
+ context: ./docker/hardhat
+ dockerfile: Dockerfile
+ ports:
+ # expose the service to the host for integration testing
+ - ${L1CHAIN_HTTP_PORT:-9545}:8545
+
+ deployer:
+ depends_on:
+ - l1_chain
+ image: omgx/deployer:latest
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.deployer
+ entrypoint: ./deployer.sh
+ environment:
+ FRAUD_PROOF_WINDOW_SECONDS: 0
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ CHAIN_ID: 28
+ # these keys are hardhat's first accounts, DO NOT use in production
+ DEPLOYER_PRIVATE_KEY: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
+ SEQUENCER_PRIVATE_KEY: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d'
+ PROPOSER_PRIVATE_KEY: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a'
+ RELAYER_PRIVATE_KEY: '0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97'
+ # skip compilation when run in docker-compose, since the contracts
+ # were already compiled in the builder step
+ NO_COMPILE: 1
+ ports:
+ # expose the service to the host for getting the contract addrs
+ - ${DEPLOYER_PORT:-8080}:8081
+
+ dtl:
+ depends_on:
+ - l1_chain
+ - deployer
+ - l2geth
+ image: omgx/data-transport-layer:latest
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.data-transport-layer
+ # override with the dtl script and the env vars required for it
+ entrypoint: ./dtl.sh
+ env_file:
+ - ./envs/dtl.env
+ # set the rest of the env vars for the network whcih do not
+ # depend on the docker-compose setup
+ environment:
+ # used for setting the address manager address
+ URL: http://deployer:8081/addresses.json
+ # connect to the 2 layers
+ DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: http://l1_chain:8545
+ DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: http://l2geth:8545
+ DATA_TRANSPORT_LAYER__SYNC_FROM_L2: 'true'
+ DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 28
+ ports:
+ - ${DTL_PORT:-7878}:7878
+
+ l2geth:
+ depends_on:
+ - l1_chain
+ - deployer
+ image: omgx/l2geth:latest
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.geth
+ # override with the geth script and the env vars required for it
+ entrypoint: sh ./geth.sh
+ env_file:
+ - ./envs/geth.env
+ environment:
+ ETH1_HTTP: http://l1_chain:8545
+ ROLLUP_TIMESTAMP_REFRESH: 5s
+ ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
+ # used for getting the addresses
+ URL: http://deployer:8081/addresses.json
+ # connecting to the DTL
+ ROLLUP_CLIENT_HTTP: http://dtl:7878
+ ETH1_CTC_DEPLOYMENT_HEIGHT: 8
+ RETRIES: 60
+ CHAIN_ID: 28
+ ports:
+ - ${L2GETH_HTTP_PORT:-8545}:8545
+ - ${L2GETH_WS_PORT:-8546}:8546
+
+ relayer:
+ depends_on:
+ - l1_chain
+ - deployer
+ - l2geth
+ image: omgx/message-relayer:latest
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.message-relayer
+ entrypoint: ./relayer.sh
+ environment:
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ L2_NODE_WEB3_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ # a funded hardhat account
+ L1_WALLET_KEY: '0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97'
+ RETRIES: 60
+ POLLING_INTERVAL: 500
+ GET_LOGS_INTERVAL: 500
+ FILTER_ENDPOINT: http://omgx_deployer:8079/addresses.json #this will fail early, but then start to work when the omgx_deployer comes up
+ FILTER_POLLING_INTERVAL: 30000
+
+ batch_submitter:
+ depends_on:
+ - l1_chain
+ - deployer
+ - l2geth
+ image: omgx/batch-submitter:latest
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.batch-submitter
+ entrypoint: ./batches.sh
+ env_file:
+ - ./envs/batches.env
+ environment:
+ L1_NODE_WEB3_URL: http://l1_chain:8545
+ L2_NODE_WEB3_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ SEQUENCER_PRIVATE_KEY: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d'
+ PROPOSER_PRIVATE_KEY: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a'
+
+ verifier:
+ depends_on:
+ - l1_chain
+ - deployer
+ - dtl
+ image: omgx/l2geth:latest
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.geth
+ entrypoint: sh ./geth.sh
+ env_file:
+ - ./envs/geth.env
+ environment:
+ ETH1_HTTP: http://l1_chain:8545
+ ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
+ URL: http://deployer:8081/addresses.json
+ ROLLUP_CLIENT_HTTP: http://dtl:7878
+ ROLLUP_BACKEND: 'l1'
+ ETH1_CTC_DEPLOYMENT_HEIGHT: 8
+ RETRIES: 60
+ ROLLUP_VERIFIER_ENABLE: 'true'
+ ports:
+ - ${VERIFIER_HTTP_PORT:-8547}:8545
+ - ${VERIFIER_WS_PORT:-8548}:8546
+
+ integration_tests:
+ image: omgx/integration-tests:latest
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.integration-tests
+ entrypoint: ./integration-tests.sh
+ environment:
+ L1_URL: http://l1_chain:8545
+ L2_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ ENABLE_GAS_REPORT: 1
+ NO_NETWORK: 1
diff --git a/ops/docker-compose-replica-service.yml b/ops/docker-compose-replica-service.yml
new file mode 100644
index 000000000000..bad85f4cab91
--- /dev/null
+++ b/ops/docker-compose-replica-service.yml
@@ -0,0 +1,60 @@
+#############################
+# OMGX replica service
+# This service is used to replicate the l2geth
+#
+# RUN:
+# cd /ops
+# docker-compose -f docker-compose-omgx-replica.yml up
+#############################
+
+version: "3"
+
+services:
+ dtl-replica:
+ image: omgx/data-transport-layer:production-v1
+ deploy:
+ replicas: 1
+ entrypoint: ./dtl.sh
+ env_file:
+ - ./envs/dtl.env
+ # set the rest of the env vars for the network whcih do not
+ # depend on the docker-compose setup
+ environment:
+ # used for setting the address manager address
+ URL: https://rinkeby.omgx.network:8081/addresses.json
+ DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: https://rinkeby.infura.io/v3/INFURA_KEY
+ DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: https://rinkeby.omgx.network
+ DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 28
+ DATA_TRANSPORT_LAYER__SYNC_FROM_L2: 'true'
+ # Port
+ DATA_TRANSPORT_LAYER__SERVER_PORT: 7878
+ ports:
+ - ${DTL_PORT:-7878}:7878
+
+ l2geth-replica:
+ image: omgx/replica:production-v1
+ deploy:
+ replicas: 1
+ entrypoint: sh ./geth.sh
+ env_file:
+ - ./envs/geth_rv.env
+ environment:
+ ETH1_HTTP: //rinkeby.infura.io/v3/INFURA_KEY
+ ROLLUP_STATE_DUMP_PATH: https://rinkeby.omgx.network:8081/state-dump.latest.json
+ URL: https://rinkeby.omgx.network:8081/addresses.json
+ # connecting to the DTL
+ ROLLUP_CLIENT_HTTP: http://dtl-replica:7878
+ ETH1_CTC_DEPLOYMENT_HEIGHT: 8845198
+ RETRIES: 60
+ ROLLUP_BACKEND: 'l2'
+ ROLLUP_VERIFIER_ENABLE: 'true'
+ # PORT
+ RPC_PORT: 8545
+ ports:
+ - ${REPLICA_HTTP_PORT:-8545}:8545
+ - ${REPLICA_WS_PORT:-8546}:8546
+ volumes:
+ - l2geth:/root/.ethereum
+
+volumes:
+ l2geth:
\ No newline at end of file
diff --git a/ops/docker-compose-rpc-proxy.yml b/ops/docker-compose-rpc-proxy.yml
new file mode 100644
index 000000000000..dccd31c1cb07
--- /dev/null
+++ b/ops/docker-compose-rpc-proxy.yml
@@ -0,0 +1,17 @@
+version: "3"
+services:
+ rpc-proxy:
+ depends_on:
+ - l1_chain
+ - deployer
+ - l2geth
+ image: rpc-proxy
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.rpc-proxy
+ environment:
+ SEQUENCER: l2geth:8545
+ ETH_CALLS_ALLOWED: eth_blockNumber,eth_sendRawTransaction
+ ports:
+ - 9546:8080
+ - 9145:9145
diff --git a/ops/docker-compose-verifier-service.yml b/ops/docker-compose-verifier-service.yml
new file mode 100644
index 000000000000..d33db1bca6a8
--- /dev/null
+++ b/ops/docker-compose-verifier-service.yml
@@ -0,0 +1,57 @@
+#############################
+# OMGX Verifier service
+# This service is used to verify the l2geth
+#
+# RUN:
+# cd /ops
+# docker-compose -f docker-compose-omgx-verifier.yml up
+#############################
+
+version: "3"
+
+services:
+ dtl-replica:
+ image: omgx/data-transport-layer:production-v1
+ deploy:
+ replicas: 1
+ entrypoint: ./dtl.sh
+ env_file:
+ - ./envs/dtl.env
+ # set the rest of the env vars for the network whcih do not
+ # depend on the docker-compose setup
+ environment:
+ # used for setting the address manager address
+ URL: https://rinkeby.omgx.network:8081/addresses.json
+ DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: https://rinkeby.infura.io/v3/INFURA_KEY
+ DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: https://rinkeby.omgx.network
+ DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 28
+ DATA_TRANSPORT_LAYER__SERVER_PORT: 7878
+ ports:
+ - ${DTL_PORT:-7878}:7878
+
+ l2geth-verifier:
+ image: omgx/replica:production-v1
+ deploy:
+ replicas: 1
+ entrypoint: sh ./geth.sh
+ env_file:
+ - ./envs/geth_rv.env
+ environment:
+ ETH1_HTTP: //rinkeby.infura.io/v3/INFURA_KEY
+ ROLLUP_STATE_DUMP_PATH: https://rinkeby.omgx.network:8081/state-dump.latest.json
+ URL: https://rinkeby.omgx.network:8081/addresses.json
+ # connecting to the DTL
+ ROLLUP_CLIENT_HTTP: http://dtl-replica:7878
+ ETH1_CTC_DEPLOYMENT_HEIGHT: 8845198
+ RETRIES: 60
+ ROLLUP_BACKEND: 'l1'
+ ROLLUP_VERIFIER_ENABLE: 'true'
+ RPC_PORT: 8545
+ ports:
+ - ${REPLICA_HTTP_PORT:-8545}:8545
+ - ${REPLICA_WS_PORT:-8546}:8546
+ volumes:
+ - l2geth:/root/.ethereum
+
+volumes:
+ l2geth:
\ No newline at end of file
diff --git a/ops/docker-compose.yml b/ops/docker-compose.yml
index 2ca1b5e64890..081048c62dbe 100644
--- a/ops/docker-compose.yml
+++ b/ops/docker-compose.yml
@@ -21,7 +21,7 @@ services:
- ${L1CHAIN_HTTP_PORT:-9545}:8545
deployer:
- depends_on:
+ depends_on:
- l1_chain
image: ethereumoptimism/deployer
build:
@@ -37,12 +37,15 @@ services:
# skip compilation when run in docker-compose, since the contracts
# were already compiled in the builder step
NO_COMPILE: 1
+ CHAIN_ID: 28
+ PROPOSER_PRIVATE_KEY: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a'
+ RELAYER_PRIVATE_KEY: '0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97'
ports:
# expose the service to the host for getting the contract addrs
- ${DEPLOYER_PORT:-8080}:8081
dtl:
- depends_on:
+ depends_on:
- l1_chain
- deployer
- l2geth
@@ -62,7 +65,8 @@ services:
# connect to the 2 layers
DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: http://l1_chain:8545
DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: http://l2geth:8545
- DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 420
+ DATA_TRANSPORT_LAYER__SYNC_FROM_L2: 'true'
+ DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 28
ports:
- ${DTL_PORT:-7878}:7878
@@ -80,6 +84,7 @@ services:
- ./envs/geth.env
environment:
ETH1_HTTP: http://l1_chain:8545
+ ROLLUP_TIMESTAMP_REFRESH: 5s
ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
# used for getting the addresses
URL: http://deployer:8081/addresses.json
@@ -87,6 +92,7 @@ services:
ROLLUP_CLIENT_HTTP: http://dtl:7878
ETH1_CTC_DEPLOYMENT_HEIGHT: 8
RETRIES: 60
+ CHAIN_ID: 28
ports:
- ${L2GETH_HTTP_PORT:-8545}:8545
- ${L2GETH_WS_PORT:-8546}:8546
@@ -110,6 +116,8 @@ services:
RETRIES: 60
POLLING_INTERVAL: 500
GET_LOGS_INTERVAL: 500
+ FILTER_ENDPOINT: http://omgx_deployer:8079/addresses.json #this will fail early, but then start to work when the omgx_deployer comes up
+ FILTER_POLLING_INTERVAL: 30000
batch_submitter:
depends_on:
@@ -128,6 +136,59 @@ services:
L2_NODE_WEB3_URL: http://l2geth:8545
URL: http://deployer:8081/addresses.json
SEQUENCER_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"
+ PROPOSER_PRIVATE_KEY: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a'
+
+ verifier:
+ depends_on:
+ - l1_chain
+ - deployer
+ - dtl
+ image: ethereumoptimism/l2geth
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.geth
+ entrypoint: sh ./geth.sh
+ env_file:
+ - ./envs/geth.env
+ environment:
+ ETH1_HTTP: http://l1_chain:8545
+ ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
+ URL: http://deployer:8081/addresses.json
+ ROLLUP_CLIENT_HTTP: http://dtl:7878
+ ROLLUP_BACKEND: 'l1'
+ ETH1_CTC_DEPLOYMENT_HEIGHT: 8
+ RETRIES: 60
+ ROLLUP_VERIFIER_ENABLE: 'true'
+ ports:
+ - ${VERIFIER_HTTP_PORT:-8547}:8545
+ - ${VERIFIER_WS_PORT:-8548}:8546
+
+ replica:
+ depends_on:
+ - dtl
+ image: ethereumoptimism/l2geth
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.geth
+ entrypoint: sh ./geth.sh
+ env_file:
+ - ./envs/geth.env
+ environment:
+ ETH1_HTTP: http://l1_chain:8545
+ ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
+ URL: http://deployer:8081/addresses.json
+ ROLLUP_CLIENT_HTTP: http://dtl:7878
+ ROLLUP_BACKEND: 'l2'
+ ROLLUP_VERIFIER_ENABLE: 'true'
+ ETH1_CTC_DEPLOYMENT_HEIGHT: 8
+ RETRIES: 60
+ ports:
+ - ${L2GETH_HTTP_PORT:-8549}:8545
+ - ${L2GETH_WS_PORT:-8550}:8546
integration_tests:
image: ethereumoptimism/integration-tests
@@ -138,8 +199,21 @@ services:
dockerfile: ./ops/docker/Dockerfile.integration-tests
entrypoint: ./integration-tests.sh
environment:
- L1_URL: http://l1_chain:8545
- L2_URL: http://l2geth:8545
- URL: http://deployer:8081/addresses.json
- ENABLE_GAS_REPORT: 1
- NO_NETWORK: 1
+ L1_URL: http://l1_chain:8545
+ L2_URL: http://l2geth:8545
+ URL: http://deployer:8081/addresses.json
+ ENABLE_GAS_REPORT: 1
+ NO_NETWORK: 1
+ L2_CHAINID: 28
+
+ gas_oracle:
+ image: ethereumoptimism/gas-oracle
+ deploy:
+ replicas: 0
+ build:
+ context: ..
+ dockerfile: ./ops/docker/Dockerfile.gas-oracle
+ entrypoint: ./gas-oracle.sh
+ environment:
+ GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL: http://l2geth:8545
+ GAS_PRICE_ORACLE_PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
\ No newline at end of file
diff --git a/ops/docker/Dockerfile.batch-submitter b/ops/docker/Dockerfile.batch-submitter
index 1d5c92e758a6..07b14a9b3c09 100644
--- a/ops/docker/Dockerfile.batch-submitter
+++ b/ops/docker/Dockerfile.batch-submitter
@@ -17,6 +17,7 @@ COPY --from=builder /optimism/packages/common-ts/package.json ./packages/common-
COPY --from=builder /optimism/packages/common-ts/dist ./packages/common-ts/dist
COPY --from=builder /optimism/packages/contracts/package.json ./packages/contracts/package.json
+COPY --from=builder /optimism/packages/contracts/deployments ./packages/contracts/deployments
COPY --from=builder /optimism/packages/contracts/dist ./packages/contracts/dist
COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/artifacts
COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./packages/contracts/artifacts-ovm
diff --git a/ops/docker/Dockerfile.data-transport-layer b/ops/docker/Dockerfile.data-transport-layer
index e6bcdfee2b89..dfc1c8278b78 100644
--- a/ops/docker/Dockerfile.data-transport-layer
+++ b/ops/docker/Dockerfile.data-transport-layer
@@ -18,6 +18,7 @@ COPY --from=builder /optimism/packages/common-ts/package.json ./packages/common-
COPY --from=builder /optimism/packages/common-ts/dist ./packages/common-ts/dist
COPY --from=builder /optimism/packages/contracts/package.json ./packages/contracts/package.json
+COPY --from=builder /optimism/packages/contracts/deployments ./packages/contracts/deployments
COPY --from=builder /optimism/packages/contracts/dist ./packages/contracts/dist
COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/artifacts
COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./packages/contracts/artifacts-ovm
diff --git a/ops/docker/Dockerfile.gas-oracle b/ops/docker/Dockerfile.gas-oracle
new file mode 100644
index 000000000000..23af993d2068
--- /dev/null
+++ b/ops/docker/Dockerfile.gas-oracle
@@ -0,0 +1,14 @@
+FROM golang:1.15-alpine3.13 as builder
+
+RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash
+
+ADD ./go/gas-oracle /gas-oracle
+RUN cd /gas-oracle && make gas-oracle
+
+FROM alpine:3.13
+
+RUN apk add --no-cache ca-certificates jq curl
+COPY --from=builder /gas-oracle/gas-oracle /usr/local/bin/
+
+COPY ./ops/scripts/gas-oracle.sh .
+ENTRYPOINT ["gas-oracle"]
diff --git a/ops/docker/Dockerfile.geth b/ops/docker/Dockerfile.geth
index 03f4a8b25bff..9409fab6a8c2 100644
--- a/ops/docker/Dockerfile.geth
+++ b/ops/docker/Dockerfile.geth
@@ -1,5 +1,5 @@
# Build Geth in a stock Go builder container
-FROM golang:1.14-alpine as builder
+FROM golang:1.15-alpine3.13 as builder
RUN apk add --no-cache make gcc musl-dev linux-headers git
@@ -7,7 +7,7 @@ ADD ./l2geth /go-ethereum
RUN cd /go-ethereum && make geth
# Pull Geth into a second stage deploy alpine container
-FROM alpine:latest
+FROM alpine:3.13
RUN apk add --no-cache ca-certificates jq curl
COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/
diff --git a/ops/docker/Dockerfile.integration-tests b/ops/docker/Dockerfile.integration-tests
index 98401b435313..e0542a98b692 100644
--- a/ops/docker/Dockerfile.integration-tests
+++ b/ops/docker/Dockerfile.integration-tests
@@ -13,6 +13,9 @@ COPY --from=builder /optimism/node_modules ./node_modules
COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
+COPY --from=builder /optimism/packages/message-relayer/package.json ./packages/message-relayer/package.json
+COPY --from=builder /optimism/packages/message-relayer/dist ./packages/message-relayer/dist
+
COPY --from=builder /optimism/packages/hardhat-ovm/package.json ./packages/hardhat-ovm/package.json
COPY --from=builder /optimism/packages/hardhat-ovm/dist ./packages/hardhat-ovm/dist
diff --git a/ops/docker/Dockerfile.message-relayer b/ops/docker/Dockerfile.message-relayer
index 92614be95492..5c976daee892 100644
--- a/ops/docker/Dockerfile.message-relayer
+++ b/ops/docker/Dockerfile.message-relayer
@@ -18,6 +18,7 @@ COPY --from=builder /optimism/packages/common-ts/package.json ./packages/common-
COPY --from=builder /optimism/packages/common-ts/dist ./packages/common-ts/dist
COPY --from=builder /optimism/packages/contracts/package.json ./packages/contracts/package.json
+COPY --from=builder /optimism/packages/contracts/deployments ./packages/contracts/deployments
COPY --from=builder /optimism/packages/contracts/dist ./packages/contracts/dist
COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/artifacts
COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./packages/contracts/artifacts-ovm
diff --git a/ops/docker/Dockerfile.monorepo b/ops/docker/Dockerfile.monorepo
index abbac5072efc..39df6306c80e 100644
--- a/ops/docker/Dockerfile.monorepo
+++ b/ops/docker/Dockerfile.monorepo
@@ -34,7 +34,7 @@ COPY packages/batch-submitter/package.json ./packages/batch-submitter/package.js
COPY packages/message-relayer/package.json ./packages/message-relayer/package.json
COPY integration-tests/package.json ./integration-tests/package.json
-RUN yarn install --frozen-lockfile
+RUN yarn install # --frozen-lockfile
### BUILDER: Builds the typescript
FROM node
diff --git a/ops/docker/Dockerfile.omgx_deployer b/ops/docker/Dockerfile.omgx_deployer
new file mode 100644
index 000000000000..4c8a68076387
--- /dev/null
+++ b/ops/docker/Dockerfile.omgx_deployer
@@ -0,0 +1,55 @@
+FROM ethereumoptimism/builder AS builder
+FROM omgx/omgx_builder AS omgx_builder
+FROM node:14-alpine
+
+RUN apk add --no-cache git curl python bash jq
+WORKDIR /opt/optimism/
+
+COPY --from=builder /optimism/*.json /optimism/yarn.lock ./
+COPY --from=builder /optimism/node_modules ./node_modules
+
+# copy deps (would have been nice if docker followed the symlinks required)
+COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
+COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
+
+COPY --from=builder /optimism/packages/hardhat-ovm/package.json ./packages/hardhat-ovm/package.json
+COPY --from=builder /optimism/packages/hardhat-ovm/dist ./packages/hardhat-ovm/dist
+
+# get the needed built artifacts
+WORKDIR /opt/optimism/packages/contracts
+COPY --from=builder /optimism/packages/contracts/dist ./dist
+COPY --from=builder /optimism/packages/contracts/*.json ./
+COPY --from=builder /optimism/packages/contracts/node_modules ./node_modules
+COPY --from=builder /optimism/packages/contracts/artifacts ./artifacts
+COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./artifacts-ovm
+COPY --from=builder /optimism/packages/contracts/deployments ./deployments
+
+# get non-build artifacts from the host
+COPY packages/contracts/bin ./bin
+COPY packages/contracts/contracts ./contracts
+COPY packages/contracts/hardhat.config.ts ./
+COPY packages/contracts/deploy ./deploy
+COPY packages/contracts/tasks ./tasks
+COPY packages/contracts/src ./src
+COPY packages/contracts/test/helpers/constants.ts ./test/helpers/constants.ts
+COPY packages/contracts/scripts ./scripts
+
+# get the needed built artifacts
+WORKDIR /opt/optimism/packages/omgx/contracts
+COPY --from=omgx_builder /optimism/packages/omgx/contracts/tsconfig.json ./tsconfig.json
+COPY --from=omgx_builder /optimism/packages/omgx/contracts/package.json ./package.json
+COPY --from=omgx_builder /optimism/packages/omgx/contracts/node_modules ./node_modules
+COPY --from=omgx_builder /optimism/packages/omgx/contracts/artifacts ./artifacts
+COPY --from=omgx_builder /optimism/packages/omgx/contracts/artifacts-ovm ./artifacts-ovm
+
+# get non-build artifacts from the host
+COPY packages/omgx/contracts/bin ./bin
+COPY packages/omgx/contracts/contracts ./contracts
+COPY packages/omgx/contracts/hardhat.config.ts ./
+COPY packages/omgx/contracts/deploy ./deploy
+COPY packages/omgx/contracts/tasks ./tasks
+COPY packages/omgx/contracts/scripts ./scripts
+COPY packages/omgx/contracts/deployment ./deployment
+COPY packages/omgx/contracts/preSupportedTokens.json ./
+
+ENTRYPOINT ["./scripts/wait-for-l1-and-l2.sh", "./scripts/deployer.sh"]
diff --git a/ops/docker/Dockerfile.omgx_message-relayer-fast b/ops/docker/Dockerfile.omgx_message-relayer-fast
new file mode 100644
index 000000000000..d480bbc01e54
--- /dev/null
+++ b/ops/docker/Dockerfile.omgx_message-relayer-fast
@@ -0,0 +1,35 @@
+FROM ethereumoptimism/builder AS builder
+FROM node:14-alpine
+
+RUN apk add --no-cache git curl python bash jq
+WORKDIR /opt/optimism/
+
+COPY --from=builder /optimism/*.json /optimism/yarn.lock ./
+COPY --from=builder /optimism/node_modules ./node_modules
+
+# copy deps (would have been nice if docker followed the symlinks required)
+COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
+COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
+COPY --from=builder /optimism/packages/common-ts/package.json ./packages/common-ts/package.json
+COPY --from=builder /optimism/packages/common-ts/dist ./packages/common-ts/dist
+COPY --from=builder /optimism/packages/hardhat-ovm/package.json ./packages/hardhat-ovm/package.json
+COPY --from=builder /optimism/packages/hardhat-ovm/dist ./packages/hardhat-ovm/dist
+
+# get the needed built artifacts
+WORKDIR /opt/optimism/packages/contracts
+COPY --from=builder /optimism/packages/contracts/dist ./dist
+COPY --from=builder /optimism/packages/contracts/*.json ./
+COPY --from=builder /optimism/packages/contracts/node_modules ./node_modules
+COPY --from=builder /optimism/packages/contracts/artifacts ./artifacts
+COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./artifacts-ovm
+COPY --from=builder /optimism/packages/contracts/deployments ./deployments
+
+# copy the service
+WORKDIR /opt/optimism/packages/omgx/message-relayer-fast
+COPY packages/omgx/message-relayer-fast/dist ./dist
+COPY packages/omgx/message-relayer-fast/package.json .
+COPY packages/omgx/message-relayer-fast/exec ./exec
+COPY packages/omgx/message-relayer-fast/node_modules ./node_modules
+COPY packages/omgx/message-relayer-fast/scripts ./scripts
+
+ENTRYPOINT ["./scripts/wait-for-l1-and-l2.sh", "./scripts/relayer-fast.sh"]
\ No newline at end of file
diff --git a/ops/docker/Dockerfile.omgx_monorepo b/ops/docker/Dockerfile.omgx_monorepo
new file mode 100644
index 000000000000..c34594cc12a7
--- /dev/null
+++ b/ops/docker/Dockerfile.omgx_monorepo
@@ -0,0 +1,18 @@
+FROM ethereumoptimism/builder:latest
+
+WORKDIR /optimism
+COPY packages/omgx/contracts/package.json ./packages/omgx/contracts/package.json
+COPY packages/omgx/message-relayer-fast/package.json ./packages/omgx/message-relayer-fast/package.json
+COPY ./packages/omgx ./packages/omgx
+
+COPY ./patches ./patches
+
+RUN yarn
+
+WORKDIR /optimism/packages/omgx/message-relayer-fast
+RUN yarn build
+
+WORKDIR /optimism/packages/omgx/contracts
+RUN yarn build
+
+CMD ["true"]
diff --git a/ops/docker/Dockerfile.op_exporter b/ops/docker/Dockerfile.op_exporter
new file mode 100644
index 000000000000..3754319f9d16
--- /dev/null
+++ b/ops/docker/Dockerfile.op_exporter
@@ -0,0 +1,12 @@
+FROM golang:1.16 as builder
+
+ADD ./go/op_exporter /app/
+WORKDIR /app/
+RUN make build
+
+FROM alpine:latest
+RUN apk --no-cache add ca-certificates
+WORKDIR /root/
+COPY --from=builder /app/op_exporter /usr/local/bin/
+ENTRYPOINT ["op_exporter"]
+CMD ["--help"]
diff --git a/ops/docker/Dockerfile.rpc-proxy b/ops/docker/Dockerfile.rpc-proxy
new file mode 100644
index 000000000000..28928175d23a
--- /dev/null
+++ b/ops/docker/Dockerfile.rpc-proxy
@@ -0,0 +1,22 @@
+FROM openresty/openresty:buster
+LABEL maintainer="Optimistic Systems "
+ARG GOTEMPLATE_VERSION=v3.9.0
+
+RUN DEBIAN_FRONTEND=noninteractive apt-get update \
+ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+ openresty-opm \
+ && opm get knyar/nginx-lua-prometheus
+
+RUN curl -o /usr/local/bin/gomplate \
+ -sSL https://github.com/hairyhenderson/gomplate/releases/download/$GOTEMPLATE_VERSION/gomplate_linux-amd64-slim \
+ && chmod +x /usr/local/bin/gomplate
+
+RUN mkdir -p /var/log/nginx/ \
+ && ln -sf /dev/stdout /var/log/nginx/access.log \
+ && ln -sf /dev/stderr /var/log/nginx/error.log
+
+COPY ./ops/docker/rpc-proxy/eth-jsonrpc-access.lua /usr/local/openresty/nginx/eth-jsonrpc-access.lua
+COPY ./ops/docker/rpc-proxy/nginx.template.conf /docker-entrypoint.d/nginx.template.conf
+COPY ./ops/docker/rpc-proxy/docker-entrypoint.sh /docker-entrypoint.sh
+
+ENTRYPOINT ["/docker-entrypoint.sh"]
diff --git a/ops/docker/hardhat/yarn.lock b/ops/docker/hardhat/yarn.lock
index bad1ef0d6d31..5d7149c252ea 100644
--- a/ops/docker/hardhat/yarn.lock
+++ b/ops/docker/hardhat/yarn.lock
@@ -2252,9 +2252,9 @@ wrappy@1:
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
ws@^7.2.1:
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59"
- integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0:
version "4.0.2"
diff --git a/ops/docker/prometheus/prometheus.yml b/ops/docker/prometheus/prometheus.yml
index 9026833b65f4..8ca99831b5c6 100644
--- a/ops/docker/prometheus/prometheus.yml
+++ b/ops/docker/prometheus/prometheus.yml
@@ -22,3 +22,6 @@ scrape_configs:
- job_name: 'data-transport-layer'
static_configs:
- targets: ['dtl:7878']
+ - job_name: 'batch-submitter'
+ static_configs:
+ - targets: ['batch_submitter:7300']
diff --git a/ops/docker/rpc-proxy/docker-entrypoint.sh b/ops/docker/rpc-proxy/docker-entrypoint.sh
new file mode 100755
index 000000000000..477f1dd8f934
--- /dev/null
+++ b/ops/docker/rpc-proxy/docker-entrypoint.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+set -eo pipefail
+
+if [ -z "$SEQUENCER" ];then
+ echo "SEQUENCER env must be set, exiting"
+ exit 1
+fi
+
+if [ -z "$ETH_CALLS_ALLOWED" ];then
+ echo "ETH_CALLS_ALLOWED env must be set, exiting"
+ exit 1
+fi
+
+gomplate -f /docker-entrypoint.d/nginx.template.conf > /usr/local/openresty/nginx/conf/nginx.conf
+
+cat /usr/local/openresty/nginx/conf/nginx.conf
+
+exec openresty "$@"
diff --git a/ops/docker/rpc-proxy/eth-jsonrpc-access.lua b/ops/docker/rpc-proxy/eth-jsonrpc-access.lua
new file mode 100644
index 000000000000..3f2280ec815f
--- /dev/null
+++ b/ops/docker/rpc-proxy/eth-jsonrpc-access.lua
@@ -0,0 +1,91 @@
+-- Source: https://github.com/adetante/ethereum-nginx-proxy
+local cjson = require('cjson')
+
+local function empty(s)
+ return s == nil or s == ''
+end
+
+local function split(s)
+ local res = {}
+ local i = 1
+ for v in string.gmatch(s, "([^,]+)") do
+ res[i] = v
+ i = i + 1
+ end
+ return res
+end
+
+local function contains(arr, val)
+ for i, v in ipairs (arr) do
+ if v == val then
+ return true
+ end
+ end
+ return false
+end
+
+-- parse conf
+local blacklist, whitelist = nil
+if not empty(ngx.var.jsonrpc_blacklist) then
+ blacklist = split(ngx.var.jsonrpc_blacklist)
+end
+if not empty(ngx.var.jsonrpc_whitelist) then
+ whitelist = split(ngx.var.jsonrpc_whitelist)
+end
+
+-- check conf
+if blacklist ~= nil and whitelist ~= nil then
+ ngx.log(ngx.ERR, 'invalid conf: jsonrpc_blacklist and jsonrpc_whitelist are both set')
+ ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
+ return
+end
+
+-- get request content
+ngx.req.read_body()
+
+-- try to parse the body as JSON
+local success, body = pcall(cjson.decode, ngx.var.request_body);
+if not success then
+ ngx.log(ngx.ERR, 'invalid JSON request')
+ ngx.exit(ngx.HTTP_BAD_REQUEST)
+ return
+end
+
+local method = body['method']
+local version = body['jsonrpc']
+
+-- check we have a method and a version
+if empty(method) or empty(version) then
+ ngx.log(ngx.ERR, 'no method and/or jsonrpc attribute')
+ ngx.exit(ngx.HTTP_BAD_REQUEST)
+ return
+end
+
+metric_sequencer_requests:inc(1, {method, ngx.var.server_name, ngx.var.status})
+
+-- check the version is supported
+if version ~= "2.0" then
+ ngx.log(ngx.ERR, 'jsonrpc version not supported: ' .. version)
+ ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
+ return
+end
+
+-- if whitelist is configured, check that the method is whitelisted
+if whitelist ~= nil then
+ if not contains(whitelist, method) then
+ ngx.log(ngx.ERR, 'jsonrpc method is not whitelisted: ' .. method)
+ ngx.exit(ngx.HTTP_FORBIDDEN)
+ return
+ end
+end
+
+-- if blacklist is configured, check that the method is not blacklisted
+if blacklist ~= nil then
+ if contains(blacklist, method) then
+ ngx.log(ngx.ERR, 'jsonrpc method is blacklisted: ' .. method)
+ ngx.exit(ngx.HTTP_FORBIDDEN)
+ return
+ end
+end
+
+return
diff --git a/ops/docker/rpc-proxy/nginx.template.conf b/ops/docker/rpc-proxy/nginx.template.conf
new file mode 100644
index 000000000000..2c50152dffb8
--- /dev/null
+++ b/ops/docker/rpc-proxy/nginx.template.conf
@@ -0,0 +1,89 @@
+worker_processes 5;
+daemon off;
+error_log /var/log/nginx/error.log;
+worker_rlimit_nofile 8192;
+pcre_jit on;
+
+events {
+ worker_connections 4096;
+}
+
+http {
+ include mime.types;
+ index index.html;
+ # The JSONRPC POST body must fit inside this allocation for the method parsing to succeed.
+ # https://github.com/openresty/lua-nginx-module#ngxreqread_body
+ # http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size
+ client_body_buffer_size 128k;
+ # client_max_body_size should match client_body_buffer_size
+ # Values that exceed client_body_buffer_size will be written to a temporary file, which we don't want
+ # Requests above this limit will also be denied with an HTTP 413 response (entity too large)
+ # http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
+ client_max_body_size 128k;
+
+ # See Move default writable paths to a dedicated directory (#119)
+ # https://github.com/openresty/docker-openresty/issues/119
+ client_body_temp_path /var/run/openresty/nginx-client-body;
+ proxy_temp_path /var/run/openresty/nginx-proxy;
+ fastcgi_temp_path /var/run/openresty/nginx-fastcgi;
+ uwsgi_temp_path /var/run/openresty/nginx-uwsgi;
+ scgi_temp_path /var/run/openresty/nginx-scgi;
+
+ keepalive_timeout 0;
+
+ default_type application/octet-stream;
+ log_format main '$remote_addr - $remote_user [$time_local] $status '
+ '"$request" $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+ access_log /var/log/nginx/access.log main;
+ sendfile on;
+ tcp_nopush on;
+
+ lua_shared_dict prometheus_metrics 10M;
+ init_worker_by_lua_block {
+ prometheus = require("prometheus").init("prometheus_metrics")
+ metric_requests = prometheus:counter(
+ "nginx_http_requests_total", "Number of HTTP requests", {"host", "status"})
+ metric_sequencer_requests = prometheus:counter(
+ "nginx_eth_sequencer_requests", "Number of requests going to the sequencer", {"method", "host", "status"})
+ metric_replica_requests = prometheus:counter(
+ "nginx_eth_replica_requests", "Number of requests going to the replicas", {"host", "status"})
+ metric_latency = prometheus:histogram(
+ "nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
+ metric_connections = prometheus:gauge(
+ "nginx_http_connections", "Number of HTTP connections", {"state"})
+ }
+ log_by_lua_block {
+ metric_requests:inc(1, {ngx.var.server_name, ngx.var.status})
+ metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name})
+ }
+
+ upstream sequencer {
+ server {{env.Getenv "SEQUENCER"}};
+ }
+
+ server { # RPC proxy server
+ listen 8080;
+ location = /healthz {
+ return 200 'healthz';
+ }
+ location / {
+ set $jsonrpc_whitelist {{env.Getenv "ETH_CALLS_ALLOWED"}};
+ access_by_lua_file 'eth-jsonrpc-access.lua';
+ proxy_pass http://sequencer;
+ }
+ }
+
+ server { # Metrics server
+ listen 9145;
+ location /metrics {
+ content_by_lua_block {
+ metric_connections:set(ngx.var.connections_reading, {"reading"})
+ metric_connections:set(ngx.var.connections_waiting, {"waiting"})
+ metric_connections:set(ngx.var.connections_writing, {"writing"})
+ prometheus:collect()
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/ops/envs/batches.env b/ops/envs/batches.env
index a506a00d7d06..62c14a33795f 100644
--- a/ops/envs/batches.env
+++ b/ops/envs/batches.env
@@ -9,7 +9,7 @@ MAX_STATE_BATCH_COUNT=50
POLL_INTERVAL=500
NUM_CONFIRMATIONS=0
-RESUBMISSION_TIMEOUT=1000000
+RESUBMISSION_TIMEOUT=1
FINALITY_CONFIRMATIONS=0
RUN_TX_BATCH_SUBMITTER=true
RUN_STATE_BATCH_SUBMITTER=true
diff --git a/ops/envs/dtl.env b/ops/envs/dtl.env
index c00bc07e8b6f..9680c2ea6157 100644
--- a/ops/envs/dtl.env
+++ b/ops/envs/dtl.env
@@ -12,4 +12,4 @@ DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=0.0.0.0
DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=
DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT=
DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT=
-DATA_TRANSPORT_LAYER__L2_CHAIN_ID=
+DATA_TRANSPORT_LAYER__L2_CHAIN_ID=28
diff --git a/ops/envs/geth.env b/ops/envs/geth.env
index b9c9dce5e904..521fcdf884f8 100644
--- a/ops/envs/geth.env
+++ b/ops/envs/geth.env
@@ -6,11 +6,16 @@ ETH1_CONFIRMATION_DEPTH=0
ROLLUP_CLIENT_HTTP=
ROLLUP_STATE_DUMP_PATH=
ROLLUP_POLL_INTERVAL_FLAG=500ms
+ROLLUP_ENABLE_L2_GAS_POLLING=true
+ROLLUP_GAS_PRICE_ORACLE_OWNER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+# ROLLUP_ENFORCE_FEES=
+
+ETHERBASE=0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf
RPC_ENABLE=true
RPC_ADDR=0.0.0.0
RPC_PORT=8545
-RPC_API=eth,net,rollup,web3
+RPC_API=eth,net,rollup,web3,debug
RPC_CORS_DOMAIN=*
RPC_VHOSTS=*
@@ -20,14 +25,14 @@ WS_PORT=8546
WS_API=eth,net,rollup,web3
WS_ORIGINS=*
-CHAIN_ID=420
+CHAIN_ID=28
DATADIR=/root/.ethereum
DEV=true
GASPRICE=0
GCMODE=archive
IPC_DISABLE=true
-NETWORK_ID=420
+NETWORK_ID=28
NO_USB=true
NO_DISCOVER=true
-TARGET_GAS_LIMIT=9000000
+TARGET_GAS_LIMIT=11000000
USING_OVM=true
diff --git a/ops/envs/geth_rv.env b/ops/envs/geth_rv.env
new file mode 100644
index 000000000000..b25e364bd4b5
--- /dev/null
+++ b/ops/envs/geth_rv.env
@@ -0,0 +1,38 @@
+ETH1_HTTP=
+ETH1_CTC_DEPLOYMENT_HEIGHT=
+ETH1_SYNC_SERVICE_ENABLE=true
+ETH1_CONFIRMATION_DEPTH=0
+
+ROLLUP_CLIENT_HTTP=
+ROLLUP_STATE_DUMP_PATH=
+ROLLUP_POLL_INTERVAL_FLAG=500ms
+ROLLUP_ENABLE_L2_GAS_POLLING=
+ROLLUP_GAS_PRICE_ORACLE_OWNER_ADDRESS=
+ROLLUP_ENFORCE_FEES=
+
+ETHERBASE=0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf
+
+RPC_ENABLE=true
+RPC_ADDR=0.0.0.0
+RPC_PORT=8545
+RPC_API=eth,net,rollup,web3,debug
+RPC_CORS_DOMAIN=*
+RPC_VHOSTS=*
+
+WS=true
+WS_ADDR=0.0.0.0
+WS_PORT=8546
+WS_API=eth,net,rollup,web3
+WS_ORIGINS=*
+
+CHAIN_ID=28
+DATADIR=/root/.ethereum
+DEV=true
+GASPRICE=0
+GCMODE=archive
+IPC_DISABLE=true
+NETWORK_ID=28
+NO_USB=true
+NO_DISCOVER=true
+TARGET_GAS_LIMIT=11000000
+USING_OVM=true
diff --git a/ops/scripts/ci-versions.js b/ops/scripts/ci-versions.js
index 1d88521039a6..aa2d88e9428e 100644
--- a/ops/scripts/ci-versions.js
+++ b/ops/scripts/ci-versions.js
@@ -6,10 +6,18 @@ const os = require('os')
data = process.argv[2]
data = JSON.parse(data)
+// Packages that do not depend on the builder.
+// There are more packages that depend on the
+// builder than not, so keep track of this list instead
+const nonBuilders = new Set([
+ 'l2geth',
+ 'gas-oracle',
+])
+
builder = false
for (const i of data) {
const name = i.name.replace("@eth-optimism/", "")
- if (name !== 'l2geth') {
+ if (!nonBuilders.has(name)) {
builder = true
}
const version = i.version
diff --git a/ops/scripts/gas-oracle.sh b/ops/scripts/gas-oracle.sh
new file mode 100755
index 000000000000..a8ed6c5d27fb
--- /dev/null
+++ b/ops/scripts/gas-oracle.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+RETRIES=${RETRIES:-40}
+
+if [[ -z $GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL ]]; then
+ echo "Must set env GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL"
+ exit 1
+fi
+
+# waits for l2geth to be up
+curl --fail \
+ --show-error \
+ --silent \
+ --retry-connrefused \
+ --retry $RETRIES \
+ --retry-delay 1 \
+ --output /dev/null \
+ $GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL
+
+exec gas-oracle "$@"
diff --git a/ops/scripts/geth.sh b/ops/scripts/geth.sh
index b9aa06d4a170..3ade8c9ec081 100755
--- a/ops/scripts/geth.sh
+++ b/ops/scripts/geth.sh
@@ -21,9 +21,9 @@ if [[ ! -z "$URL" ]]; then
envSet ROLLUP_ADDRESS_MANAGER_OWNER_ADDRESS Deployer
# set the address to the proxy gateway if possible
- envSet ETH1_L1_ETH_GATEWAY_ADDRESS Proxy__OVM_L1ETHGateway
- if [ $ETH1_L1_ETH_GATEWAY_ADDRESS == null ]; then
- envSet ETH1_L1_ETH_GATEWAY_ADDRESS OVM_L1ETHGateway
+ envSet ETH1_L1_STANDARD_BRIDGE_ADDRESS Proxy__OVM_L1StandardBridge
+ if [ $ETH1_L1_STANDARD_BRIDGE_ADDRESS == null ]; then
+ envSet ETH1_L1_STANDARD_BRIDGE_ADDRESS OVM_L1StandardBridge
fi
fi
diff --git a/ops/scripts/stats.sh b/ops/scripts/stats.sh
new file mode 100755
index 000000000000..30dcdb4f1e70
--- /dev/null
+++ b/ops/scripts/stats.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# set up the stats file
+mkdir ~/logs
+touch ~/logs/stats.txt
+
+while true; do
+ {
+ echo "$(date) ----------------";
+ echo "total memory usage --------------------------";
+ free -m;
+ echo "docker stats --------------------------------";
+ docker stats --no-stream;
+ echo "memory munchers -----------------------------";
+ ps aux --sort=-%mem | head;
+ } >> ~/logs/stats.txt
+ sleep 1;
+done
diff --git a/ops/scripts/wait-for-verifier.sh b/ops/scripts/wait-for-verifier.sh
new file mode 100755
index 000000000000..229dee0aed0d
--- /dev/null
+++ b/ops/scripts/wait-for-verifier.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+CONTAINER=l2geth
+
+RETRIES=30
+i=0
+until docker-compose logs verifier | grep -q "Starting Verifier Loop";
+do
+ sleep 3
+ if [ $i -eq $RETRIES ]; then
+ echo 'Timed out waiting for verifier'
+ break
+ fi
+ echo 'Waiting for verifier...'
+ ((i=i+1))
+done
diff --git a/ops/up_local.sh b/ops/up_local.sh
new file mode 100755
index 000000000000..3e74dc3866b9
--- /dev/null
+++ b/ops/up_local.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+if ! [ -x "$(command -v yq)" ]; then
+ echo 'Error: yq is not installed. brew install yq' >&2
+ exit 1
+fi
+
+#Set conservative defaults
+#BUILD=${BUILD:-1} #build unless override
+#DAEMON=${DAEMON:-0} #run win foreground unless overrride
+
+if [[ $BUILD == 2 ]]; then
+ echo 'You set BUILD to 2, which means that we will use existing docker images on your computer'
+fi
+
+if [[ $BUILD == 1 ]]; then
+ echo 'You set BUILD to 1, which means that all your dockers will be (re)built'
+fi
+
+if [[ $BUILD == 0 ]]; then
+ echo 'You set BUILD to 0, which means that you want to pull Docker images from Dockerhub'
+fi
+
+if [[ $DAEMON == 1 ]]; then
+ echo 'You set DAEMON to 1, which means that your local L1/L2 will run in the background'
+fi
+
+if [[ $DAEMON == 0 ]]; then
+ echo 'You set DAEMON to 0, which means that your local L1/L2 will run in the front and you will see all the debug log information'
+fi
+
+#Build dependencies, if needed
+if [[ $BUILD == 1 ]]; then
+ yarn
+ yarn build
+fi
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
+ORIGINAL_DOCKERFILE="docker-compose.yml"
+DOCKERFILE="docker-compose-omgx.yml"
+#DOCKERFILE="docker-compose.yml"
+OMGX_DOCKERFILE=docker-compose-omgx-services.yml
+#replace all occurances of image: ethereumoptimism/ with image: omgx/
+#append :latest tag to all apps
+yq eval '(.services.[].image | select(. == "ethereumoptimism*")) |= sub("ethereumoptimism", "omgx")' ${ORIGINAL_DOCKERFILE} | \
+yq eval '(.services.[].image) += ":latest"' - \
+#> ${DOCKERFILE}
+
+if [[ $BUILD == 1 ]]; then
+ docker-compose build --parallel -- builder l2geth l1_chain
+ docker-compose build --parallel -- deployer dtl batch_submitter relayer integration_tests
+ docker image tag ethereumoptimism/builder omgx/builder:latest
+ docker image tag ethereumoptimism/hardhat omgx/hardhat:latest
+ # comented out because this command does not seem to wait for completion of the parallel build in GH actions?
+ # see error in https://github.com/omgnetwork/optimism/pull/154/checks?check_run_id=2984030034
+ docker image tag ethereumoptimism/deployer omgx/deployer:latest
+ docker image tag ethereumoptimism/data-transport-layer omgx/data-transport-layer:latest
+ docker image tag ethereumoptimism/l2geth omgx/l2geth:latest
+ docker image tag ethereumoptimism/message-relayer omgx/message-relayer:latest
+ docker image tag ethereumoptimism/batch-submitter omgx/batch-submitter:latest
+ docker image tag ethereumoptimism/integration-tests omgx/integration-tests:latest
+ docker build ../ --file $DIR/docker/Dockerfile.omgx_monorepo --tag omgx/omgx_builder:latest
+ docker build ../ --file $DIR/docker/Dockerfile.omgx_deployer --tag omgx/omgx_deployer:latest
+ docker build ../ --file $DIR/docker/Dockerfile.omgx_message-relayer-fast --tag omgx/omgx_message-relayer-fast:latest
+elif [[ $BUILD == 0 ]]; then
+ docker-compose -f $DIR/$DOCKERFILE -f $DIR/$OMGX_DOCKERFILE pull
+fi
+
+if [[ $DAEMON == 1 ]]; then
+ docker-compose \
+ -f $DIR/$DOCKERFILE \
+ -f $DIR/$OMGX_DOCKERFILE \
+ up --no-build --detach -V
+else
+ docker-compose \
+ -f $DIR/$DOCKERFILE \
+ -f $DIR/$OMGX_DOCKERFILE \
+ up --no-build -V
+fi
diff --git a/ops_omgx/README.md b/ops_omgx/README.md
new file mode 100644
index 000000000000..494c377c3414
--- /dev/null
+++ b/ops_omgx/README.md
@@ -0,0 +1,140 @@
+# omgx_optimism2aws
+
+Directory hosting different devops automations, cloudformation templates and other
+AWS related resources for deploying omgx_optimism integration to AWS ECS
+
+## How to use the automation hosted here?
+
+1. Make the code changes for each of the services you need in the monorepo, they're located in the packages directory, one level up from this README.md file
+
+2. Make sure you've got your secrets already imported in AWS, either by adding them manually or by using the `aws-secrets-importer.py` script hosted in this repository. The `aws-secrets-importer.py` can be used the following way, which would read a particular yaml file and import the secrets from it in AWS Secret Manager.
+
+Here is an example of how to run the `aws-secrets-importer.py`:
+
+```
+$ ./aws-secrets-importer.py -i docker-compose-local.env.yml -d secret-foo -n secret-foo -r us-east-1 -p default
+{
+ "ARN": "arn:aws:secretsmanager:us-east-1:942431445534:secret:secret-foo-lAl7Pu",
+ "Name": "secret-foo",
+ "VersionId": "5848d972-98ba-4b97-8b0c-e04db2560613"
+}
+```
+
+3. Make sure you have installed [jq](https://stedolan.github.io/jq/) and configured [awscli](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
+
+
+## Deployment: how to use the key cfn-devenv.sh script
+
+Use the `cfn-devenv.sh` to provision, update, destroy or reset your own development environment using AWS ECS
+
+* Before provisioning the services, make sure their containers exist, choose a tag from which to pull from hub.docker.com and push to AWS ECR. The example below will pull all services with tag `latest` from the omgx hub.docker.com and push to AWS the
+same container, but with the tag would be `aws-latest`. So if your original tag is `foo`, then the final tag will be `aws-foo`.
+
+```
+./cfn-devenv.sh push2aws --region us-east-1 --deploy-tag aws-latest --from-tag latest --registry-prefix omgx
+```
+
+To generate new AWS container for only one service, you can specifiy the service name and then execute:
+
+```
+./cfn-devenv.sh push2aws --region us-east-1 --deploy-tag aws-latest --from-tag latest --registry-prefix omgx --service-name deployer
+```
+
+* Once we're sure all the containers have been pushed to AWS, we can provision the whole stack with:
+
+```
+./cfn-devenv.sh create --stack-name test-stack --region us-east-1 --deploy-tag aws-latest
+./cfn-devenv.sh deploy --stack-name test-stack --region us-east-1 --deploy-tag aws-latest --registry-prefix omgx --secret-name aws-secret-name
+```
+
+* To update, for example, the batch-submitter, which is already running, you could:
+
+```
+./cfn-devenv.sh update --stack-name test-stack --region us-east-1 --deploy-tag aws-latest --registry-prefix omgx --secret-name aws-secret-name --service-name batch-submitter
+```
+
+* If you don't specify `--service-name` - all services are going to be updated
+
+* If you don't specify `--secret-name` - the `--deploy-tag` will become `--secret-name`
+
+* To add a new service to the stack, you should add the respective cloudformation template in the `cloudformation` directory,
+then add a folder named like the cloudformation template to the `docker` directory, then execute `push2aws`, and then execute `deploy`.
+
+* To login to the server via ssh:
+```
+./cfn-devenv.sh ssh --stack-name test-stack --region us-east-1
+
+Starting session with SessionId: petar@enya.ai-0bbe0cdbc42865625
+sh-4.2$ sudo su
+[root@ip-10-0-2-250 bin]# docker ps
+```
+
+* To restart all services in a cluster, simply use the command below, it will pull all latest containers with the same tag and re-read the AWS Secrets again, then run all the containers:
+```
+./cfn-devenv.sh restart --stack-name test-stack
+```
+
+* To restart all services in a cluster and remove the contents in the /mnt/efs directory, you can run:
+```
+./cfn-devenv.sh restart --stack-name test-stack --force
+```
+
+* To stop all services in a cluster, you can run:
+```
+./cfn-devenv.sh stop --stack-name test-stack
+```
+
+* To stop all services in a cluster and remove the contents in the /mnt/efs directory, you can run:
+```
+./cfn-devenv.sh stop --stack-name test-stack --force
+```
+
+* To see all current ECS clusters provisioned with this automation, run:
+```
+./cfn-devenv.sh list-clusters
+ ---------------
+ CLUSTER: rinkeby-infrastructure-application-EcsCluster-UAw9PLUNKtWg
+ L2-URL: https://rinkeby.omgx.network
+ STACK-NAME: rinkeby
+ ---------------
+
+ ---------------
+ CLUSTER: dev-integration-infrastructure-application-EcsCluster-MO5arb28VUsC"
+ L2-URL: https://dev-integration.omgx.network
+ STACK-NAME: dev-integration
+ ---------------
+
+```
+
+### cfn-devenv.sh
+
+Simple Bash automation allowing for deployment, updating, destruction of a development environment. The script automatically checks the AWS Elastic Container Registry whether the `DEPLOY_TAG` already exists. If not - images are generated and pushed to the ECR.
+
+The script also outputs the Cloudwatch Log Groups of each of the services, making it easy to monitor the log stream with [saw](https://github.com/TylerBrock/saw) or some other `cloudwatch tail -f` tool.
+
+An example from the cfn-devenv.sh help:
+
+```
+Create/Update an environment
+ ./cfn-devenv.sh create --stack-name --region --deploy-tag
+
+ ./cfn-devenv.sh update --stack-name --region --deploy-tag --service-name
+
+ ./cfn-devenv.sh update --stack-name --region --deploy-tag --registry-prefix
+
+ ./cfn-devenv.sh deploy --stack-name --region --deploy-tag --service-name --registry-prefix
+
+ ./cfn-devenv.sh deploy --stack-name --region --deploy-tag
+
+Push containers to AWS ECR
+ ./cfn-devenv.sh push2aws --service-name --region --deploy-tag --from-tag
+
+ ./cfn-devenv.sh push2aws --region --deploy-tag --from-tag
+
+
+Destroy an environment/service
+ ./cfn-devenv.sh destroy --stack-name --service-name --region --deploy-tag [Note: Remove the service from the ECS Cluster]
+
+ ./cfn-devenv.sh destroy --stack-name --region --deploy-tag [Note: Remove all services from the ECS Cluster]
+
+```
diff --git a/ops_omgx/SERVICEREADME.md b/ops_omgx/SERVICEREADME.md
new file mode 100644
index 000000000000..153c67727b12
--- /dev/null
+++ b/ops_omgx/SERVICEREADME.md
@@ -0,0 +1,142 @@
+# Services
+
+## L2geth
+
+It's forked from `go-etherum` with some modifications.
+
+> For the purpose of keeping the L2 data, we use volume for the L2geth image.
+
+## Data Transport Layer
+
+It syncs data from L1.
+
+## Deployer
+
+It deploys contracts on L1. These contracts help the communication between L1 and L2. The `Lib_AddressManager` contract has the addresses of all these important contract addresses.
+
+```
+{
+ "AddressManager": "0x0787a989eDDeb40a64BBEAB94F2fF30CEb70A184",
+ "OVM_CanonicalTransactionChain": "0xa833AAF1888d257b08F634F3c6FBc751Ce1A4815",
+ "OVM_ChainStorageContainer:CTC:batches": "0xDb4CAB17Ffce0eD7B0A4F44Bb793b0C469C8Caa5",
+ "OVM_ChainStorageContainer:CTC:queue": "0xd96c792e72A1D9A5F3584B14e26d86F17C27CB3b",
+ "OVM_ChainStorageContainer:SCC:batches": "0x65fafD8A61a303FFD1d7EF265f439Ff452742cDe",
+ "OVM_ExecutionManager": "0x99b2897C450A72267bfF439484Bae250009Aaaf7",
+ "OVM_FraudVerifier": "0xd7b6CA71Bc11776A383359237c3995A0F43d4316",
+ "OVM_L1CrossDomainMessenger": "0x9362c3e6fD23Eb8049c82f69BD013B8d92072701",
+ "OVM_L1ETHGateway": "0x909C14780026E97eA67105C73cDD3DFD55a0ECc6",
+ "OVM_L1MultiMessageRelayer": "0x8867577DC13647ce8e43D61b61E639421C9ADcc7",
+ "OVM_SafetyChecker": "0x638a72ec9919A24684Fc328f8dE0887A80Bf2892",
+ "OVM_StateCommitmentChain": "0xE5B5814Ca76FEA28d9c389cbf86CaDEfC5f25c20",
+ "OVM_StateManagerFactory": "0x125c97d9F374624391bedd5d4e7F73F735646A2A",
+ "OVM_StateTransitionerFactory": "0xf1263FCfCDC1b9b41C57Df7c7bE30530F29f4C22",
+ "Proxy__OVM_L1CrossDomainMessenger": "0xaD05Bc932DA6f15a30976C533d309944c18C3b57",
+ "Proxy__OVM_L1ETHGateway": "0xe3B6f4b17adE8809d292437951Af9521ad96B1cE",
+ "OVM_BondManager": "0x6b32a2d71f90D5645613bBc0DbAe465e4Ce4b98C",
+ "OVM_Sequencer": "0xE48E5b731FAAb955d147FA954cba19d93Dc03529",
+ "Deployer": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA"
+}
+```
+
+When we start the deployer service, it exposes two files. One is `addresses.json`, which returns the above addresses. Another one is `state-dump.latest.json`, which is the **abi** and address of the above contracts. Other services load `state-dump.latest.json` and use the **abi** to interact with these contracts.
+
+> Deployer starts before all other services.
+
+> We should comment out the deploying code **packages/contracts/bin/deploy.ts** when we build the image for Rinkeby env. Otherwise, it will redeploy some contracts when the deployer service starts.
+
+> It uses `DEPLOYER_PRIVATE_KEY` to deploy contracts. SCC and CTC only allow certain accounts to submit the data. These accounts are defined in **packages/contracts/bin/deploy.ts**. **SCC** only allows **ovmProposerAddress** to submit data and **CTC** only allows **ovmSequencerAddress** to push data.
+>
+> We use different accounts for **ovmSequencerAddress**, **ovmProposerAddress**, **ovmRelayerAddress** and **ovmAddressManagerOwner**.
+
+## Batch Submitter
+
+It submits the TX batch and state batch to contracts deployed by the deployer. The TX is submitted to `OVM_CanonicalTransactionChain` and the state batch is submitted to `OVM_StateCommitmentChain`. For any message that is sent between L1 and L2, the batch submitter submits TX batch first, then submits the state batch next.
+
+We use two different accounts (**ovmSequencerAddress** and **ovmProposerAddress** ) to submit tx and state batch, respectively.
+
+## Message relayer
+
+The message relayer relays the message that is sent from the L2 contract to the L1 contract. The message relayer fetches the batches from `OVM_StateCommitmentChain`, then it gets the original message from L2 according to the block number of the batches. If L1 contracts use the standard **OVM_CrossDomainEnabled**, the message that is sent from the L2 contract to the L1 contract has a 7-days proof window. Once it passes 7 days, the message relayer will relay the message.
+
+> How is the message sent from L2 to L1?
+>
+> The L2 and L1 contracts need to import **OVM_CrossDomainEnabled** to enable the communication between L1 and L2. L2 contracts send the message by using:
+>
+> ```
+> bytes memory data = abi.encodeWithSelector(
+> L1Contract.L1ContractFunction.selector,
+> L1ContractFunctionVariable_1,
+> L1ContractFunctionVariable_2,
+> L1ContractFunctionVariable_3
+> );
+>
+> // Send calldata into L1
+> sendCrossDomainMessage(
+> address(L1ContractAddress),
+> data, // message that the message relayer is going to relay
+> getFinalizeDepositL1Gas()
+> );
+> ```
+
+> The message relayer doesn't relay the message again if the relaying transaction has the nonce error. Therefore, we have to use different accounts for the **message-relayer service** and **message-relayer-fast service**.
+
+## Message Relayer Fast
+
+The message that is relayed by the **message-relayer service** has a 7-days proof window time. Therefore, we create the **message-relayer-fast** to bypass the proof window time. Using the **message-relayer-fast** requires the L1 contract to import the **OVM_FastCrossDomainEnabled**. The fast message relayer fetches the batches from `OVM_StateCommitmentChain` , just like the standard message relayer, but we add the whitelist system to restrict the messages that can be relayed to L1. Only messages that target certain L1 contracts can be relayed by **message-relayer-fast service**.
+
+Since **message-relayer service** can get the messages that are supposed to be relayed by **message-relayer-fast service**, we add the blacklist system. The standard message relayer doesn't relay messages that target certain L1 contracts. It saves us gas.
+
+# Understand Log
+
+When we start the integration or production services, the most important test is sending the message between L1 and L2. Normally, the message can be easily sent from L1 to L2 if the batch submitter works correctly. Thus, I focus on how to debug the system when the message can't be sent from L2 to L1.
+
+## Debugging steps
+
+1. Make sure all services connect to the right **SCC** and **CTC**. The addressManagerAddresses of all services are the same.
+
+ * Batch submitter
+
+ ```javascript
+ Configured batch submitter address: {addressManagerAddress: 0x0787a989eDDeb40a64BBEAB94F2fF30CEb70A184}
+ Initialed new CTC: 0xa833AAF1888d257b08F634F3c6FBc751Ce1A4815
+ ```
+
+ * Message relayer and message relayer fast
+
+ ```javascript
+ Connecting to OVM_StateCommitmentChain...
+ Connected to OVM_StateCommitmentChain: 0xE5B5814Ca76FEA28d9c389cbf86CaDEfC5f25c20
+ Connecting to OVM_L1CrossDomainMessenger...
+ Connected to OVM_L1CrossDomainMessenger: 0xaD05Bc932DA6f15a30976C533d309944c18C3b57
+ // Message relayer and message relayer fast connect to two differnt OVM_L1CrossDomainMessangers.
+ ```
+
+2. When the test is running, check the log of the batch submitter first. Successfully submitting the batches should have the following log:
+
+ ```javascript
+ // Submit the tx batch first
+ Submitted appendSequencerBatch transaction: {txHash: , from: }
+ appendSequencerBatch transaction data: {data: }
+ Submitted batch!
+ // Submit the state root batch next
+ Submitted appendStateBatch transaction: {txHash: from: }
+ appendStateBatch transaction data: {data: }
+ Submitted state root batch!
+ ```
+
+3. After the batch submitter submits the data, please check the log of the message relayer or message relayer fast according to the transaction type. Both message relayers should find a batch of the finalized transaction(s). The log of successfully relaying the message is
+
+ ```
+ Found a batch of finalized transaction(s), checking for more...
+ Found finalized transactions
+ Found a message sent during transaction
+ Message not yet relayed. Attempting to generate a proof...
+ Successfully generated a proof. Attempting to relay to Layer 1...
+ Relay message transaction sent
+ Relay message included in block
+ Message successfully relayed to Layer 1!
+ ```
+
+
+
+
\ No newline at end of file
diff --git a/ops_omgx/VERSION.md b/ops_omgx/VERSION.md
new file mode 100644
index 000000000000..61910bcc653a
--- /dev/null
+++ b/ops_omgx/VERSION.md
@@ -0,0 +1,167 @@
+# Integration
+
+## V1
+
+Accounts:
+
+```javascript
+{
+ "Deployer": "0x2A2D5e9D1A0f3485f3D5c3fd983028E0f226FeD6",
+ "Sequencer": "0xE50faB5E5F46BB3E3e412d6DFbA73491a2D97695",
+ "Proposer": "0xfA20335C1Dbb08F67B0362CC07F707187CF378f7",
+ "Relayer": "0x3C8b7FdbF1e5B2519B00A8c9317C4BA51d6a4f9d",
+ "FastRelayer": "0xFA8077f292976ecB6B407c92C048983bDfDff428"
+}
+```
+
+Regenesis:
+
+```javascript
+{
+ "AddressManager": "0x227eE01C1daeF105a11F9440e33eE813Ff27d40d",
+ "OVM_CanonicalTransactionChain": "0x1B17521841Cc3Bb339762a67cD7F519e933BBBa0",
+ "OVM_ChainStorageContainer:CTC:batches": "0x039582CcCF07bDb32534f719C97BF77218f17589",
+ "OVM_ChainStorageContainer:CTC:queue": "0xD362FcEeeBF3c5FFe9bC58E86Ba2B2deD97eB547",
+ "OVM_ChainStorageContainer:SCC:batches": "0x693b253D1B652510C65042895927cF74edA1300c",
+ "OVM_ExecutionManager": "0x1469BC949E397B31604B320bd27673cec0df8217",
+ "OVM_FraudVerifier": "0xC28ea274bC685d3eAb33Ae9a7c42049Df0FBe1A8",
+ "OVM_L1CrossDomainMessenger": "0x16e1e20d16bE53b1f10bDf800DBA2Da163B5Fd19",
+ "OVM_L1CrossDomainMessengerFast": "0x24663c1d9e4030f0e9B690a5dcCC665e28DB89fA",
+ "OVM_L1ETHGateway": "0x7A82Fe30F687175CF69C445469dCbE399E8a74f2",
+ "OVM_L1MultiMessageRelayer": "0x853f93F3737E138c50eA2A650cdC95354D5580e2",
+ "OVM_SafetyChecker": "0xe50f2F7Eb86aa582DfA393d6A23651D2EDA4247c",
+ "OVM_StateCommitmentChain": "0x314480e5C9568453E1f43C31f720d9655Edb9236",
+ "OVM_StateManagerFactory": "0x910030a7CCEbe6Fd403F6Ec5c543f72Ed07623fD",
+ "OVM_StateTransitionerFactory": "0x02902447BBDf6eBF7007a548EDAFE638B6c67Dd2",
+ "Proxy__OVM_L1CrossDomainMessenger": "0x3122b5DC8d2d9B2Ca2e0582D8a1c111E1217CBB7",
+ "Proxy__OVM_L1ETHGateway": "0x481795417E6E5B4b8803193B210AF67D081B028E",
+ "OVM_BondManager": "0x5399E74Cd94EC695e2174d3867f9FEE476971c72",
+ "OVM_Sequencer": "0xE50faB5E5F46BB3E3e412d6DFbA73491a2D97695",
+ "Deployer": "0x2A2D5e9D1A0f3485f3D5c3fd983028E0f226FeD6"
+}
+```
+
+Images:
+
+```javascript
+{
+ "deployer": "omgx/deployer-rinkeby:integration-v1",
+ "data_transport_layer": "omgx/data-transport-layer:integration-v1",
+ "geth_l2": "omgx/l2geth:integration-v1",
+ "batch_submitter": "omgx/batch-submitter:integration-v1",
+ "message_relayer": "omgx/message-relayer:integration-v1",
+ "message_relayer_fast": "omgx/message-relayer-fast:integration-v1"
+}
+```
+
+## V2
+
+Accounts:
+
+```javascript
+{
+ "Deployer": "0x2A2D5e9D1A0f3485f3D5c3fd983028E0f226FeD6",
+ "Sequencer": "0xE50faB5E5F46BB3E3e412d6DFbA73491a2D97695",
+ "Proposer": "0xfA20335C1Dbb08F67B0362CC07F707187CF378f7",
+ "Relayer": "0x3C8b7FdbF1e5B2519B00A8c9317C4BA51d6a4f9d",
+ "FastRelayer": "0xFA8077f292976ecB6B407c92C048983bDfDff428"
+}
+```
+
+Regenesis:
+
+```javascript
+{
+ "AddressManager": "0xd58781Cdb5FC05CB94c579D9a84A0e0F5242b5ad",
+ "OVM_CanonicalTransactionChain": "0xb7945b1C99Ed3D5093a2cA4ee6454B8911e4861A",
+ "OVM_ChainStorageContainer-CTC-batches": "0x1889Adb3678E41b47496c5a7882337039C6ebBe1",
+ "OVM_ChainStorageContainer-CTC-queue": "0xd016AE4Ca2B482fC83817345A32dD60F5E9DFdb8",
+ "OVM_ChainStorageContainer-SCC-batches": "0x1D8EEc9c2157B6fB0b28201185475d091CD4Cb89",
+ "OVM_ExecutionManager": "0x9970eF0D48bFf67846f487554762A81Cb6D65ADa",
+ "OVM_FraudVerifier": "0x2384494f19CF08442B37aCD63A46947118C5d5bd",
+ "OVM_L1CrossDomainMessenger": "0x4B669b500f39B5746D5E5293Bbc2Ac739C430aF9",
+ "OVM_L1CrossDomainMessengerFast": "0x704b3410533EEe40EcE4242Cf0d480DBb0225896",
+ "OVM_L1MultiMessageRelayer": "0x5C621BE82C4E9a73d8428AA6fF01ec48FFf48174",
+ "OVM_SafetyChecker": "0xEb6C6071C518e44251aC76E8CcE0A57fCA672675",
+ "OVM_StateCommitmentChain": "0x59A5662186928742C6F37f25BCf057D387C33408",
+ "OVM_StateManagerFactory": "0x8c6652F82E114C8D3FaA7113B1408ae6364f1D11",
+ "OVM_StateTransitionerFactory": "0xb6046496DeDAFb0E416c8C816Fa25Ffaf25c309f",
+ "Proxy__OVM_L1CrossDomainMessenger": "0x0C1E0c73A48e7624DB86bc5234E7E3188cb7b47e",
+ "Proxy__OVM_L1StandardBridge": "0x95c3b9448A9B5F563e7DC47Ac3e4D6fF0F9Fad93",
+ "OVM_BondManager": "0xF66591BD3f660b39407AC2A0343b593F651dd0A2",
+ "OVM_Sequencer": "0xE50faB5E5F46BB3E3e412d6DFbA73491a2D97695",
+ "Deployer": "0x2A2D5e9D1A0f3485f3D5c3fd983028E0f226FeD6"
+}
+```
+
+Images:
+
+```javascript
+{
+ "deployer": "omgx/deployer-rinkeby:integration-v2",
+ "data_transport_layer": "omgx/data-transport-layer:integration-v2",
+ "geth_l2": "omgx/l2geth:integration-v2",
+ "batch_submitter": "omgx/batch-submitter:integration-v2",
+ "message_relayer": "omgx/message-relayer:integration-v2",
+ "message_relayer_fast": "omgx/message-relayer-fast:integration-v2"
+}
+```
+
+##
+
+# Production
+
+## V1
+
+Accounts:
+
+```javascript
+{
+ "Deployer": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA",
+ "Sequencer": "0xE48E5b731FAAb955d147FA954cba19d93Dc03529",
+ "Proposer": "0x7f3cDbe9906Fd57373e8d18AaA159Fc713f379b0",
+ "Relayer": "0x494Ae1fCd178e0DBA5a3B32D9324C90e47D88AA8",
+ "FastRelayer": "0x81922840527936c3453c99a81dBd4b13d7363722"
+}
+```
+
+Regenesis:
+
+```javascript
+{
+ "AddressManager": "0x93A96D6A5beb1F661cf052722A1424CDDA3e9418",
+ "OVM_CanonicalTransactionChain": "0xdc8A2730E167bFe5A96E0d713D95D399D070dF60",
+ "OVM_ChainStorageContainer-CTC-batches": "0xF4A6Bb0744fb75D009AB184184856d5f6edcB6ba",
+ "OVM_ChainStorageContainer-CTC-queue": "0x46FC9c5301A4FB5DaE830Aca7BD98Ef328c96c4a",
+ "OVM_ChainStorageContainer-SCC-batches": "0x8B7D233E9cD4a2f950dd82A4F71D2C833d710b52",
+ "OVM_ExecutionManager": "0xf431c82fA505A6B081A5f80FCD6c018972D60D8B",
+ "OVM_FraudVerifier": "0xFEFf7EfcbF79dD688A616BCb1F511B1b8cE0068A",
+ "OVM_L1CrossDomainMessenger": "0x8109f1Af0e8A74e393703Ca5447C5414E1946500",
+ "OVM_L1CrossDomainMessengerFast": "0x4238A43A1B03a5284438342AeB742a81894DAbac",
+ "OVM_L1MultiMessageRelayer": "0x5881EE5ef1c0BC1d9bB78788e1Bb8737398545D7",
+ "OVM_SafetyChecker": "0xa10eAe6538C515e82F16D2C95c0936A4452BB117",
+ "OVM_StateCommitmentChain": "0x1ba99640444B81f3928e4F174CFB4FF426B4FFAE",
+ "OVM_StateManagerFactory": "0xc4E3E4F9631220f2B1Ada9ee1164E30640c56c94",
+ "OVM_StateTransitionerFactory": "0xAC82f9F03f51c8fFef9Ff0362973e89C0dA4aa40",
+ "Proxy__OVM_L1CrossDomainMessenger": "0xF10EEfC14eB5b7885Ea9F7A631a21c7a82cf5D76",
+ "Proxy__OVM_L1StandardBridge": "0xDe085C82536A06b40D20654c2AbA342F2abD7077",
+ "OVM_BondManager": "0x2Ba9F9a6D6D7F604E9e2ca2Ea5f8C9Fa75E13835",
+ "OVM_Sequencer": "0xE48E5b731FAAb955d147FA954cba19d93Dc03529",
+ "Deployer": "0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA"
+}
+```
+
+Images:
+
+```javascript
+{
+ "deployer": "omgx/deployer-rinkeby:production-v1",
+ "data_transport_layer": "omgx/data-transport-layer:production-v1",
+ "geth_l2": "omgx/l2geth:production-v1",
+ "batch_submitter": "omgx/batch-submitter:production-v1",
+ "message_relayer": "omgx/message-relayer:production-v1",
+ "message_relayer_fast": "omgx/message-relayer-fast:production-v1"
+}
+```
+
+#
diff --git a/ops_omgx/aws-secrets-importer.py b/ops_omgx/aws-secrets-importer.py
new file mode 100755
index 000000000000..c3c4355aa628
--- /dev/null
+++ b/ops_omgx/aws-secrets-importer.py
@@ -0,0 +1,57 @@
+#!/usr/bin/python3
+
+import json
+import re
+import subprocess
+import sys, getopt
+from ruamel.yaml import YAML
+
+def main(argv):
+ inputfile = ''
+ description = "Create Secret Manager"
+ secret_name = ''
+ region = 'us-east-1'
+ profile = 'default'
+ if (len(sys.argv) <= 1 ) or (len(sys.argv) > 11):
+ print('aws-secrets-importer.py -i -d -n -r -p ')
+ sys.exit()
+ try:
+ opts, args = getopt.getopt(argv,"hi:d:n:r:p:",["ifile=","name=","description=","region=","profile="])
+ print(opts)
+ except getopt.GetoptError:
+ print('aws-secrets-importer.py -i -d -n -r -p ')
+ sys.exit(2)
+ for opt, arg in opts:
+ if opt == '-h':
+ print('aws-secrets-importer.py -i -d -n -r -p ')
+ sys.exit()
+ elif opt in ("-i", "--ifile"):
+ inputfile = arg
+ elif opt in ("-d", "--description"):
+ description = arg
+ elif opt in ("-n", "--name"):
+ secret_name = arg
+ elif opt in ("-r", "--region"):
+ region = arg
+ elif opt in ("-p", "--profile"):
+ profile = arg
+ else:
+ print("Else")
+ print('aws-secrets-importer.py -i -d -n -r -p ')
+ sys.exit()
+ with open(inputfile) as vars_file:
+ pattern = "="
+ secrets = {}
+ for line in vars_file:
+ if re.search(pattern, line):
+ variables = line.strip()
+ clean = re.sub(r"^- ", "", variables)
+ key, value = clean.split('=')
+ secrets[key] = value
+
+ cmd = ['aws', 'secretsmanager', 'create-secret', '--region', region, '--profile', profile, '--description', description, '--name', secret_name, '--secret-string', json.dumps(secrets)]
+ result = subprocess.run(cmd)
+ print(result)
+
+if __name__ == "__main__":
+ main(sys.argv[1:])
diff --git a/ops_omgx/cfn-devenv.sh b/ops_omgx/cfn-devenv.sh
new file mode 100755
index 000000000000..4f6070bc9272
--- /dev/null
+++ b/ops_omgx/cfn-devenv.sh
@@ -0,0 +1,559 @@
+#!/usr/bin/env bash
+
+set -o nounset -o errexit
+#set -x
+# Global variables
+PATH_TO_CFN="$PWD/cloudformation"
+PATH_TO_DOCKER="$PWD/docker"
+REGION=us-east-1
+REGISTRY_PREFIX=omgx
+SERVICE_NAME=
+SECRETNAME=
+DEPLOYTAG=
+FROMTAG=
+SUBCMD=
+FORCE=no
+AWS_ECR="942431445534.dkr.ecr.${REGION}.amazonaws.com"
+SKIPSERVICE=
+DOCKER_IMAGES_LIST=`ls ${PATH_TO_CFN}|egrep -v '^0|^datadog|^optimism'|sed 's/.yaml//g'`
+ENV_PREFIX=
+FORCE=no
+
+# FUNCTIONS
+
+function print_usage_and_exit {
+ cat <] AWS region (us-east-1, eu-west-1, us-west-1, etc) [default: us-east-1]
+ -h, --help This help :)
+
+ Subcommands:
+
+ create create an environment, e.g. provision VPC, ECS Cluster and then deploy the containers
+ --deploy-tag The Git Tag or Branch Name of all of the services
+ --stack-name Stack Name to create
+
+ restart does restart of a particular service in a cluster, useful when you've pushed new docker container with the old tag,
+ as it will be pulled again, also, if you've changed some variable in the aws secrets - it will re-read them again
+ --stack-name the name of the stack, in which you want to restart the service
+ --service-name the actual service name
+
+ update update an environment, e.g. update the containers to certain deploy-tag
+ --deploy-tag The Git Tag or Branch Name of all of the services
+ --service-name The name of the service you want to update, if not specified - all services are deployed with the
+ --secret-name The name of the secret to be used for rebuilding the container, if not specified - the deploy tag is being taken as secret name
+ --stack-name Stack Name to create
+
+ deploy deploy to an environment, e.g. perform a deployment, for example, you've removed one service OR would like to add new to your dev env
+ --deploy-tag The Git Tag or Branch Name of all of the services
+ --service-name The name of the service you want to update, if not specified - all services are deployed with the
+ --secret-name The name of the secret to be used for rebuilding the container, if not specified - the deploy tag is being taken as secret name
+ --stack-name Stack Name to create
+
+ destroy destroy the deployment of all services
+ --service-name Remove the service from the ECS Cluster
+ --stack-name Stack Name to create
+
+ push2aws push new versions of all service containers from hub.docker.com to AWS ECR
+ --deploy-tag The Git Tag or Branch Name of all of the services
+ --from-tag The Container Tag from hub.docker.com to be used for generating the containers pushed to AWS
+ --service-name The name of the service which container must be re-build
+ --registry-prefix The name of the registry you want to pull the image from
+
+ ssh does ssh to the ECS Cluster and then lets you run commands there, writing sudo su will drop you in a root shell
+ --stack-name the name of the stack, in which you want to login to
+
+
+
+ Examples:
+
+ Create/Update an environment
+ $(basename $0) create --stack-name --region --deploy-tag
+
+ $(basename $0) update --stack-name --region --deploy-tag --service-name
+
+ $(basename $0) update --stack-name --region --deploy-tag --secret-name
+
+ $(basename $0) deploy --stack-name --region --deploy-tag --service-name --secret-name
+
+ $(basename $0) deploy --stack-name --region --deploy-tag
+
+ Push containers to AWS ECR
+ $(basename $0) push2aws --service-name --region --deploy-tag --from-tag
+
+ $(basename $0) push2aws --region --deploy-tag --from-tag
+
+ $(basename $0) push2aws --region --deploy-tag --from-tag --secret-name
+
+ Destroy an environment/service
+ $(basename $0) destroy --stack-name --service-name --region --deploy-tag [Note: Remove the service from the ECS Cluster]
+
+ $(basename $0) destroy --stack-name --region --deploy-tag [Note: Remove all services from the ECS Cluster]
+EOF
+
+ exit 2
+}
+
+function timestamp {
+ local epoch=${1:-}
+
+ if [[ $epoch == true ]] ; then
+ date '+%s'
+ else
+ date '+%F %H:%M:%S'
+ fi
+}
+
+function log_output {
+ LOG_LEVEL="${1:-INFO}"
+ echo -e "[$(timestamp)] $(basename ${0}) ${LOG_LEVEL}: ${@:2}" >&2
+}
+
+function error {
+ log_output ERROR "${@}"
+ exit 1
+}
+
+function warn {
+ log_output WARNING "${@}"
+}
+
+function notice {
+ log_output NOTICE "${@}"
+}
+
+function info {
+ log_output INFO "${@}"
+}
+
+function verify_images_in_ecr {
+# cached old docker images makes docker refuse to pull latest!
+ #docker system prune -a -f --volumes
+ info "Login to AWS ECR and start building image"
+ aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin ${AWS_ECR} 2> /dev/null
+
+ if [[ -z ${FROMTAG} ]]; then
+ info "Verifying whether there are images for all services in AWS ECR"
+ for image in ${DOCKER_IMAGES_LIST}; do
+ local IMAGE_META="$( aws ecr describe-images --region us-east-2 --repository-name=${REGISTRY_PREFIX}/$image --image-ids=imageTag=${DEPLOYTAG} 2> /dev/null )"
+ local IMAGE_TAG="$( echo ${IMAGE_META} | jq '.imageDetails[0].imageTags[0]' -r )"
+ if [[ ${DEPLOYTAG} == $IMAGE_TAG ]]; then
+ info "${image}:${DEPLOYTAG} found"
+ else
+ warn "${image}:${DEPLOYTAG} not found"
+ cd ${PATH_TO_DOCKER}/${image}
+ cp -fRv ../../secret2env .
+ docker build . -t ${AWS_ECR}/${REGISTRY_PREFIX}/${image}:${DEPLOYTAG} --build-arg BUILD_IMAGE="${REGISTRY_PREFIX}/${image}" --build-arg BUILD_IMAGE_VERSION="${DEPLOYTAG}"
+ docker push ${AWS_ECR}/${REGISTRY_PREFIX}/${image}:${DEPLOYTAG}
+ cd ../..
+ fi
+ done
+ info "Verified all images exist in AWS ECR"
+ elif [[ -z ${SERVICE_NAME} ]]; then
+ for image in ${DOCKER_IMAGES_LIST}; do
+ cd ${PATH_TO_DOCKER}/${image}
+ cp -fRv ../../secret2env .
+ docker build . -t ${AWS_ECR}/${REGISTRY_PREFIX}/${image}:${DEPLOYTAG} --build-arg BUILD_IMAGE="${REGISTRY_PREFIX}/${image}" --build-arg BUILD_IMAGE_VERSION="${FROMTAG}"
+ docker push ${AWS_ECR}/${REGISTRY_PREFIX}/${image}:${DEPLOYTAG}
+ cd ../..
+ done
+ else
+ info "Rebuilding ${SERVICE_NAME} from ${FROMTAG} tag from hub.docker.com"
+ cd ${PATH_TO_DOCKER}/${SERVICE_NAME}
+ cp -fRv ../../secret2env .
+ if [ -z ${FROMTAG} ]; then
+ docker build . -t ${AWS_ECR}/${REGISTRY_PREFIX}/${SERVICE_NAME}:${DEPLOYTAG} --build-arg BUILD_IMAGE="${REGISTRY_PREFIX}/${image}" --build-arg BUILD_IMAGE_VERSION="${FROMTAG}"
+ docker push ${AWS_ECR}/${REGISTRY_PREFIX}/${SERVICE_NAME}:${DEPLOYTAG}
+ else
+ docker build . -t ${AWS_ECR}/${REGISTRY_PREFIX}/${SERVICE_NAME}:${DEPLOYTAG} --build-arg BUILD_IMAGE="${REGISTRY_PREFIX}/${SERVICE_NAME}" --build-arg BUILD_IMAGE_VERSION="${FROMTAG}"
+ docker push ${AWS_ECR}/${REGISTRY_PREFIX}/${SERVICE_NAME}:${DEPLOYTAG}
+ fi
+ cd ../..
+ info "${SERVICE_NAME} rebuild and pushed to AWS ECR"
+ exit
+ fi
+}
+
+function check_dev_environment {
+ info "Check for existing VPC and ECS Cluster"
+ local CFN_INFRASTRUCTURE_STACK="$(aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE | \
+ grep ${ENV_PREFIX}-infrastructure-core | grep StackName | awk -F ":" '{print $2}' | tr -d \",)"
+ local CFN_APP_STACK="$(aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE | \
+ grep ${ENV_PREFIX}-infrastructure-application | grep StackName | awk -F ":" '{print $2}' | tr -d \",)"
+ if [ -z "$CFN_INFRASTRUCTURE_STACK" ]; then
+ warn "VPC does not exist ... creating one"
+ cd ${PATH_TO_CFN}
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-infrastructure-core \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://00-infrastructure-core.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=Route53HostedZoneName,ParameterValue=${ENV_PREFIX}.omgx.network | jq '.StackId'
+ info "Waiting for the ${ENV_PREFIX}-infrastructure-core to create"
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-infrastructure-core
+ info "${ENV_PREFIX}-infrastructure-core created .... provisioning ECS Cluster"
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-infrastructure-application \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://03-infrastructure-application.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core \
+ ParameterKey=DomainName,ParameterValue=${ENV_PREFIX}.omgx.network | jq '.StackId'
+ info "Waiting for the ${ENV_PREFIX}-infrastructure-application to create"
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-infrastructure-application
+ info "${ENV_PREFIX}-infrastructure-application created"
+ info "Adding Datadog to the ECS Cluster"
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-datadog \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://datadog.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core | jq '.StackId'
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-datadog
+ cd ..
+ else
+ info "VPC exists ... checking ECS Cluster"
+ if [ -z "$CFN_APP_STACK" ]; then
+ warn "ECS Cluster does not exist ... creating one"
+ cd ${PATH_TO_CFN}
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-infrastructure-application \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://03-infrastructure-application.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core \
+ ParameterKey=DomainName,ParameterValue=${ENV_PREFIX}.omgx.network | jq '.StackId'
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-infrastructure-application
+ info "Adding Datadog to the ECS Cluster"
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-datadog \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://datadog.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core | jq '.StackId'
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-datadog
+ cd ..
+ else
+ info "ECS Cluster exists"
+ fi
+ fi
+}
+
+function deploy_dev_services {
+ if [ -z ${SERVICE_NAME} ]; then
+ notice "Deploying ..."
+ for SERVICE in ${DOCKER_IMAGES_LIST}; do
+ cd ${PATH_TO_CFN}
+ info "$SERVICE provisioning ..."
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-$SERVICE \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://${SERVICE}.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core \
+ ParameterKey=ImageTag,ParameterValue=${DEPLOYTAG} \
+ ParameterKey=EnvironmentName,ParameterValue=${ENV_PREFIX} \
+ ParameterKey=SecretName,ParameterValue=${SECRETNAME} \
+ ParameterKey=DockerPrefix,ParameterValue=${REGISTRY_PREFIX} | jq '.StackId'
+ info "$SERVICE provisioning ..."
+ cd ..
+ done
+ for SERVICE in ${DOCKER_IMAGES_LIST}; do
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-$SERVICE
+ info "Provisioned $SERVICE in ${REGION}"
+ done
+ else
+ info "Deploy ${SERVICE_NAME}"
+ cd ${PATH_TO_CFN}
+ aws cloudformation create-stack \
+ --stack-name ${ENV_PREFIX}-${SERVICE_NAME} \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://${SERVICE_NAME}.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core \
+ ParameterKey=ImageTag,ParameterValue=${DEPLOYTAG} \
+ ParameterKey=EnvironmentName,ParameterValue=${ENV_PREFIX} \
+ ParameterKey=SecretName,ParameterValue=${SECRETNAME} \
+ ParameterKey=DockerPrefix,ParameterValue=${REGISTRY_PREFIX} | jq '.StackId'
+ aws cloudformation wait stack-create-complete --stack-name=${ENV_PREFIX}-${SERVICE_NAME}
+ info "${SERVICE_NAME} provisioned"
+ cd ..
+ fi
+}
+
+function update_dev_services {
+ if [ -z ${SERVICE_NAME} ]; then
+ notice "Updating all services"
+ for SERVICE in ${DOCKER_IMAGES_LIST}; do
+ cd ${PATH_TO_CFN}
+ info "Updating $SERVICE"
+ aws cloudformation update-stack \
+ --stack-name ${ENV_PREFIX}-$SERVICE \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://${SERVICE}.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core \
+ ParameterKey=ImageTag,ParameterValue=${DEPLOYTAG} \
+ ParameterKey=EnvironmentName,ParameterValue=${ENV_PREFIX} \
+ ParameterKey=SecretName,ParameterValue=${SECRETNAME} \
+ ParameterKey=DockerPrefix,ParameterValue=${REGISTRY_PREFIX} | jq '.StackId'
+ info "Waiting for update to complete ..."
+ aws cloudformation wait stack-update-complete --stack-name=${ENV_PREFIX}-$SERVICE
+ info "Update completed"
+ cd ..
+ done
+ else
+ info "Update ${SERVICE_NAME} to ${DEPLOYTAG}"
+ cd ${PATH_TO_CFN}
+ aws cloudformation update-stack \
+ --stack-name ${ENV_PREFIX}-${SERVICE_NAME} \
+ --capabilities CAPABILITY_IAM \
+ --template-body=file://${SERVICE_NAME}.yaml \
+ --region ${REGION} \
+ --parameters \
+ ParameterKey=InfrastructureStackName,ParameterValue=${ENV_PREFIX}-infrastructure-core \
+ ParameterKey=ImageTag,ParameterValue=${DEPLOYTAG} \
+ ParameterKey=EnvironmentName,ParameterValue=${ENV_PREFIX} \
+ ParameterKey=SecretName,ParameterValue=${SECRETNAME} \
+ ParameterKey=DockerPrefix,ParameterValue=${REGISTRY_PREFIX} | jq '.StackId'
+ info "Waiting for update to complete"
+ aws cloudformation wait stack-update-complete --stack-name=${ENV_PREFIX}-${SERVICE_NAME}
+ info "Update completed"
+ cd ..
+ fi
+}
+
+function destroy_dev_services {
+ if [ -z ${SERVICE_NAME} ]; then
+ notice "Destroying all services"
+ for SERVICE in ${DOCKER_IMAGES_LIST}; do
+ cd ${PATH_TO_CFN}
+ info "Removing $SERVICE"
+ aws cloudformation delete-stack \
+ --stack-name ${ENV_PREFIX}-$SERVICE
+ cd ..
+ done
+ for SERVICE in ${DOCKER_IMAGES_LIST}; do
+ aws cloudformation wait stack-delete-complete --stack-name=${ENV_PREFIX}-$SERVICE
+ info "$SERVICE delete completed"
+ done
+ exit
+ else
+ info "Remove ${SERVICE_NAME}"
+ cd ${PATH_TO_CFN}
+ aws cloudformation delete-stack \
+ --stack-name ${ENV_PREFIX}-${SERVICE_NAME}
+ aws cloudformation wait stack-delete-complete --stack-name=${ENV_PREFIX}-${SERVICE_NAME}
+ info "Delete completed"
+ cd ..
+ exit
+ fi
+ }
+
+ function restart_service {
+ local force="${1:-}"
+ ECS_CLUSTER=`aws ecs list-clusters --region ${REGION}|grep ${ENV_PREFIX}|tail -1|cut -d/ -f2|sed 's#"##g'|sed 's#,##g'`
+ SERVICE4RESTART=`aws ecs list-services --region ${REGION} --cluster $ECS_CLUSTER|grep -i ${ENV_PREFIX}|cut -d/ -f3|sed 's#,##g'|tr '\n' ' '|sed 's#"##g'`
+ CONTAINER_INSTANCE=`aws ecs list-container-instances --region ${REGION} --cluster $ECS_CLUSTER|grep ${ENV_PREFIX}|tail -1|cut -d/ -f3|sed 's#"##g'`
+ ECS_TASKS=`aws ecs list-tasks --cluster $ECS_CLUSTER --region ${REGION}|grep ${ENV_PREFIX}|cut -d/ -f3|sed 's#"##g'|egrep -vi ^datadog|tr '\n' ' '`
+ EC2_INSTANCE=`aws ecs describe-container-instances --region ${REGION} --cluster $ECS_CLUSTER --container-instance $CONTAINER_INSTANCE|jq '.containerInstances[0] .ec2InstanceId'`
+ if [ -z ${SERVICE_NAME} ]; then
+ info "Restarting ${ECS_CLUSTER}"
+ if [[ "${force}" == "yes" ]] ; then
+ for num in $SERVICE4RESTART; do
+ aws ecs update-service --region ${REGION} --service $num --cluster $ECS_CLUSTER --service $num --desired-count 0 >> /dev/null
+ done
+ aws ecs list-tasks --cluster $ECS_CLUSTER | jq -r ' .taskArns[] | [.] | @tsv' | while IFS=$'\t' read -r taskArn; do aws ecs stop-task --cluster $ECS_CLUSTER --task $taskArn >> /dev/null; done
+ sleep 10
+ # aws ssm send-command --document-name "AWS-RunShellScript" --instance-ids $EC2_INSTANCE --parameters commands="rm -rf /mnt/efs/db/*" --region ${REGION} --output text
+ # aws ssm send-command --document-name "AWS-RunShellScript" --instance-ids $EC2_INSTANCE --parameters commands="rm -rf /mnt/efs/geth_l2/*" --region ${REGION} --output text
+ for num in $SERVICE4RESTART; do
+ aws ecs update-service --region ${REGION} --service $num --cluster $ECS_CLUSTER --service $num --desired-count 1 >> /dev/null
+ done
+ info "Removed contents in /mnt/efs/ and restarted, please allow 1-2 minutes for the new tasks to actually start"
+ else
+ for num in $SERVICE4RESTART; do
+ aws ecs update-service --region ${REGION} --cluster $ECS_CLUSTER --service $num --desired-count 0 >> /dev/null
+ done
+ aws ecs list-tasks --cluster $ECS_CLUSTER | jq -r ' .taskArns[] | [.] | @tsv' | while IFS=$'\t' read -r taskArn; do aws ecs stop-task --cluster $ECS_CLUSTER --task $taskArn >> /dev/null; done
+ sleep 10
+ for num in $SERVICE4RESTART; do
+ aws ecs update-service --region ${REGION} --service $num --cluster $ECS_CLUSTER --service $num --desired-count 1 >> /dev/null
+ done
+ info "Restarted, please allow 1-2 minutes for the new tasks to actually start"
+ fi
+ else
+ info "Restarting ${SERVICE_NAME} on ${ECS_CLUSTER}"
+ SRV=`echo ${SERVICE_NAME}| sed 's#-##g'`
+ SERVICE2RESTART=`aws ecs list-services --region ${REGION} --cluster $ECS_CLUSTER|grep -i ${ENV_PREFIX}|cut -d/ -f3|sed 's#,##g'|sed 's#"##g'|grep -i $SRV`
+ aws ecs update-service --region ${REGION} --service $SERVICE2RESTART --cluster $ECS_CLUSTER --desired-count 0 >> /dev/null
+ sleep 10
+ aws ecs update-service --region ${REGION} --service $SERVICE2RESTART --cluster $ECS_CLUSTER --desired-count 1 >> /dev/null
+ info "Restarted ${SERVICE_NAME} on ${ECS_CLUSTER}"
+ fi
+ }
+
+ function stop_cluster {
+ local force="${1:-}"
+ ECS_CLUSTER=`aws ecs list-clusters --region ${REGION}|grep ${ENV_PREFIX}|tail -1|cut -d/ -f2|sed 's#"##g'|sed 's#,##g'`
+ SERVICE4RESTART=`aws ecs list-services --region ${REGION} --cluster $ECS_CLUSTER|grep -i ${ENV_PREFIX}|cut -d/ -f3|sed 's#,##g'|egrep -vi ^datadog|tr '\n' ' '|sed 's#"##g'`
+ DATADOGTASK=`aws ecs list-tasks --cluster $ECS_CLUSTER --region ${REGION} --service-name Datadog-prod|grep ${ENV_PREFIX}|cut -d/ -f3|sed 's#"##g'|tr '\n' ' '`
+ CONTAINER_INSTANCE=`aws ecs list-container-instances --region ${REGION} --cluster $ECS_CLUSTER|grep ${ENV_PREFIX}|tail -1|cut -d/ -f3|sed 's#"##g'`
+ ECS_TASKS=`aws ecs list-tasks --cluster $ECS_CLUSTER --region ${REGION}|grep ${ENV_PREFIX}|cut -d/ -f3|sed 's#"##g'|egrep -vi ^datadog|tr '\n' ' '`
+ info "STOP ${ECS_CLUSTER}"
+ for num in $SERVICE4RESTART; do
+ aws ecs update-service --region ${REGION} --service $num --cluster $ECS_CLUSTER --service $num --desired-count 0 >> /dev/null
+ done
+ aws ecs list-tasks --cluster $ECS_CLUSTER |egrep -vi $DATADOGTASK | jq -r ' .taskArns[] | [.] | @tsv' | while IFS=$'\t' read -r taskArn; do aws ecs stop-task --cluster $ECS_CLUSTER --task $taskArn >> /dev/null; done
+ info "Stopped ${ECS_CLUSTER}"
+ }
+
+
+ function ssh_to_ecs_cluster {
+ ECS_CLUSTER=`aws ecs list-clusters --region ${REGION}|grep ${ENV_PREFIX}|tail -1|cut -d/ -f2|sed 's#,##g'|sed 's#"##g'`
+ CONTAINER_INSTANCE=`aws ecs list-container-instances --region ${REGION} --cluster $ECS_CLUSTER|grep ${ENV_PREFIX}|tail -1|cut -d/ -f3|sed 's#"##g'`
+ EC2_INSTANCE=`aws ecs describe-container-instances --region ${REGION} --cluster $ECS_CLUSTER --container-instance $CONTAINER_INSTANCE|jq '.containerInstances[0] .ec2InstanceId'|sed 's#"##g'`
+ info "SSH to server $EC2_INSTANCE"
+ aws ssm start-session --target $EC2_INSTANCE
+ }
+
+ function list_clusters {
+ ECS_CLUSTERS=$(aws ecs list-clusters --region ${REGION}|grep infrastructure-application|cut -d/ -f2|sed 's#"##g'|sed 's#,##g')
+ for ecs in $ECS_CLUSTERS; do
+ URL=$(echo $ecs|sed 's#-infrastructure-application.*#.omgx.network#')
+ STACK_NAME=$(echo $ecs|sed 's#-infrastructure-application.*##')
+ echo -e " --------------- \n CLUSTER: $ecs \n L2-URL: https://$URL \n STACK-NAME: $STACK_NAME \n --------------- \n"
+ done
+ }
+
+
+
+if [[ $# -gt 0 ]]; then
+ while [[ $# -gt 0 ]]; do
+ case "${1}" in
+ -h|--help)
+ print_usage_and_exit
+ ;;
+ create|deploy|update|destroy|restoredb|push2aws|restart|ssh|list-clusters|stop)
+ SUBCMD="${1}"
+ shift
+ ;;
+ --region)
+ REGION="${2}"
+ shift 2
+ ;;
+ --service-name)
+ SERVICE_NAME="${2}"
+ shift 2
+ ;;
+ --skip-service)
+ SKIPSERVICE="${2}"
+ shift 2
+ ;;
+ --deploy-tag)
+ DEPLOYTAG="${2}"
+ shift 2
+ ;;
+ --from-tag)
+ FROMTAG="${2}"
+ shift 2
+ ;;
+ --secret-name)
+ SECRETNAME="${2}"
+ shift 2
+ ;;
+ --registry-prefix)
+ REGISTRY_PREFIX="${2}"
+ shift 2
+ ;;
+ --stack-name)
+ ENV_PREFIX="${2}"
+ shift 2
+ ;;
+ --force|-f)
+ FORCE="${2}"
+ shift 1
+ ;;
+ --*)
+ error "Unknown option ${1}"
+ ;;
+ *)
+ error "Unknown sub-command ${1}"
+ ;;
+ esac
+ done
+else
+ print_usage_and_exit
+fi
+
+case "${SUBCMD}" in
+ create)
+ [[ -z "${DEPLOYTAG}" ]] && error 'Missing required option --deploy-tag'
+ [[ -z "${ENV_PREFIX}" ]] && error 'Missing required option --stack-name'
+ check_dev_environment
+ ;;
+ deploy)
+ [[ -z "${DEPLOYTAG}" ]] && error 'Missing required option --deploy-tag'
+ [[ -z "${SECRETNAME}" ]] && warn 'Missing option --secret-name, defaulting to --deploy-tag'
+ [[ -z "${ENV_PREFIX}" ]] && error 'Missing required option --stack-name'
+ deploy_dev_services
+ ;;
+ update)
+ [[ -z "${DEPLOYTAG}" ]] && error 'Missing required option --deploy-tag'
+ [[ -z "${SECRETNAME}" ]] && warn 'Missing option --secret-name, defaulting to --deploy-tag'
+ [[ -z "${ENV_PREFIX}" ]] && error 'Missing required option --stack-name'
+ update_dev_services
+ ;;
+ restart)
+ [[ -z "${ENV_PREFIX}" ]] && error 'Missing required option --stack-name'
+ [[ -z "${FORCE}" ]] && warn 'Missing --force, so not going to delete the /mnt/efs directory contents'
+ restart_service
+ ;;
+ stop)
+ [[ -z "${ENV_PREFIX}" ]] && error 'Missing required option --stack-name'
+ [[ -z "${FORCE}" ]] && warn 'Missing --force, so not going to delete the /mnt/efs directory contents'
+ stop_cluster
+ ;;
+ ssh)
+ [[ -z "${ENV_PREFIX}" ]] && error 'Missing required option --stack-name'
+ ssh_to_ecs_cluster
+ ;;
+ list-clusters)
+ list_clusters
+ ;;
+ push2aws)
+ [[ -z "${DEPLOYTAG}" ]] && error 'Missing required option --deploy-tag'
+ verify_images_in_ecr
+ ;;
+ destroy)
+ destroy_dev_services $FORCE
+ ;;
+ *)
+ error "Missing required subcommand. "
+esac
+
+# Default to us-east-1 region
+if [[ -z "${REGION}" ]] ; then
+ warn "Missing option --region, defaulting to ${REGION}"
+fi
+
+if [[ -z "${REGISTRY_PREFIX}" ]] ; then
+ warn "Missing option --registry-prefix, defaulting to ${REGISTRY_PREFIX}"
+fi
diff --git a/ops_omgx/check-containers-env-vars.sh b/ops_omgx/check-containers-env-vars.sh
new file mode 100644
index 000000000000..b25d55676cab
--- /dev/null
+++ b/ops_omgx/check-containers-env-vars.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+SERVICE_IMAGES=$(docker ps|grep omgx|awk '{print $2}'|tr '\n' ' ')
+#COMMAND=$(docker ps --no-trunc|grep $SERVICE|awk '{print $3}'|sed 's#"##g')
+
+for srv in $SERVICE_IMAGES; do
+
+ CONTAINER_ID=$(docker ps|grep $SERVICE|awk '{print $1}')
+ PIDS=$(docker exec -it $CONTAINER_ID ps xua|egrep -v 'ps|PID'|awk '{print $2}'|tr '\n' ' ')
+ echo "\n IMAGE: $SERVICE \n ---------"
+ for PID in $PIDS; do
+ ENVIRON=$(docker exec -it $CONTAINER_ID cat /proc/$PID/environ|tr '\0' '\n' )
+ echo "ENVIRONMENT-VARIABLES: \n $ENVIRON \n -------- \n"
+ done
+done
diff --git a/ops_omgx/cloudformation/00-infrastructure-core.yaml b/ops_omgx/cloudformation/00-infrastructure-core.yaml
new file mode 100644
index 000000000000..a8fa67eee435
--- /dev/null
+++ b/ops_omgx/cloudformation/00-infrastructure-core.yaml
@@ -0,0 +1,273 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Core Dev Infrastructure"
+
+Parameters:
+
+ IPv4CidrBlock:
+ Description: IPv4 range to pick IPs from (should be a /22 else IPs are wasted)
+ Type: String
+ AllowedPattern: '((\d{1,3})\.){3}\d{1,3}/\d{1,2}'
+ Default: 10.0.0.0/22
+
+ Route53HostedZoneName:
+ Description: The Route 53 zone to create
+ Type: String
+ Default: dev-integration.omgx.network
+
+Metadata:
+ AWS::CloudFormation::Interface:
+ ParameterGroups:
+ - Label:
+ default: Networking
+ Parameters:
+ - IPv4CidrBlock
+ ParameterLabels:
+ IPv4CidrBlock:
+ default: IPv4 range to pick IPs from
+
+Resources:
+ VPC:
+ Type: AWS::EC2::VPC
+ Properties:
+ CidrBlock: !Ref IPv4CidrBlock
+ EnableDnsSupport: true
+ Tags:
+ - Key: Name
+ Value: !Ref AWS::StackName
+
+ InternetGateway:
+ Type: AWS::EC2::InternetGateway
+ Properties:
+ Tags:
+ - Key: Name
+ Value: !Ref AWS::StackName
+
+ InternetGatewayAttachment: # For IPv4
+ Type: AWS::EC2::VPCGatewayAttachment
+ Properties:
+ InternetGatewayId: !Ref InternetGateway
+ VpcId: !Ref VPC
+
+ EgressOnlyInternetGateway: # For IPv6
+ Type: AWS::EC2::EgressOnlyInternetGateway
+ Properties:
+ VpcId: !Ref VPC
+
+ IPv6CidrBlock:
+ Type: AWS::EC2::VPCCidrBlock
+ Properties:
+ VpcId: !Ref VPC
+ AmazonProvidedIpv6CidrBlock: true
+
+ NATGateway1EIP:
+ Type: AWS::EC2::EIP
+ DependsOn: InternetGatewayAttachment
+ Properties:
+ Domain: vpc
+
+ NATGateway2EIP:
+ Type: AWS::EC2::EIP
+ DependsOn: InternetGatewayAttachment
+ Properties:
+ Domain: vpc
+
+ PublicSubnet1:
+ Type: AWS::EC2::Subnet
+ DependsOn: IPv6CidrBlock
+ Properties:
+ AvailabilityZone: !Select [0, "Fn::GetAZs": !Ref "AWS::Region"]
+ CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 4, 8]]
+ Ipv6CidrBlock: !Select [0, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 256, 64]]
+ AssignIpv6AddressOnCreation: true
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-Public-${AZ}", {AZ: !Select [0, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ PublicSubnet2:
+ Type: AWS::EC2::Subnet
+ DependsOn: IPv6CidrBlock
+ Properties:
+ AvailabilityZone: !Select [1, "Fn::GetAZs": !Ref "AWS::Region"]
+ CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 4, 8]]
+ Ipv6CidrBlock: !Select [1, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 256, 64]]
+ AssignIpv6AddressOnCreation: true
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-Public-${AZ}", {AZ: !Select [1, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ PrivateSubnet1:
+ Type: AWS::EC2::Subnet
+ DependsOn: IPv6CidrBlock
+ Properties:
+ AvailabilityZone: !Select [0, "Fn::GetAZs": !Ref "AWS::Region"]
+ CidrBlock: !Select [2, !Cidr [!GetAtt VPC.CidrBlock, 4, 8]]
+ Ipv6CidrBlock: !Select [2, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 256, 64]]
+ AssignIpv6AddressOnCreation: true
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-Private-${AZ}", {AZ: !Select [0, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ PrivateSubnet2:
+ Type: AWS::EC2::Subnet
+ DependsOn: IPv6CidrBlock
+ Properties:
+ AvailabilityZone: !Select [1, "Fn::GetAZs": !Ref "AWS::Region"]
+ CidrBlock: !Select [3, !Cidr [!GetAtt VPC.CidrBlock, 4, 8]]
+ Ipv6CidrBlock: !Select [3, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 256, 64]]
+ AssignIpv6AddressOnCreation: true
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-Private-${AZ}", {AZ: !Select [1, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ NATGateway1:
+ Type: AWS::EC2::NatGateway
+ DependsOn: InternetGatewayAttachment
+ Properties:
+ AllocationId: !GetAtt NATGateway1EIP.AllocationId
+ SubnetId: !Ref PublicSubnet1
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-${AZ}", {AZ: !Select [0, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ NATGateway2:
+ Type: AWS::EC2::NatGateway
+ DependsOn: InternetGatewayAttachment
+ Properties:
+ AllocationId: !GetAtt NATGateway2EIP.AllocationId
+ SubnetId: !Ref PublicSubnet2
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-${AZ}", {AZ: !Select [1, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ PublicRouteTable:
+ Type: AWS::EC2::RouteTable
+ Properties:
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub "${AWS::StackName}-Public"
+
+ PrivateRouteTable1:
+ Type: AWS::EC2::RouteTable
+ Properties:
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-Private-${AZ}", {AZ: !Select [0, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ PrivateRouteTable2:
+ Type: AWS::EC2::RouteTable
+ Properties:
+ VpcId: !Ref VPC
+ Tags:
+ - Key: Name
+ Value: !Sub ["${AWS::StackName}-Private-${AZ}", {AZ: !Select [1, "Fn::GetAZs": !Ref "AWS::Region"]}]
+
+ PublicDefaultRoute: # IPv4
+ DependsOn: InternetGatewayAttachment
+ Type: AWS::EC2::Route
+ Properties:
+ RouteTableId: !Ref PublicRouteTable
+ DestinationCidrBlock: 0.0.0.0/0
+ GatewayId: !Ref InternetGateway
+
+ PublicDefaultRouteV6:
+ DependsOn: EgressOnlyInternetGateway
+ Type: AWS::EC2::Route
+ Properties:
+ RouteTableId: !Ref PublicRouteTable
+ DestinationIpv6CidrBlock: ::/0
+ GatewayId: !Ref InternetGateway
+
+ PrivateDefaultRoute1: # IPv4
+ DependsOn: NATGateway1
+ Type: AWS::EC2::Route
+ Properties:
+ RouteTableId: !Ref PrivateRouteTable1
+ DestinationCidrBlock: 0.0.0.0/0
+ NatGatewayId: !Ref NATGateway1
+
+ PrivateDefaultRoute1v6:
+ Type: AWS::EC2::Route
+ Properties:
+ RouteTableId: !Ref PrivateRouteTable1
+ DestinationIpv6CidrBlock: ::/0
+ EgressOnlyInternetGatewayId: !Ref EgressOnlyInternetGateway
+
+ PrivateDefaultRoute2: # IPv4
+ DependsOn: NATGateway2
+ Type: AWS::EC2::Route
+ Properties:
+ RouteTableId: !Ref PrivateRouteTable2
+ DestinationCidrBlock: 0.0.0.0/0
+ NatGatewayId: !Ref NATGateway2
+
+ PrivateDefaultRoute2v6:
+ Type: AWS::EC2::Route
+ Properties:
+ RouteTableId: !Ref PrivateRouteTable2
+ DestinationIpv6CidrBlock: ::/0
+ EgressOnlyInternetGatewayId: !Ref EgressOnlyInternetGateway
+
+ PublicSubnet1RouteTableAssociation:
+ Type: AWS::EC2::SubnetRouteTableAssociation
+ Properties:
+ RouteTableId: !Ref PublicRouteTable
+ SubnetId: !Ref PublicSubnet1
+
+ PublicSubnet2RouteTableAssociation:
+ Type: AWS::EC2::SubnetRouteTableAssociation
+ Properties:
+ RouteTableId: !Ref PublicRouteTable
+ SubnetId: !Ref PublicSubnet2
+
+ PrivateSubnet1RouteTableAssociation:
+ Type: AWS::EC2::SubnetRouteTableAssociation
+ Properties:
+ RouteTableId: !Ref PrivateRouteTable1
+ SubnetId: !Ref PrivateSubnet1
+
+ PrivateSubnet2RouteTableAssociation:
+ Type: AWS::EC2::SubnetRouteTableAssociation
+ Properties:
+ RouteTableId: !Ref PrivateRouteTable2
+ SubnetId: !Ref PrivateSubnet2
+
+ Route53HostedZone:
+ Type: AWS::Route53::HostedZone
+ Properties:
+ Name: !Ref Route53HostedZoneName
+
+Outputs:
+ VpcId:
+ Value: !Ref VPC
+ Export:
+ Name: !Sub "${AWS::StackName}:VpcId"
+ PublicSubnet1:
+ Value: !Ref PublicSubnet1
+ Export:
+ Name: !Sub "${AWS::StackName}:PublicSubnet1"
+ PublicSubnet2:
+ Value: !Ref PublicSubnet2
+ Export:
+ Name: !Sub "${AWS::StackName}:PublicSubnet2"
+ PrivateSubnet1:
+ Value: !Ref PrivateSubnet1
+ Export:
+ Name: !Sub "${AWS::StackName}:PrivateSubnet1"
+ PrivateSubnet2:
+ Value: !Ref PrivateSubnet2
+ Export:
+ Name: !Sub "${AWS::StackName}:PrivateSubnet2"
+ Route53HostedZoneName:
+ Value: !Ref Route53HostedZoneName
+ Export:
+ Name: !Sub "${AWS::StackName}:Route53HostedZoneName"
+ Route53HostedZoneID:
+ Value: !Ref Route53HostedZone
+ Export:
+ Name: !Sub "${AWS::StackName}:Route53HostedZoneID"
diff --git a/ops_omgx/cloudformation/01-acm-route53-auto-approver-lambda.yaml b/ops_omgx/cloudformation/01-acm-route53-auto-approver-lambda.yaml
new file mode 100644
index 000000000000..687d96d75ed7
--- /dev/null
+++ b/ops_omgx/cloudformation/01-acm-route53-auto-approver-lambda.yaml
@@ -0,0 +1,121 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Lambda to create Route 53 resources for automatic ACM approval"
+
+Resources:
+
+ AcmRoute53ApproverLambdaRole:
+ Type: "AWS::IAM::Role"
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: "2012-10-17"
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: lambda.amazonaws.com
+ Action: "sts:AssumeRole"
+ Path: "/"
+ Policies:
+ - PolicyName: "AcmCfnLambdaPolicy"
+ PolicyDocument:
+ Version: "2012-10-17"
+ Statement:
+ - Effect: "Allow"
+ Action:
+ - "logs:CreateLogGroup"
+ - "logs:CreateLogStream"
+ - "logs:PutLogEvents"
+ Resource: "*"
+ - Effect: "Allow"
+ Action: # TODO: scope these down
+ - "acm:DescribeCertificate"
+ - "route53:ChangeResourceRecordSets"
+ - "route53:GetHostedZone"
+ - "route53:GetChange"
+ - "route53:GetChangeRequest"
+ - "cloudformation:CreateStack"
+ - "cloudformation:DeleteStack"
+ - "cloudformation:DescribeStackResources"
+ Resource: "*"
+
+ AcmRoute53ApproverLambda:
+ Type: AWS::Lambda::Function
+ Properties:
+ Description: Cloudformation Custom Resource for ACM certs using Route53 approval
+ Handler: index.acm_certificate
+ MemorySize: 128
+ Runtime: python3.7
+ Timeout: 300
+ Role:
+ Fn::GetAtt: AcmRoute53ApproverLambdaRole.Arn
+ Code:
+ ZipFile: |
+ import cfnresponse
+ import boto3, json, time
+
+ def acm_certificate(event, context):
+ print(event)
+
+ acm = boto3.client("acm")
+ cfn = boto3.client("cloudformation")
+
+ for i in range(10):
+ print("Loop number {}".format(i))
+
+ response = cfn.describe_stack_resources(StackName=event["StackId"], LogicalResourceId=event["ResourceProperties"]["CloudFormationResourceName"])
+ print("Stack resource:")
+ print(response)
+
+ stack_name = "{}-{}-route53-approval".format(event["ResourceProperties"]["CloudFormationStackName"], event["ResourceProperties"]["CloudFormationResourceName"])
+
+ if event["RequestType"] == "Create":
+
+ try:
+ certificate_arn = response["StackResources"][0]["PhysicalResourceId"]
+ response = acm.describe_certificate(CertificateArn=certificate_arn)
+ resource_record = response["Certificate"]["DomainValidationOptions"][0]["ResourceRecord"]
+
+ except:
+ print("ARN not yet available")
+ continue
+
+ resp = cfn.create_stack(
+ StackName=stack_name,
+ TemplateBody=json.dumps(
+ {
+ "Description": "ACM verification record for {}".format(response["Certificate"]["DomainName"]),
+ "Resources": {
+ event["ResourceProperties"]["CloudFormationResourceName"]: {
+ "Type": "AWS::Route53::RecordSet",
+ "Properties": {
+ "Comment": "ACM verification record",
+ "Name": resource_record["Name"],
+ "ResourceRecords": [resource_record["Value"]],
+ "Type": resource_record["Type"],
+ "HostedZoneId": event["ResourceProperties"]["HostedZoneId"],
+ "TTL": 86400,
+ },
+ }
+ },
+ },
+ indent=2,
+ ),
+ )
+ print(resp)
+ return cfnresponse.send(event, context, cfnresponse.SUCCESS, {})
+
+ elif event["RequestType"] == "Delete":
+ print("Deleting stack")
+ resp = cfn.delete_stack(StackName=stack_name)
+ print(resp)
+ return cfnresponse.send(event, context, cfnresponse.SUCCESS, {})
+ time.sleep(30)
+
+ # if we're not done in 10 tries, fail
+ return cfnresponse.send(event, context, cfnresponse.FAILED, {})
+
+
+Outputs:
+ AcmRoute53ApproverLambdaArn:
+ Value: !GetAtt AcmRoute53ApproverLambda.Arn
+ Export:
+ Name: !Sub "${AWS::StackName}:AcmRoute53ApproverLambdaArn"
diff --git a/ops_omgx/cloudformation/02-cf-helper-ELBv2-rule-priority.yml b/ops_omgx/cloudformation/02-cf-helper-ELBv2-rule-priority.yml
new file mode 100644
index 000000000000..bf55065d4535
--- /dev/null
+++ b/ops_omgx/cloudformation/02-cf-helper-ELBv2-rule-priority.yml
@@ -0,0 +1,77 @@
+AWSTemplateFormatVersion: '2010-09-09'
+Description: 'CloudFormation helper that gets the next available rule priority from an ELBv2 listener'
+
+Resources:
+ Role:
+ Type: 'AWS::IAM::Role'
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: '2012-10-17'
+ Statement:
+ - Effect: 'Allow'
+ Principal:
+ Service: !Sub "lambda.${AWS::URLSuffix}"
+ Action: 'sts:AssumeRole'
+ Policies:
+ - PolicyName: AllowDescribeRules # DescribeRules doesn't support resource level permissions anyway
+ PolicyDocument:
+ Version: '2012-10-17'
+ Statement:
+ - Effect: 'Allow'
+ Action:
+ - 'elasticloadbalancing:DescribeRules'
+ Resource:
+ - '*'
+
+ Policy:
+ Type: 'AWS::IAM::ManagedPolicy'
+ Properties:
+ PolicyDocument:
+ Version: '2012-10-17'
+ Statement:
+ - Effect: 'Allow'
+ Action: 'lambda:InvokeFunction'
+ Resource: !GetAtt Function.Arn
+
+ Function:
+ Type: 'AWS::Lambda::Function'
+ Properties:
+ Runtime: 'nodejs10.x' # was nodejs8.10
+ Role: !GetAtt Role.Arn
+ Handler: 'index.handler'
+ FunctionName: !Ref AWS::StackName
+ ReservedConcurrentExecutions: 1 # IMPORTANT: Never set to more than 1, otherwise it won't be consistent
+ Code:
+ ZipFile: |
+ const Response = require('cfn-response');
+ const AWS = require('aws-sdk');
+
+ const ELBv2 = new AWS.ELBv2();
+
+ exports.handler = function (event, context, callback) {
+ let listenerArn = event.ResourceProperties.ListenerArn;
+ ELBv2.describeRules({ListenerArn: listenerArn}, function (err, data) {
+ if (err) {
+ console.log(err, err.stack);
+ callback();
+ Response.send(event, context, Response.FAILED);
+ } else {
+ let result = data.Rules.reduce((max, rule) => Math.max(max, parseInt(rule.Priority) || 0), 0) + 1;
+ Response.send(event, context, Response.SUCCESS, {Value: result}, listenerArn + ':RulePriority:' + result);
+ }
+ });
+ };
+
+Outputs:
+ RoleOutput:
+ Value: !GetAtt Role.Arn
+ Export:
+ Name: !Sub "${AWS::StackName}:Role"
+ FunctionOutput:
+ Value: !GetAtt Function.Arn
+ Export:
+ Name: !Sub "${AWS::StackName}:Function"
+ PolicyOutput:
+ Value: !Ref Policy
+ Export:
+ Name: !Sub "${AWS::StackName}:Policy"
diff --git a/ops_omgx/cloudformation/03-infrastructure-application.yaml b/ops_omgx/cloudformation/03-infrastructure-application.yaml
new file mode 100644
index 000000000000..248ada802ad4
--- /dev/null
+++ b/ops_omgx/cloudformation/03-infrastructure-application.yaml
@@ -0,0 +1,350 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Application Infrastructure"
+
+Parameters:
+
+ EcsImageId:
+ # TODO: Implement automatic update or notifications: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS-AMI-SubscribeTopic.html
+ Description: Image ID for running the ECS Cluster instances
+ Type: AWS::SSM::Parameter::Value
+ Default: /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id
+
+ EcsInstanceType:
+ # https://aws.amazon.com/ec2/instance-types/
+ # The types of instances is limited to avoid mistakes generating huge costs by putting the wrong instance type.
+ Description: Type of instances to be added to the ECS cluster
+ Type: String
+ Default: t3a.xlarge
+
+ EcsMinSize:
+ Description: Minimum number of instances in the ECS cluster
+ Type: Number
+ Default: 1
+ MinValue: 1
+ MaxValue: 1 # This is set to prevent accidental huge costs
+
+ EcsMaxSize:
+ Description: Maximum number of instances in the ECS cluster
+ Type: Number
+ Default: 1
+ MinValue: 1
+ MaxValue: 1 # This is set to prevent accidental huge costs
+
+ EcsDesiredCapacity:
+ Description: Default number of instances in the ECS cluster
+ Type: Number
+ Default: 1
+ MinValue: 1
+ MaxValue: 1 # This is set to prevent accidental huge costs
+
+ DomainName:
+ Description: The domain for the Common Name of the wildcard certificate on the Load Balancer listener
+ Type: String
+ Default: dev-integration.omgx.network
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-core
+
+
+Metadata:
+ AWS::CloudFormation::Interface:
+ ParameterGroups:
+ - Label:
+ default: Compute
+ Parameters:
+ - ECSInstanceType
+ - ECSMinSize
+ - ECSMaxSize
+ - ECSDesiredCapacity
+ - ECSImageId
+ ParameterLabels:
+ InstanceType:
+ default: AWS EC2 Instance Type for ECS nodes
+ ECSMinSize:
+ default: Minimum number of instances in the ECS cluster
+ ECSMaxSize:
+ default: Maximum number of instances in the ECS cluster
+ ECSDesiredCapacity:
+ default: Default number of instances in the ECS cluster
+
+Resources:
+
+ FileSystem:
+ Type: AWS::EFS::FileSystem
+ Properties:
+ FileSystemTags:
+ - Key: Name
+ Value:
+ Ref: InfrastructureStackName
+
+ LoadBalancerIntSecurityGroup:
+ Type: AWS::EC2::SecurityGroup
+ Properties:
+ GroupDescription: !Sub "SG for ${AWS::StackName} Internal LB"
+ VpcId:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId"
+ SecurityGroupIngress:
+ - IpProtocol: tcp
+ FromPort: 80
+ ToPort: 80
+ CidrIp: 0.0.0.0/0
+ - IpProtocol: tcp
+ FromPort: 8081
+ ToPort: 8081
+ CidrIp: 0.0.0.0/0
+ - IpProtocol: tcp
+ FromPort: 8081
+ ToPort: 8081
+ CidrIpv6: ::/0
+ - IpProtocol: tcp
+ FromPort: 80
+ ToPort: 80
+ CidrIpv6: ::/0
+ Tags:
+ - Key: Name
+ Value: !Sub "${AWS::StackName}-IntLB"
+
+ LoadBalancerSecurityGroup:
+ Type: AWS::EC2::SecurityGroup
+ Properties:
+ GroupDescription: !Sub "SG for ${AWS::StackName} External LB"
+ VpcId:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId"
+ SecurityGroupIngress:
+ - IpProtocol: tcp
+ FromPort: 8545
+ ToPort: 8545
+ CidrIp: 0.0.0.0/0
+ - IpProtocol: tcp
+ FromPort: 8545
+ ToPort: 8545
+ CidrIpv6: ::/0
+ - IpProtocol: tcp
+ FromPort: 8546
+ ToPort: 8546
+ CidrIp: 0.0.0.0/0
+ - IpProtocol: tcp
+ FromPort: 8546
+ ToPort: 8546
+ CidrIpv6: ::/0
+ - IpProtocol: tcp
+ FromPort: 443
+ ToPort: 443
+ CidrIp: 0.0.0.0/0
+ - IpProtocol: tcp
+ FromPort: 443
+ ToPort: 443
+ CidrIpv6: ::/0
+ - IpProtocol: tcp
+ FromPort: 80
+ ToPort: 80
+ CidrIp: 0.0.0.0/0
+ - IpProtocol: tcp
+ FromPort: 80
+ ToPort: 80
+ CidrIpv6: ::/0
+ Tags:
+ - Key: Name
+ Value: !Sub "${AWS::StackName}-LB"
+
+ LoadBalancerInt:
+ Type: AWS::ElasticLoadBalancingV2::LoadBalancer
+ Properties:
+ Scheme: internal
+ LoadBalancerAttributes:
+ - Key: idle_timeout.timeout_seconds
+ Value: '3600'
+ SecurityGroups:
+ - !Ref LoadBalancerIntSecurityGroup
+ Subnets:
+ - Fn::ImportValue: !Sub ${InfrastructureStackName}:PrivateSubnet1
+ - Fn::ImportValue: !Sub ${InfrastructureStackName}:PrivateSubnet2
+
+ LoadBalancer:
+ Type: AWS::ElasticLoadBalancingV2::LoadBalancer
+ Properties:
+ IpAddressType: dualstack
+ Scheme: internet-facing
+ SecurityGroups:
+ - !Ref LoadBalancerSecurityGroup
+ Subnets:
+ - Fn::ImportValue: !Sub ${InfrastructureStackName}:PublicSubnet1
+ - Fn::ImportValue: !Sub ${InfrastructureStackName}:PublicSubnet2
+
+ DeployerListener:
+ Type: AWS::ElasticLoadBalancingV2::Listener
+ Properties:
+ LoadBalancerArn: !Ref LoadBalancerInt
+ Port: 8081
+ Protocol: HTTP
+ DefaultActions:
+ - Type: fixed-response
+ FixedResponseConfig:
+ ContentType: text/html
+ MessageBody: ""
+ StatusCode: 404
+
+ DataTransportLayerListener:
+ Type: AWS::ElasticLoadBalancingV2::Listener
+ Properties:
+ LoadBalancerArn: !Ref LoadBalancerInt
+ Port: 80
+ Protocol: HTTP
+ DefaultActions:
+ - Type: fixed-response
+ FixedResponseConfig:
+ ContentType: text/html
+ MessageBody: ""
+ StatusCode: 404
+
+ EcsCluster:
+ Type: AWS::ECS::Cluster
+
+ EcsInstanceRole:
+ Type: AWS::IAM::Role
+ Properties:
+ ManagedPolicyArns:
+ - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
+ - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
+ AssumeRolePolicyDocument:
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: [!Sub "ec2.${AWS::URLSuffix}"]
+ Action: ["sts:AssumeRole"]
+ Policies:
+ - PolicyName: AllowAccessToELB
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "ec2:*"
+ - "ec2:Describe*"
+ - "elasticloadbalancing:*"
+ - "elasticloadbalancing:Describe*"
+ - "elasticloadbalancing:RegisterInstancesWithLoadBalancer"
+ - "elasticloadbalancing:DeregisterTargets"
+ - "elasticloadbalancing:DescribeTargetGroups"
+ - "elasticloadbalancing:DescribeTargetHealth"
+ - "elasticloadbalancing:RegisterTargets"
+ Resource: "*"
+
+ EcsInstanceProfile:
+ Type: AWS::IAM::InstanceProfile
+ Properties:
+ Roles: [!Ref EcsInstanceRole]
+
+ EcsSecurityGroup:
+ Type: AWS::EC2::SecurityGroup
+ Properties:
+ GroupDescription: !Sub "SG for ${AWS::StackName} Landscape ECS Cluster"
+ VpcId:
+ Fn::ImportValue: !Sub ${InfrastructureStackName}:VpcId
+ SecurityGroupIngress:
+ - SourceSecurityGroupId: !Ref LoadBalancerIntSecurityGroup
+ IpProtocol: tcp
+ FromPort: 22
+ ToPort: 65535
+ - SourceSecurityGroupId: !Ref LoadBalancerSecurityGroup
+ IpProtocol: tcp
+ FromPort: 22
+ ToPort: 65535
+ Tags:
+ - Key: Name
+ Value: !Sub "${AWS::StackName}-ECS-Cluster"
+
+ EcsLaunchConfiguration:
+ Type: AWS::AutoScaling::LaunchConfiguration
+ Metadata:
+ AWS::CloudFormation::Init:
+ config:
+ files:
+ '/etc/ecs/ecs.config':
+ content: !Sub |
+ ECS_CLUSTER=${EcsCluster}
+ ECS_ENABLE_TASK_IAM_ROLE=true
+ mode: "000644"
+ owner: root
+ group: root
+ Properties:
+ InstanceType: !Ref EcsInstanceType
+ SecurityGroups:
+ - !Ref EcsSecurityGroup
+ IamInstanceProfile: !Ref EcsInstanceProfile
+ ImageId: !Ref EcsImageId
+ UserData:
+ Fn::Base64: !Sub |
+ #!/bin/bash -ex
+ yum -y install aws-cfn-bootstrap amazon-ssm-agent amazon-efs-utils
+ systemctl enable --now amazon-ssm-agent
+ mkdir -p /mnt/efs /mnt/efs/db
+ /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EcsLaunchConfiguration --region ${AWS::Region}
+ /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region} || true
+
+ AutoScalingGroup:
+ Type: AWS::AutoScaling::AutoScalingGroup
+ Properties:
+ LaunchConfigurationName: !Ref EcsLaunchConfiguration
+ MetricsCollection:
+ - Granularity: 1Minute
+ Metrics:
+ - GroupTotalInstances
+ MinSize: !Ref EcsMinSize
+ MaxSize: !Ref EcsMaxSize
+ DesiredCapacity: !Ref EcsDesiredCapacity
+ VPCZoneIdentifier:
+ - Fn::ImportValue: !Sub ${InfrastructureStackName}:PrivateSubnet1
+ - Fn::ImportValue: !Sub ${InfrastructureStackName}:PrivateSubnet2
+ Tags:
+ - Key: Name
+ Value: !Sub "${AWS::StackName}-ECS"
+ PropagateAtLaunch: true
+
+Outputs:
+ EcsCluster:
+ Value: !Ref EcsCluster
+ Export:
+ Name: !Sub "${InfrastructureStackName}:EcsCluster"
+ EcsSecurityGroup:
+ Value: !Ref EcsSecurityGroup
+ Export:
+ Name: !Sub "${InfrastructureStackName}:EcsSecurityGroup"
+ DomainName:
+ Value: !Ref DomainName
+ Export:
+ Name: !Sub "${InfrastructureStackName}:DomainName"
+ LoadBalancerIntDNSName:
+ Value: !GetAtt LoadBalancerInt.DNSName
+ Export:
+ Name: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ LoadBalancerDNSName:
+ Value: !GetAtt LoadBalancer.DNSName
+ Export:
+ Name: !Sub "${InfrastructureStackName}:LoadBalancer:DNSName"
+ LoadBalancerIntArn:
+ Value: !Ref LoadBalancerInt
+ Export:
+ Name: !Sub "${InfrastructureStackName}:LoadBalancerInt:ARN"
+ LoadBalancerArn:
+ Value: !Ref LoadBalancer
+ Export:
+ Name: !Sub "${InfrastructureStackName}:LoadBalancer:ARN"
+ LoadBalancerCanonicalHostedZoneID:
+ Value: !GetAtt LoadBalancerInt.CanonicalHostedZoneID
+ Export:
+ Name: !Sub "${InfrastructureStackName}:LoadBalancer:CanonicalHostedZoneID"
+ DeployerListener:
+ Value: !Ref DeployerListener
+ Export:
+ Name: !Sub "${InfrastructureStackName}:DeployerListener"
+ DataTransportLayerListener:
+ Value: !Ref DataTransportLayerListener
+ Export:
+ Name: !Sub "${InfrastructureStackName}:DataTransportLayerListener"
+ EFSFilesystem:
+ Value: !Ref FileSystem
+ Export:
+ Name: !Sub "${InfrastructureStackName}:EFSFilesystem"
diff --git a/ops_omgx/cloudformation/04-l1-l2-test-scheduled-ecs-task.yaml b/ops_omgx/cloudformation/04-l1-l2-test-scheduled-ecs-task.yaml
new file mode 100644
index 000000000000..7f8877d6ad06
--- /dev/null
+++ b/ops_omgx/cloudformation/04-l1-l2-test-scheduled-ecs-task.yaml
@@ -0,0 +1,179 @@
+AWSTemplateFormatVersion: '2010-09-09'
+Description: Amazon ECS Time and Event-Based Task Scheduling with CloudFormation.
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: integration
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: latest
+
+
+ L1L2TestImage:
+ Type: String
+ Default: l1-l2-test
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ LogsRetention:
+ Type: Number
+ Default: 7
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: integration-infrastructure-core
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+ SchedulerTasksCount:
+ Type: Number
+ Default: '1'
+ Description: Maximum number of Tasks that you want to the Scheduler to run
+ CronOrRate:
+ Type: String
+ Default: cron
+ AllowedValues:
+ - cron
+ - rate
+ Description: Choose to use a cron expression or a rate expression you want to
+ use.
+ CronSchedule:
+ Type: String
+ Default: cron(00 * ? * * *)
+ Description: This defines the Schedule at which to run the. Cron Expressions -
+ http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions
+ RateSchedule:
+ Type: String
+ Default: rate(1 hour)
+ Description: This defines the Schedule at which to run the. Rate Expressions -
+ http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#RateExpressions
+
+Conditions:
+ CronRate:
+ Fn::Equals:
+ - Ref: CronOrRate
+ - cron
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ - "cloudwatch:DescribeAlarms"
+ - "cloudwatch:PutMetricAlarm"
+ - "ecs:DescribeServices"
+ - "ecs:UpdateService"
+ - "ecs:RunTask"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ L1L2TestLogGroup:
+ Type: AWS::Logs::LogGroup
+ Properties:
+ RetentionInDays: 7
+ LogGroupName: !Sub "/omgx/${EnvironmentName}/l1-l2-test/${ImageTag}"
+
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${L1L2TestImage}:${ImageTag}"
+ Name: l1-l2-test
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: L2_NODE_WEB3_URL
+ Value: !Sub
+ - "https://${EndpointAddress}"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ EntryPoint:
+ - "/opt/run_test.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["l1-l2-test"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "l1-l2-test", "service": "l1-l2-test"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "L1L2Test-${EnvironmentName}"
+
+ L1L2TestScheduleIAMPolicy:
+ Type: AWS::IAM::ManagedPolicy
+ Properties:
+ ManagedPolicyName: L1L2-Test-Schedule-Policy
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - ecs:RunTask
+ - iam:PassRole
+ Resource: "*"
+
+ L1L2TestScheduleIAMRole:
+ Type: AWS::IAM::Role
+ Properties:
+ RoleName: L1L2-Test-Schedule-Policy-Role
+ Path: /
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: events.amazonaws.com
+ Action: sts:AssumeRole
+ ManagedPolicyArns:
+ - !Ref L1L2TestScheduleIAMPolicy
+
+ L1L2TestSchedule:
+ Type: AWS::Events::Rule
+ DependsOn: TaskDefinition
+ Properties:
+ State: ENABLED
+ ScheduleExpression: cron(*/15 * * * ? *)
+ Name: l1-l2-test-rule
+ Targets:
+ - Arn:
+ Fn::Sub:
+ - "arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${Cluster}"
+ - Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ Id: 1
+ EcsParameters:
+ LaunchType: EC2
+ TaskDefinitionArn: !Ref TaskDefinition
+ TaskCount: 1
+ RoleArn: !GetAtt L1L2TestScheduleIAMRole.Arn
diff --git a/ops_omgx/cloudformation/batch-submitter.yaml b/ops_omgx/cloudformation/batch-submitter.yaml
new file mode 100644
index 000000000000..d79bb58a18cf
--- /dev/null
+++ b/ops_omgx/cloudformation/batch-submitter.yaml
@@ -0,0 +1,125 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Batch Submitter Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+
+ BatchSubmitterImage:
+ Type: String
+ Default: batch-submitter
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ LogsRetention:
+ Type: Number
+ Default: 7
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ BatchSubmitterLogGroup:
+ Type: AWS::Logs::LogGroup
+ Properties:
+ RetentionInDays: 7
+ LogGroupName: !Sub "/omgx/${EnvironmentName}/batch-submitter/${ImageTag}"
+
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${BatchSubmitterImage}:${ImageTag}"
+ Name: batch_submitter
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: URL
+ Value: !Sub
+ - "http://${EndpointAddress}:8081/addresses.json"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: L2_NODE_WEB3_URL
+ Value: !Sub
+ - "https://${EndpointAddress}"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ - Name: DEPLOYER_HTTP
+ Value: !Sub
+ - "http://${EndpointAddress}:8081"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: RETRIES
+ Value: 3600
+ - Name: POLL_INTERVAL
+ Value: 15000
+ EntryPoint:
+ - "/opt/optimism/packages/batch-submitter/batches.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["batch_submitter"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "batch_submitter", "service": "batch_submitter"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "BatchSubmitter-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "BatchSubmitter-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/data-transport-layer.yaml b/ops_omgx/cloudformation/data-transport-layer.yaml
new file mode 100644
index 000000000000..e8130d6e26c7
--- /dev/null
+++ b/ops_omgx/cloudformation/data-transport-layer.yaml
@@ -0,0 +1,195 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Data Transport Layer Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ CFHelperELBv2RulePriorityStack:
+ Type: String
+ Default: CF-Helper-ELBv2-Rule-Priority
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ DataTransportLayerImage:
+ Type: String
+ Default: data-transport-layer
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ DataTransportLayerLBTargetGroup:
+ Type: AWS::ElasticLoadBalancingV2::TargetGroup
+ Properties:
+ Port: 80
+ Protocol: HTTP
+ VpcId:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId"
+ TargetGroupAttributes:
+ - Key: deregistration_delay.timeout_seconds
+ Value: 30
+ HealthCheckIntervalSeconds: 60
+ HealthCheckPath: /health
+ HealthCheckProtocol: HTTP # TODO Implement proper healthcheck
+ HealthCheckTimeoutSeconds: 15
+ HealthyThresholdCount: 3
+ UnhealthyThresholdCount: 10
+ Matcher:
+ HttpCode: 200
+ DataTransportLayerLBListenerRulePriority:
+ Type: AWS::CloudFormation::CustomResource
+ Properties:
+ ServiceToken:
+ Fn::ImportValue: !Sub "${CFHelperELBv2RulePriorityStack}:Function"
+ ListenerArn:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DataTransportLayerListener"
+ DataTransportLayerListenerRule:
+ Type: AWS::ElasticLoadBalancingV2::ListenerRule
+ Properties:
+ Actions:
+ - Type: forward
+ TargetGroupArn: !Ref DataTransportLayerLBTargetGroup
+ Conditions:
+ - Field: host-header
+ HostHeaderConfig:
+ Values:
+ - Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ ListenerArn:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DataTransportLayerListener"
+ Priority: !GetAtt DataTransportLayerLBListenerRulePriority.Value
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ Properties:
+ Volumes:
+ - Name: db
+ Host:
+ SourcePath: "/mnt/efs/db"
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${DataTransportLayerImage}:${ImageTag}"
+ Name: data_transport_layer
+ PortMappings:
+ - ContainerPort: 7878
+ HostPort: 0
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: RETRIES
+ Value: 3600
+ - Name: DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT
+ Value: !Sub
+ - "https://${EndpointAddress}/"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ - Name: DEPLOYER_HTTP
+ Value: !Sub
+ - "http://${EndpointAddress}:8081"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: URL
+ Value: !Sub
+ - "http://${EndpointAddress}:8081/addresses.json"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: DATA_TRANSPORT_LAYER__SERVER_PORT
+ Value: 7878
+ EntryPoint:
+ - "/opt/optimism/packages/data-transport-layer/dtl.sh"
+ MountPoints:
+ - ContainerPath: "/db"
+ SourceVolume: db
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["data_transport_layer"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "data_transport_layer", "service": "data_transport_layer"}]'
+ Essential: true
+ Memory: "512"
+ - Image: 942431445534.dkr.ecr.us-east-1.amazonaws.com/omgx/nginx-eth-proxy:data_tr_layer
+ Name: nginx-dtl
+ PortMappings:
+ - ContainerPort: 80
+ HostPort: 0
+ Environment:
+ - Name: SEQUENCER
+ Value: geth_l2:8545
+ - Name: ETH_CALLS_ALLOWED
+ Value: eth_getTransactionByHash,eth_getTransactionReceipt,eth_sendRawTransaction,eth_blockNumber
+ Command:
+ - "nginx-debug"
+ - "-g"
+ - "daemon off;"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["nginx"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "nginx", "service": "nginx"}]'
+ Essential: true
+ Memory: "256"
+ Links:
+ - data_transport_layer
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "DataTransportLayer-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ DependsOn: DataTransportLayerListenerRule
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ LoadBalancers:
+ - ContainerName: nginx-dtl
+ ContainerPort: 80
+ TargetGroupArn: !Ref DataTransportLayerLBTargetGroup
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "DataTransportLayer-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/datadog.yaml b/ops_omgx/cloudformation/datadog.yaml
new file mode 100644
index 000000000000..a66816142c8c
--- /dev/null
+++ b/ops_omgx/cloudformation/datadog.yaml
@@ -0,0 +1,121 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Datadog Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: prod
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: rinkeby-infrastructure-core
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "cloudwatch:Describe*"
+ - "cloudwatch:Get*"
+ - "cloudwatch:List*"
+ - "logs:TestMetricFilter"
+ - "logs:PutSubscriptionFilter"
+ - "logs:DeleteSubscriptionFilter"
+ - "logs:DescribeSubscriptionFilters"
+ - "support:*"
+ - "tag:GetResources"
+ - "tag:GetTagKeys"
+ - "tag:GetTagValues"
+ Resource: "*"
+ DatadogLogGroup:
+ Type: AWS::Logs::LogGroup
+ Properties:
+ RetentionInDays: 7
+ LogGroupName: !Sub "/omgx/${InfrastructureStackName}/datadog/latest"
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ Volumes:
+ - Name: docker_sock
+ Host:
+ SourcePath: "/var/run/docker.sock"
+ - Name: docker_logs
+ Host:
+ SourcePath: "/var/lib/docker/containers"
+ - Name: docker_run
+ Host:
+ SourcePath: "/opt/datadog-agent/run"
+ - Name: proc
+ Host:
+ SourcePath: "/proc/"
+ - Name: cgroup
+ Host:
+ SourcePath: "/sys/fs/cgroup/"
+ - Name: password
+ Host:
+ SourcePath: "/etc/passwd"
+ ContainerDefinitions:
+ - Image: datadog/agent:latest
+ Name: datadog
+ Environment:
+ - Name: DD_SITE
+ Value: "datadoghq.com"
+ - Name: DD_PROCESS_AGENT_ENABLED
+ Value: "true"
+ - Name: DD_LOGS_ENABLED
+ Value: "true"
+ - Name: DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL
+ Value: "true"
+ - Name: DD_LOGS_CONFIG_DOCKER_CONTAINER_USE_FILE
+ Value: "true"
+ - Name: DD_CONTAINER_EXCLUDE
+ Value: "name:datadog-agent"
+ - Name: DD_CONTAINER_EXCLUDE
+ Value: "name:amazon-ecs -agent"
+ MountPoints:
+ - ContainerPath: "/var/run/docker.sock"
+ SourceVolume: docker_sock
+ - ContainerPath: "/host/sys/fs/cgroup"
+ SourceVolume: cgroup
+ - ContainerPath: "/host/proc"
+ SourceVolume: proc
+ - ContainerPath: "/opt/datadog-agent/run"
+ SourceVolume: docker_run
+ - ContainerPath: "/var/lib/docker/containers"
+ SourceVolume: docker_logs
+ Essential: true
+ LogConfiguration:
+ LogDriver: awslogs
+ Options:
+ awslogs-group:
+ Ref: DatadogLogGroup
+ awslogs-region:
+ Ref: AWS::Region
+ Memory: "256"
+ Cpu: "10"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "Datadog-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "Datadog-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/deployer-rinkeby.yaml b/ops_omgx/cloudformation/deployer-rinkeby.yaml
new file mode 100644
index 000000000000..841744772ae9
--- /dev/null
+++ b/ops_omgx/cloudformation/deployer-rinkeby.yaml
@@ -0,0 +1,146 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Deployer Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ CFHelperELBv2RulePriorityStack:
+ Type: String
+ Default: CF-Helper-ELBv2-Rule-Priority
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ DeployerImage:
+ Type: String
+ Default: deployer-rinkeby
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ DeployerLBTargetGroup:
+ Type: AWS::ElasticLoadBalancingV2::TargetGroup
+ Properties:
+ Port: 8080
+ Protocol: HTTP
+ VpcId:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId"
+ TargetGroupAttributes:
+ - Key: deregistration_delay.timeout_seconds
+ Value: 30
+ HealthCheckIntervalSeconds: 60
+ HealthCheckPath: /
+ HealthCheckProtocol: HTTP # TODO Implement proper healthcheck
+ HealthCheckTimeoutSeconds: 15
+ HealthyThresholdCount: 3
+ UnhealthyThresholdCount: 10
+ Matcher:
+ HttpCode: 200
+ DeployerLBListenerRulePriority:
+ Type: AWS::CloudFormation::CustomResource
+ Properties:
+ ServiceToken:
+ Fn::ImportValue: !Sub "${CFHelperELBv2RulePriorityStack}:Function"
+ ListenerArn:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DeployerListener"
+ DeployerLBListenerRule:
+ Type: AWS::ElasticLoadBalancingV2::ListenerRule
+ Properties:
+ Actions:
+ - Type: forward
+ TargetGroupArn: !Ref DeployerLBTargetGroup
+ Conditions:
+ - Field: host-header
+ HostHeaderConfig:
+ Values:
+ - Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ ListenerArn:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DeployerListener"
+ Priority: !GetAtt DeployerLBListenerRulePriority.Value
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${DeployerImage}:${ImageTag}"
+ Name: deployer
+ PortMappings:
+ - ContainerPort: 8081
+ HostPort: 0
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ EntryPoint:
+ - "/opt/optimism/packages/contracts/deployer.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["deployer"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "deployer", "service": "deployer"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "Deployer-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ DependsOn: DeployerLBListenerRule
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ LoadBalancers:
+ - ContainerName: deployer
+ ContainerPort: 8081
+ TargetGroupArn: !Ref DeployerLBTargetGroup
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "Deployer-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/l2geth.yaml b/ops_omgx/cloudformation/l2geth.yaml
new file mode 100644
index 000000000000..257cf99caa62
--- /dev/null
+++ b/ops_omgx/cloudformation/l2geth.yaml
@@ -0,0 +1,247 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya L2Geth Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ GoEthereumImage:
+ Type: String
+ Default: l2geth
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ - PolicyName: AllowAccessToELB
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "ec2:AuthorizeSecurityGroupIngress"
+ - "ec2:Describe*"
+ - "elasticloadbalancing:*"
+ - "elasticloadbalancing:Describe*"
+ - "elasticloadbalancing:RegisterInstancesWithLoadBalancer"
+ - "elasticloadbalancing:DeregisterTargets"
+ - "elasticloadbalancing:DescribeTargetGroups"
+ - "elasticloadbalancing:DescribeTargetHealth"
+ - "elasticloadbalancing:RegisterTargets"
+ - "elasticloadbalancing:DeregisterInstancesFromLoadBalancer"
+ Resource: "*"
+
+ GoEthereumLBTargetGroup:
+ Type: AWS::ElasticLoadBalancingV2::TargetGroup
+ Properties:
+ Port: 80
+ Protocol: HTTP
+ VpcId:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId"
+ TargetGroupAttributes:
+ - Key: deregistration_delay.timeout_seconds
+ Value: 30
+ HealthCheckIntervalSeconds: 20
+ HealthCheckPath: /health
+ HealthCheckProtocol: HTTP # TODO Implement proper healthcheck
+ HealthCheckTimeoutSeconds: 15
+ HealthyThresholdCount: 3
+ UnhealthyThresholdCount: 10
+ Matcher:
+ HttpCode: 200
+
+ GoEthereumListener:
+ Type: AWS::ElasticLoadBalancingV2::Listener
+ Properties:
+ LoadBalancerArn:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancer:ARN"
+ Port: 443
+ Protocol: HTTPS
+ SslPolicy: ELBSecurityPolicy-TLS-1-2-2017-01 # https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html
+ Certificates:
+ - CertificateArn: arn:aws:acm:us-east-1:942431445534:certificate/f0c77afc-0e13-42f4-b3b7-eeeafb32c631
+ DefaultActions:
+ - Type: forward
+ TargetGroupArn: !Ref GoEthereumLBTargetGroup
+
+ GoEthereumLBListenerRule:
+ Type: AWS::ElasticLoadBalancingV2::ListenerRule
+ Properties:
+ Actions:
+ - Type: forward
+ TargetGroupArn: !Ref GoEthereumLBTargetGroup
+ Conditions:
+ - Field: host-header
+ HostHeaderConfig:
+ Values:
+ - !Ref DNSRecordV4
+ ListenerArn: !Ref GoEthereumListener
+ Priority: 1
+ DNSRecordV4:
+ Type: AWS::Route53::RecordSet
+ Properties:
+ Type: A
+ AliasTarget:
+ DNSName:
+ Fn::Sub:
+ - "dualstack.${DomainName}."
+ - DomainName:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancer:DNSName"
+ HostedZoneId:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancer:CanonicalHostedZoneID"
+ HostedZoneName:
+ Fn::Sub:
+ - "${DomainName}."
+ - DomainName:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ Name:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ Volumes:
+ - Name: l2-node
+ Host:
+ SourcePath: "/mnt/efs/geth_l2"
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${GoEthereumImage}:${ImageTag}"
+ Name: geth_l2
+ PortMappings:
+ - ContainerPort: 8545
+ HostPort: 0
+ - ContainerPort: 8546
+ HostPort: 0
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: RETRIES
+ Value: 3600
+ - Name: DEPLOYER_HTTP
+ Value: !Sub
+ - "http://${EndpointAddress}:8081"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: URL
+ Value: !Sub
+ - "http://${EndpointAddress}:8081/addresses.json"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: ROLLUP_CLIENT_HTTP
+ Value: !Sub
+ - "http://${EndpointAddress}"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: ROLLUP_STATE_DUMP_PATH
+ Value: !Sub
+ - "http://${EndpointAddress}:8081/state-dump.latest.json"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: RPC_ADDR
+ Value: "0.0.0.0"
+ EntryPoint:
+ - "/geth.sh"
+ MountPoints:
+ - ContainerPath: "/root/.ethereum"
+ SourceVolume: l2-node
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["geth_l2"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "geth_l2", "service": "geth_l2"}]'
+ Essential: true
+ Memory: "8192"
+ - Image: 942431445534.dkr.ecr.us-east-1.amazonaws.com/omgx/nginx-eth-proxy:rpc_proxy
+ Ulimits:
+ - Name: nofile
+ SoftLimit: 8192
+ HardLimit: 8192
+ - Name: nproc
+ SoftLimit: 8192
+ HardLimit: 8192
+ Name: l2_proxy
+ PortMappings:
+ - ContainerPort: 80
+ HostPort: 0
+ Environment:
+ - Name: SEQUENCER
+ Value: geth_l2:8545
+ - Name: ETH_CALLS_ALLOWED
+ Value: web3_clientVersion,eth_chainId,eth_getProof,rollup_getInfo,web3_sha3,net_version,net_peerCount,net_listening,eth_protocolVersion,eth_syncing,eth_coinbase,eth_mining,eth_hashrate,eth_gasPrice,eth_accounts,eth_blockNumber,eth_getBalance,eth_getStorageAt,eth_getTransactionCount,eth_getBlockTransactionCountByHash,eth_getBlockTransactionCountByNumber,eth_getUncleCountByBlockHash,eth_getUncleCountByBlockNumber,eth_getCode,eth_sign,eth_signTransaction,eth_sendTransaction,eth_sendRawTransaction,eth_call,eth_estimateGas,eth_getBlockByHash,eth_getBlockByNumber,eth_getTransactionByHash,eth_getTransactionByBlockHashAndIndex,eth_getTransactionByBlockNumberAndIndex,eth_getTransactionReceipt,eth_getUncleByBlockHashAndIndex,eth_getUncleByBlockNumberAndIndex,eth_getCompilers,eth_compileLLL,eth_compileSolidity,eth_compileSerpent,eth_newFilter,eth_newBlockFilter,eth_newPendingTransactionFilter,eth_uninstallFilter,eth_getFilterChanges,eth_getFilterLogs,eth_getLogs,eth_getWork,eth_submitWork,eth_submitHashrate,db_putString,db_getString,db_putHex,db_getHex,shh_post,shh_version,shh_newIdentity,shh_hasIdentity,shh_newGroup,shh_addToGroup,shh_newFilter,shh_uninstallFilter,shh_getFilterChanges,shh_getMessages
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["nginx"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "l2_proxy", "service": "l2_proxy"}]'
+ Essential: true
+ Memory: "256"
+ Links:
+ - geth_l2
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "L2Geth-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ DependsOn: GoEthereumLBListenerRule
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DeploymentConfiguration:
+ MaximumPercent: 133
+ MinimumHealthyPercent: 66
+ LoadBalancers:
+ - ContainerName: l2_proxy
+ ContainerPort: 80
+ TargetGroupArn: !Ref GoEthereumLBTargetGroup
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "L2Geth-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/message-relayer-fast.yaml b/ops_omgx/cloudformation/message-relayer-fast.yaml
new file mode 100644
index 000000000000..6d826d5a672e
--- /dev/null
+++ b/ops_omgx/cloudformation/message-relayer-fast.yaml
@@ -0,0 +1,107 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Fast Message Relayer Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ MessageRelayerFastImage:
+ Type: String
+ Default: message-relayer-fast
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${MessageRelayerFastImage}:${ImageTag}"
+ Name: custom_message_relayer
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: DEPLOYER_HTTP
+ Value: !Sub
+ - "http://${EndpointAddress}:8081"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: L2_NODE_WEB3_URL
+ Value: !Sub
+ - "https://${EndpointAddress}/"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ - Name: RETRIES
+ Value: 3600
+ EntryPoint:
+ - "/opt/wait-for-l1-and-l2.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["custom-message_relayer"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "custom-message_relayer", "service": "custom-message_relayer"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "MessageRelayerFast-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "MessageRelayerFast-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/message-relayer.yaml b/ops_omgx/cloudformation/message-relayer.yaml
new file mode 100644
index 000000000000..76d230d9b57f
--- /dev/null
+++ b/ops_omgx/cloudformation/message-relayer.yaml
@@ -0,0 +1,113 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Message Relayer Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ MessageRelayerImage:
+ Type: String
+ Default: message-relayer
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ MessageRelayerLogGroup:
+ Type: AWS::Logs::LogGroup
+ Properties:
+ RetentionInDays: 7
+ LogGroupName: !Sub "/omgx/${EnvironmentName}/message-relayer/${ImageTag}"
+
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${MessageRelayerImage}:${ImageTag}"
+ Name: message_relayer
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: DEPLOYER_HTTP
+ Value: !Sub
+ - "http://${EndpointAddress}:8081"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName"
+ - Name: L2_NODE_WEB3_URL
+ Value: !Sub
+ - "https://${EndpointAddress}"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ - Name: RETRIES
+ Value: 3600
+ EntryPoint:
+ - "/opt/wait-for-l1-and-l2.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["message_relayer"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "message_relayer", "service": "message_relayer"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "MessageRelayer-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "MessageRelayer-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/omgx-monitor.yaml b/ops_omgx/cloudformation/omgx-monitor.yaml
new file mode 100644
index 000000000000..5429f8de9ead
--- /dev/null
+++ b/ops_omgx/cloudformation/omgx-monitor.yaml
@@ -0,0 +1,101 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Omgx Monitor Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ OmgxMonitorImage:
+ Type: String
+ Default: omgx-monitor
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${OmgxMonitorImage}:${ImageTag}"
+ Name: omgx_monitor
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: L2_NODE_WEB3_WS
+ Value: !Sub
+ - "wss://${EndpointAddress}/ws"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ EntryPoint:
+ - "/usr/local/bin/entrypoint.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["omgx-monitor"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "omgx_monitor", "service": "omgx_monitor", "log_processing_rules": [{ "type": "multi_line", "name": "log_start_with_message", "pattern" : "%{PROG}" }]}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "OmgxMonitor-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "OmgxMonitor-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/optimism-chain-scanner.yaml b/ops_omgx/cloudformation/optimism-chain-scanner.yaml
new file mode 100644
index 000000000000..0b319ce3f17d
--- /dev/null
+++ b/ops_omgx/cloudformation/optimism-chain-scanner.yaml
@@ -0,0 +1,101 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Chain Scanner Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ ChainScannerImage:
+ Type: String
+ Default: optimism-chain-scanner
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${ChainScannerImage}:${ImageTag}"
+ Name: chain_scanner
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: L2_NODE_WEB3_URL
+ Value: !Sub
+ - "https://${EndpointAddress}/"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ - Name: RETRIES
+ Value: 3600
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["chain_scanner"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "chain_scanner", "service": "chain_scanner"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "ChainScanner-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "ChainScanner-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/cloudformation/optimism-message-scanner.yaml b/ops_omgx/cloudformation/optimism-message-scanner.yaml
new file mode 100644
index 000000000000..81b3a3167e81
--- /dev/null
+++ b/ops_omgx/cloudformation/optimism-message-scanner.yaml
@@ -0,0 +1,106 @@
+AWSTemplateFormatVersion: "2010-09-09"
+Description: "Enya Message Scanner Application Deployment"
+
+Parameters:
+ EnvironmentName:
+ Type: String
+ Default: dev
+
+ CFHelperELBv2RulePriorityStack:
+ Type: String
+ Default: CF-Helper-ELBv2-Rule-Priority
+
+ ServiceCount:
+ Type: Number
+ Default: 1
+
+ ImageTag:
+ Type: String
+ Default: push2aws
+
+ MessageScannerImage:
+ Type: String
+ Default: optimism-message-scanner
+
+ DockerPrefix:
+ Type: String
+ Default: omgx
+
+ ECRRegistry:
+ Type: String
+ Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com
+
+ InfrastructureStackName:
+ Description: Infrastructure stack to associate this stack with
+ Type: String
+ Default: infrastructure-coredev
+
+ SecretName:
+ Description: AWS Secret Name used for the service
+ Type: String
+
+Conditions:
+ IsProduction:
+ !Equals [!Ref EnvironmentName, "production"]
+
+Resources:
+ TaskRole:
+ Type: AWS::IAM::Role
+ Properties:
+ AssumeRolePolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Principal:
+ Service: !Sub ecs-tasks.${AWS::URLSuffix}
+ Action: sts:AssumeRole
+ Policies:
+ - PolicyName: AllowAccessToSecrets
+ PolicyDocument:
+ Version: 2012-10-17
+ Statement:
+ - Effect: Allow
+ Action:
+ - "secretsmanager:GetResourcePolicy"
+ - "secretsmanager:GetSecretValue"
+ - "secretsmanager:DescribeSecret"
+ - "secretsmanager:ListSecretVersionIds"
+ Resource:
+ - arn:aws:secretsmanager:us-east-1:942431445534:secret:*
+ TaskDefinition:
+ Type: AWS::ECS::TaskDefinition
+ Properties:
+ ContainerDefinitions:
+ - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${MessageScannerImage}:${ImageTag}"
+ Name: message-scanner
+ Environment:
+ - Name: SECRETNAME
+ Value: !Ref SecretName
+ - Name: L2_NODE_WEB3_URL
+ Value: !Sub
+ - "https://${EndpointAddress}/"
+ - EndpointAddress:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:DomainName"
+ - Name: RETRIES
+ Value: 3600
+ EntryPoint:
+ - "/opt/wait-for-l1-and-l2.sh"
+ DockerLabels:
+ com.datadoghq.ad.check_names: '["message-scanner"]'
+ com.datadoghq.ad.init_configs: '[{}]'
+ com.datadoghq.ad.logs: '[{"source": "message-scanner", "service": "message-scanner"}]'
+ Essential: true
+ Memory: "512"
+ NetworkMode: bridge
+ TaskRoleArn: !GetAtt TaskRole.Arn
+ Family: !Sub "MessageScanner-${EnvironmentName}"
+ ECSService:
+ Type: AWS::ECS::Service
+ Properties:
+ Cluster:
+ Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster"
+ DesiredCount: !Ref ServiceCount
+ LaunchType: EC2
+ SchedulingStrategy: REPLICA
+ ServiceName: !Sub "MessageScanner-${EnvironmentName}"
+ TaskDefinition: !Ref TaskDefinition
diff --git a/ops_omgx/docker/batch-submitter/Dockerfile b/ops_omgx/docker/batch-submitter/Dockerfile
new file mode 100644
index 000000000000..fb4f384921ff
--- /dev/null
+++ b/ops_omgx/docker/batch-submitter/Dockerfile
@@ -0,0 +1,10 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY batches.sh /opt/optimism/packages/batch-submitter/batches.sh
+RUN chmod +x /opt/optimism/packages/batch-submitter/batches.sh && \
+ chmod +x /opt/secret2env && \
+ apk add --no-cache musl-dev
diff --git a/ops_omgx/docker/batch-submitter/batches.sh b/ops_omgx/docker/batch-submitter/batches.sh
new file mode 100644
index 000000000000..3765c7440100
--- /dev/null
+++ b/ops_omgx/docker/batch-submitter/batches.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export SEQUENCER_PRIVATE_KEY=`/opt/secret2env -name $SECRETNAME|grep -w SEQUENCER_PRIVATE_KEY|sed 's/SEQUENCER_PRIVATE_KEY=//g'`
+export PROPOSER_PRIVATE_KEY=`/opt/secret2env -name $SECRETNAME|grep -w PROPOSER_PRIVATE_KEY|sed 's/PROPOSER_PRIVATE_KEY=//g'`
+export CLEAR_PENDING_TXS=`/opt/secret2env -name $SECRETNAME|grep -w CLEAR_PENDING_TXS|sed 's/CLEAR_PENDING_TXS=//g'`
+export DEBUG=`/opt/secret2env -name $SECRETNAME|grep -w DEBUG|sed 's/DEBUG=//g'`
+export FINALITY_CONFIRMATIONS=`/opt/secret2env -name $SECRETNAME|grep -w FINALITY_CONFIRMATIONS|sed 's/FINALITY_CONFIRMATIONS=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export MAX_BATCH_SUBMISSION_TIME=`/opt/secret2env -name $SECRETNAME|grep -w MAX_BATCH_SUBMISSION_TIME|sed 's/MAX_BATCH_SUBMISSION_TIME=//g'`
+export MAX_L1_TX_SIZE=`/opt/secret2env -name $SECRETNAME|grep -w MAX_L1_TX_SIZE|sed 's/MAX_L1_TX_SIZE=//g'`
+export MAX_STATE_BATCH_COUNT=`/opt/secret2env -name $SECRETNAME|grep -w MAX_STATE_BATCH_COUNT|sed 's/MAX_STATE_BATCH_COUNT=//g'`
+export MAX_TX_BATCH_COUNT=`/opt/secret2env -name $SECRETNAME|grep -w MAX_TX_BATCH_COUNT|sed 's/MAX_TX_BATCH_COUNT=//g'`
+export MIN_L1_TX_SIZE=`/opt/secret2env -name $SECRETNAME|grep -w MIN_L1_TX_SIZE|sed 's/MIN_L1_TX_SIZE=//g'`
+export NUM_CONFIRMATIONS=`/opt/secret2env -name $SECRETNAME|grep -w NUM_CONFIRMATIONS|sed 's/NUM_CONFIRMATIONS=//g'`
+export POLL_INTERVAL=`/opt/secret2env -name $SECRETNAME|grep -w POLL_INTERVAL|sed 's/POLL_INTERVAL=//g'`
+export RESUBMISSION_TIMEOUT=`/opt/secret2env -name $SECRETNAME|grep -w RESUBMISSION_TIMEOUT|sed 's/RESUBMISSION_TIMEOUT=//g'`
+export RUN_STATE_BATCH_SUBMITTER=`/opt/secret2env -name $SECRETNAME|grep -w RUN_STATE_BATCH_SUBMITTER|sed 's/RUN_STATE_BATCH_SUBMITTER=//g'`
+export RUN_TX_BATCH_SUBMITTER=`/opt/secret2env -name $SECRETNAME|grep -w RUN_TX_BATCH_SUBMITTER|sed 's/RUN_TX_BATCH_SUBMITTER=//g'`
+export SAFE_MINIMUM_ETHER_BALANCE=`/opt/secret2env -name $SECRETNAME|grep -w SAFE_MINIMUM_ETHER_BALANCE|sed 's/SAFE_MINIMUM_ETHER_BALANCE=//g'`
+export ADDRESS_MANAGER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w ADDRESS_MANAGER_ADDRESS|sed 's/ADDRESS_MANAGER_ADDRESS=//g'`
+
+set -e
+
+RETRIES=${RETRIES:-40}
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+if [[ ! -z "$URL" ]]; then
+ # get the addrs from the URL provided
+ ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL)
+ # set the env
+ export ADDRESS_MANAGER_ADDRESS=$(echo $ADDRESSES | jq -r '.AddressManager')
+fi
+
+# waits for l2geth to be up
+curl --silent --fail \
+ --output /dev/null \
+ -retry-connrefused \
+ --retry $RETRIES \
+ --retry-delay 1 \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"
+
+# go
+exec node ./exec/run-batch-submitter.js
diff --git a/ops_omgx/docker/batch-submitter/secret2env b/ops_omgx/docker/batch-submitter/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/batch-submitter/secret2env differ
diff --git a/ops_omgx/docker/custom-message-relayer/secret2env b/ops_omgx/docker/custom-message-relayer/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/custom-message-relayer/secret2env differ
diff --git a/ops_omgx/docker/data-transport-layer/Dockerfile b/ops_omgx/docker/data-transport-layer/Dockerfile
new file mode 100644
index 000000000000..7885e466e371
--- /dev/null
+++ b/ops_omgx/docker/data-transport-layer/Dockerfile
@@ -0,0 +1,10 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY dtl.sh /opt/optimism/packages/data-transport-layer/dtl.sh
+RUN chmod +x /opt/optimism/packages/data-transport-layer/dtl.sh && \
+ chmod +x /opt/secret2env && \
+ apk add --no-cache musl-dev
diff --git a/ops_omgx/docker/data-transport-layer/dtl.sh b/ops_omgx/docker/data-transport-layer/dtl.sh
new file mode 100644
index 000000000000..4964f2aa1b07
--- /dev/null
+++ b/ops_omgx/docker/data-transport-layer/dtl.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__ADDRESS_MANAGER|sed 's/DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=//g'`
+export DATA_TRANSPORT_LAYER__L2_CHAIN_ID=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__L2_CHAIN_ID|sed 's/DATA_TRANSPORT_LAYER__L2_CHAIN_ID=//g'`
+export DATA_TRANSPORT_LAYER__CONFIRMATIONS=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__CONFIRMATIONS|sed 's/DATA_TRANSPORT_LAYER__CONFIRMATIONS=//g'`
+export DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS|sed 's/DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS=//g'`
+export DATA_TRANSPORT_LAYER__DB_PATH=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__DB_PATH|sed 's/DATA_TRANSPORT_LAYER__DB_PATH=//g'`
+export DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT|sed 's/DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT=//g'`
+export DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL|sed 's/DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL=//g'`
+export DATA_TRANSPORT_LAYER__POLLING_INTERVAL=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__POLLING_INTERVAL|sed 's/DATA_TRANSPORT_LAYER__POLLING_INTERVAL=//g'`
+export DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__SERVER_HOSTNAME|sed 's/DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=//g'`
+export DATA_TRANSPORT_LAYER__SYNC_FROM_L1=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__SYNC_FROM_L1|sed 's/DATA_TRANSPORT_LAYER__SYNC_FROM_L1=//g'`
+export DATA_TRANSPORT_LAYER__SYNC_FROM_L2=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__SYNC_FROM_L2|sed 's/DATA_TRANSPORT_LAYER__SYNC_FROM_L2=//g'`
+export DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL=`/opt/secret2env -name $SECRETNAME|grep -w DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL|sed 's/DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+
+rm -rf /db/LOCK
+#!/bin/bash
+
+set -e
+
+RETRIES=${RETRIES:-60}
+
+if [[ ! -z "$URL" ]]; then
+ # get the addrs from the URL provided
+ ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL)
+ # set the env
+ export DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=$(echo $ADDRESSES | jq -r '.AddressManager')
+fi
+
+# go
+exec node dist/src/services/run.js
diff --git a/ops_omgx/docker/data-transport-layer/secret2env b/ops_omgx/docker/data-transport-layer/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/data-transport-layer/secret2env differ
diff --git a/ops_omgx/docker/deployer-rinkeby/Dockerfile b/ops_omgx/docker/deployer-rinkeby/Dockerfile
new file mode 100644
index 000000000000..d6b3e126e9a7
--- /dev/null
+++ b/ops_omgx/docker/deployer-rinkeby/Dockerfile
@@ -0,0 +1,11 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY deployer.sh /opt/optimism/packages/contracts/deployer.sh
+
+RUN chmod +x /opt/optimism/packages/contracts/deployer.sh && \
+ chmod +x /opt/secret2env && \
+ apk add --no-cache musl-dev
diff --git a/ops_omgx/docker/deployer-rinkeby/deployer.sh b/ops_omgx/docker/deployer-rinkeby/deployer.sh
new file mode 100644
index 000000000000..c769f212fe19
--- /dev/null
+++ b/ops_omgx/docker/deployer-rinkeby/deployer.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export DEPLOYER_PRIVATE_KEY=`/opt/secret2env -name $SECRETNAME|grep -w DEPLOYER_PRIVATE_KEY|sed 's/DEPLOYER_PRIVATE_KEY=//g'`
+export FRAUD_PROOF_WINDOW_SECONDS=`/opt/secret2env -name $SECRETNAME|grep -w FRAUD_PROOF_WINDOW_SECONDS|sed 's/FRAUD_PROOF_WINDOW_SECONDS=//g'`
+export HARDHAT=`/opt/secret2env -name $SECRETNAME|grep -w HARDHAT|sed 's/HARDHAT=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export SEQUENCER_PRIVATE_KEY=`/opt/secret2env -name $SECRETNAME|grep -w SEQUENCER_PRIVATE_KEY|sed 's/SEQUENCER_PRIVATE_KEY=//g'`
+set -e
+
+RETRIES=${RETRIES:-20}
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+# wait for the base layer to be up
+curl \
+ --fail \
+ --show-error \
+ --silent \
+ -H "Content-Type: application/json" \
+ --retry-connrefused \
+ --retry $RETRIES \
+ --retry-delay 1 \
+ -d $JSON \
+ $L1_NODE_WEB3_URL
+
+yarn run deploy
+
+# serve the addrs and the state dump
+exec ./bin/serve_dump.sh
diff --git a/ops_omgx/docker/deployer-rinkeby/secret2env b/ops_omgx/docker/deployer-rinkeby/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/deployer-rinkeby/secret2env differ
diff --git a/ops_omgx/docker/l1-l2-test/Dockerfile b/ops_omgx/docker/l1-l2-test/Dockerfile
new file mode 100644
index 000000000000..0b6e238e5ccd
--- /dev/null
+++ b/ops_omgx/docker/l1-l2-test/Dockerfile
@@ -0,0 +1,13 @@
+FROM node:14-alpine
+
+RUN apk add --no-cache curl musl-dev bash jq git python3 make gcc && ln -sf python3 /usr/bin/python
+WORKDIR /opt/optimism
+COPY . /opt/optimism
+COPY ops_omgx/docker/l1-l2-test/secret2env /opt/secret2env
+COPY ops_omgx/docker/l1-l2-test/run_test.sh /opt/run_test.sh
+RUN yarn install
+WORKDIR /opt/optimism/ops_omgx/test
+RUN rm -rf /opt/optimism/ops_omgx/test/test/a_setup.spec.ts && \
+ yarn install && \
+ chmod +x /opt/secret2env /opt/run_test.sh
+ENTRYPOINT ["/opt/run_test.sh"]
diff --git a/ops_omgx/docker/l1-l2-test/run_test.sh b/ops_omgx/docker/l1-l2-test/run_test.sh
new file mode 100755
index 000000000000..2480f9b97507
--- /dev/null
+++ b/ops_omgx/docker/l1-l2-test/run_test.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+export ETH1_ADDRESS_RESOLVER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w ADDRESS_MANAGER_ADDRESS|sed 's/ADDRESS_MANAGER_ADDRESS=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export TEST_PRIVATE_KEY_1=`/opt/secret2env -name $SECRETNAME|grep -w TEST_PRIVATE_KEY_1|sed 's/TEST_PRIVATE_KEY_1=//g'`
+export TARGET_GAS_LIMIT=9000000000
+export CHAIN_ID=`/opt/secret2env -name $SECRETNAME|grep -w CHAIN_ID|sed 's/CHAIN_ID=//g'`
+export GASPRICE=0
+
+cd /opt/optimism/ops_omgx/test/
+yarn test
diff --git a/ops_omgx/docker/l1-l2-test/secret2env b/ops_omgx/docker/l1-l2-test/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/l1-l2-test/secret2env differ
diff --git a/ops_omgx/docker/l2geth/Dockerfile b/ops_omgx/docker/l2geth/Dockerfile
new file mode 100644
index 000000000000..036f8378f8f0
--- /dev/null
+++ b/ops_omgx/docker/l2geth/Dockerfile
@@ -0,0 +1,11 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY geth.sh /geth.sh
+RUN chmod +x /geth.sh && \
+ chmod +x /opt/secret2env && \
+ apk add --no-cache musl-dev
+EXPOSE 8545 8546
diff --git a/ops_omgx/docker/l2geth/geth.sh b/ops_omgx/docker/l2geth/geth.sh
new file mode 100644
index 000000000000..024ab8f37753
--- /dev/null
+++ b/ops_omgx/docker/l2geth/geth.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export CHAIN_ID=`/opt/secret2env -name $SECRETNAME|grep -w CHAIN_ID|sed 's/CHAIN_ID=//g'`
+export DATADIR=`/opt/secret2env -name $SECRETNAME|grep -w DATADIR|sed 's/DATADIR=//g'`
+export DEV=`/opt/secret2env -name $SECRETNAME|grep -w DEV|sed 's/DEV=//g'`
+export ETH1_CONFIRMATION_DEPTH=`/opt/secret2env -name $SECRETNAME|grep -w ETH1_CONFIRMATION_DEPTH|sed 's/ETH1_CONFIRMATION_DEPTH=//g'`
+export ETH1_CTC_DEPLOYMENT_HEIGHT=`/opt/secret2env -name $SECRETNAME|grep -w ETH1_CTC_DEPLOYMENT_HEIGHT|sed 's/ETH1_CTC_DEPLOYMENT_HEIGHT=//g'`
+export ETH1_SYNC_SERVICE_ENABLE=`/opt/secret2env -name $SECRETNAME|grep -w ETH1_SYNC_SERVICE_ENABLE|sed 's/ETH1_SYNC_SERVICE_ENABLE=//g'`
+export GASPRICE=`/opt/secret2env -name $SECRETNAME|grep -w GASPRICE|sed 's/GASPRICE=//g'`
+export GCMODE=`/opt/secret2env -name $SECRETNAME|grep -w GCMODE|sed 's/GCMODE=//g'`
+export IPC_DISABLE=`/opt/secret2env -name $SECRETNAME|grep -w IPC_DISABLE|sed 's/IPC_DISABLE=//g'`
+export NETWORK_ID=`/opt/secret2env -name $SECRETNAME|grep -w NETWORK_ID|sed 's/NETWORK_ID=//g'`
+export NO_DISCOVER=`/opt/secret2env -name $SECRETNAME|grep -w NO_DISCOVER|sed 's/NO_DISCOVER=//g'`
+export NO_USB=`/opt/secret2env -name $SECRETNAME|grep -w NO_USB|sed 's/NO_USB=//g'`
+export ROLLUP_POLL_INTERVAL_FLAG=`/opt/secret2env -name $SECRETNAME|grep -w ROLLUP_POLL_INTERVAL_FLAG|sed 's/ROLLUP_POLL_INTERVAL_FLAG=//g'`
+export RPC_API=`/opt/secret2env -name $SECRETNAME|grep -w RPC_API|sed 's/RPC_API=//g'`
+export RPC_CORS_DOMAIN=`/opt/secret2env -name $SECRETNAME|grep -w RPC_CORS_DOMAIN|sed 's/RPC_CORS_DOMAIN=//g'`
+export RPC_ENABLE=`/opt/secret2env -name $SECRETNAME|grep -w RPC_ENABLE|sed 's/RPC_ENABLE=//g'`
+export RPC_PORT=`/opt/secret2env -name $SECRETNAME|grep -w RPC_PORT|sed 's/RPC_PORT=//g'`
+export RPC_VHOSTS=`/opt/secret2env -name $SECRETNAME|grep -w RPC_VHOSTS|sed 's/RPC_VHOSTS=//g'`
+export TARGET_GAS_LIMIT=`/opt/secret2env -name $SECRETNAME|grep -w TARGET_GAS_LIMIT|sed 's/TARGET_GAS_LIMIT=//g'`
+export USING_OVM=`/opt/secret2env -name $SECRETNAME|grep -w USING_OVM|sed 's/USING_OVM=//g'`
+export WS=`/opt/secret2env -name $SECRETNAME|grep -w WS|sed 's/WS=//g'`
+export WS_ADDR=`/opt/secret2env -name $SECRETNAME|grep -w WS_ADDR|sed 's/WS_ADDR=//g'`
+export WS_API=`/opt/secret2env -name $SECRETNAME|grep -w WS_API|sed 's/WS_API=//g'`
+export WS_ORIGINS=`/opt/secret2env -name $SECRETNAME|grep -w WS_ORIGINS|sed 's/WS_ORIGINS=//g'`
+
+RETRIES=${RETRIES:-40}
+VERBOSITY=${VERBOSITY:-6}
+
+if [[ ! -z "$URL" ]]; then
+ # get the addrs from the URL provided
+ ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL)
+
+ function envSet() {
+ VAR=$1
+ export $VAR=$(echo $ADDRESSES | jq -r ".$2")
+ }
+
+ # set all the necessary env vars
+ envSet ETH1_ADDRESS_RESOLVER_ADDRESS AddressManager
+ envSet ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS Proxy__OVM_L1CrossDomainMessenger
+ envSet ROLLUP_ADDRESS_MANAGER_OWNER_ADDRESS Deployer
+
+ # set the address to the proxy gateway if possible
+ envSet ETH1_L1_ETH_GATEWAY_ADDRESS Proxy__OVM_L1ETHGateway
+ if [ $ETH1_L1_ETH_GATEWAY_ADDRESS == null ]; then
+ envSet ETH1_L1_ETH_GATEWAY_ADDRESS OVM_L1ETHGateway
+ fi
+fi
+
+# wait for the dtl to be up, else geth will crash if it cannot connect
+curl \
+ --fail \
+ --show-error \
+ --silent \
+ --output /dev/null \
+ --retry-connrefused \
+ --retry $RETRIES \
+ --retry-delay 1 \
+ $ROLLUP_CLIENT_HTTP
+
+exec geth --verbosity="$VERBOSITY" "$@"
diff --git a/ops_omgx/docker/l2geth/secret2env b/ops_omgx/docker/l2geth/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/l2geth/secret2env differ
diff --git a/ops_omgx/docker/message-relayer-fast/Dockerfile b/ops_omgx/docker/message-relayer-fast/Dockerfile
new file mode 100644
index 000000000000..9ae8f6c36d01
--- /dev/null
+++ b/ops_omgx/docker/message-relayer-fast/Dockerfile
@@ -0,0 +1,11 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY wait-for-l1-and-l2.sh /opt/
+RUN chmod +x /opt/wait-for-l1-and-l2.sh && \
+ chmod +x /opt/secret2env && \
+ chmod +x /opt/optimism/packages/omgx/message-relayer-fast/exec/run-message-relayer-fast.js && \
+ apk add --no-cache musl-dev
diff --git a/ops_omgx/docker/message-relayer-fast/secret2env b/ops_omgx/docker/message-relayer-fast/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/message-relayer-fast/secret2env differ
diff --git a/ops_omgx/docker/message-relayer-fast/wait-for-l1-and-l2.sh b/ops_omgx/docker/message-relayer-fast/wait-for-l1-and-l2.sh
new file mode 100644
index 000000000000..fb90133e776e
--- /dev/null
+++ b/ops_omgx/docker/message-relayer-fast/wait-for-l1-and-l2.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export ADDRESS_MANAGER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w ADDRESS_MANAGER_ADDRESS|sed 's/ADDRESS_MANAGER_ADDRESS=//g'`
+export L1_BLOCK_OFFSET=`/opt/secret2env -name $SECRETNAME|grep -w L1_BLOCK_OFFSET|sed 's/L1_BLOCK_OFFSET=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export L1_WALLET_KEY=`/opt/secret2env -name $SECRETNAME|grep -w FAST_RELAY_L1_WALLET_PRIV_KEY|sed 's/FAST_RELAY_L1_WALLET_PRIV_KEY=//g'`
+export WHITELIST_ENDPOINT=`/opt/secret2env -name $SECRETNAME|grep -w WHITELIST_ENDPOINT|sed 's/WHITELIST_ENDPOINT=//g'`
+export L1_TARGET=`/opt/secret2env -name $SECRETNAME|grep -w L1_TARGET|sed 's/L1_TARGET=//g'`
+
+cmd="node /opt/optimism/packages/omgx/message-relayer-fast/exec/run-message-relayer-fast.js"
+
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+RETRIES=${RETRIES:-120}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L1_NODE_WEB3_URL"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for L1 $L1_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $L1_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $L1_NODE_WEB3_URL"
+
+RETRIES=${RETRIES:-30}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for L2 $L2_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $L2_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Node at $L2_NODE_WEB3_URL"
+
+if [ ! -z "$DEPLOYER_HTTP" ]; then
+ RETRIES=${RETRIES:-20}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$DEPLOYER_HTTP/addresses.json"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for DEPLOYER $DEPLOYER_HTTP to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+ ADDRESS_MANAGER_ADDRESS=$(curl --silent $DEPLOYER_HTTP/addresses.json | jq -r .AddressManager)
+ exec env \
+ ADDRESS_MANAGER_ADDRESS=$ADDRESS_MANAGER_ADDRESS \
+ L1_BLOCK_OFFSET=$L1_BLOCK_OFFSET \
+ L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'` \
+ L1_WALLET_KEY=`/opt/secret2env -name $SECRETNAME|grep -w FAST_RELAY_L1_WALLET_PRIV_KEY|sed 's/FAST_RELAY_L1_WALLET_PRIV_KEY=//g'` \
+ WHITELIST_ENDPOINT=`/opt/secret2env -name $SECRETNAME|grep -w WHITELIST_ENDPOINT|sed 's/WHITELIST_ENDPOINT=//g'` \
+ $cmd
+else
+ $cmd
+fi
diff --git a/ops_omgx/docker/message-relayer/Dockerfile b/ops_omgx/docker/message-relayer/Dockerfile
new file mode 100644
index 000000000000..f5574211ed37
--- /dev/null
+++ b/ops_omgx/docker/message-relayer/Dockerfile
@@ -0,0 +1,13 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY wait-for-l1-and-l2.sh /opt/
+COPY relayer.sh /opt/optimism/packages/message-relayer/relayer.sh
+RUN chmod +x /opt/wait-for-l1-and-l2.sh && \
+ chmod +x /opt/optimism/packages/message-relayer/relayer.sh && \
+ chmod +x /opt/secret2env && \
+ chmod +x /opt/optimism/packages/message-relayer/exec/run-message-relayer.js && \
+ apk add --no-cache musl-dev
diff --git a/ops_omgx/docker/message-relayer/relayer.sh b/ops_omgx/docker/message-relayer/relayer.sh
new file mode 100644
index 000000000000..7aa5effc8e8a
--- /dev/null
+++ b/ops_omgx/docker/message-relayer/relayer.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+set -x
+export ADDRESS_MANAGER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w ADDRESS_MANAGER_ADDRESS|sed 's/ADDRESS_MANAGER_ADDRESS=//g'`
+export L1_BLOCK_OFFSET=`/opt/secret2env -name $SECRETNAME|grep -w L1_BLOCK_OFFSET|sed 's/L1_BLOCK_OFFSET=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export L1_WALLET_KEY=`/opt/secret2env -name $SECRETNAME|grep -w RELAY_L1_WALLET_PRIV_KEY |sed 's/RELAY_L1_WALLET_PRIV_KEY=//g'`
+export BLACKLIST_ENDPOINT=`/opt/secret2env -name $SECRETNAME|grep -w BLACKLIST_ENDPOINT|sed 's/BLACKLIST_ENDPOINT=//g'`
+
+
+RETRIES=${RETRIES:-60}
+
+if [[ ! -z "$URL" ]]; then
+ # get the addrs from the URL provided
+ ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL)
+ export ADDRESS_MANAGER_ADDRESS=$(echo $ADDRESSES | jq -r '.AddressManager')
+fi
+
+# waits for l2geth to be up
+curl \
+ --fail \
+ --show-error \
+ --silent \
+ --output /dev/null \
+ --retry-connrefused \
+ --retry $RETRIES \
+ --retry-delay 1 \
+ $L2_NODE_WEB3_URL
+
+# go
+exec /opt/optimism/packages/message-relayer/exec/run-message-relayer-fast.js
diff --git a/ops_omgx/docker/message-relayer/secret2env b/ops_omgx/docker/message-relayer/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/message-relayer/secret2env differ
diff --git a/ops_omgx/docker/message-relayer/wait-for-l1-and-l2.sh b/ops_omgx/docker/message-relayer/wait-for-l1-and-l2.sh
new file mode 100644
index 000000000000..8d4a29affb44
--- /dev/null
+++ b/ops_omgx/docker/message-relayer/wait-for-l1-and-l2.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export ADDRESS_MANAGER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w ADDRESS_MANAGER_ADDRESS|sed 's/ADDRESS_MANAGER_ADDRESS=//g'`
+export L1_BLOCK_OFFSET=`/opt/secret2env -name $SECRETNAME|grep -w L1_BLOCK_OFFSET|sed 's/L1_BLOCK_OFFSET=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export L1_WALLET_KEY=`/opt/secret2env -name $SECRETNAME|grep -w RELAY_L1_WALLET_PRIV_KEY|sed 's/RELAY_L1_WALLET_PRIV_KEY=//g'`
+export BLACKLIST_ENDPOINT=`/opt/secret2env -name $SECRETNAME|grep -w BLACKLIST_ENDPOINT|sed 's/BLACKLIST_ENDPOINT=//g'`
+
+cmd="/opt/optimism/packages/message-relayer/exec/run-message-relayer.js"
+
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+RETRIES=${RETRIES:-120}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L1_NODE_WEB3_URL"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for L1 $L1_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $L1_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $L1_NODE_WEB3_URL"
+
+RETRIES=${RETRIES:-30}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for L2 $L2_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $L2_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Node at $L2_NODE_WEB3_URL"
+
+if [ ! -z "$DEPLOYER_HTTP" ]; then
+ RETRIES=${RETRIES:-20}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$DEPLOYER_HTTP/addresses.json"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for DEPLOYER $DEPLOYER_HTTP to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+ ADDRESS_MANAGER_ADDRESS=$(curl --silent $DEPLOYER_HTTP/addresses.json | jq -r .AddressManager)
+ exec env \
+ ADDRESS_MANAGER_ADDRESS=$ADDRESS_MANAGER_ADDRESS \
+ L1_BLOCK_OFFSET=$L1_BLOCK_OFFSET \
+ L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'` \
+ L1_WALLET_KEY=`/opt/secret2env -name $SECRETNAME|grep -w RELAY_L1_WALLET_PRIV_KEY|sed 's/RELAY_L1_WALLET_PRIV_KEY=//g'` \
+ BLACKLIST_ENDPOINT=`/opt/secret2env -name $SECRETNAME|grep -w BLACKLIST_ENDPOINT|sed 's/BLACKLIST_ENDPOINT=//g'` \
+ $cmd
+else
+ $cmd
+fi
diff --git a/ops_omgx/docker/nginx-eth-proxy/Dockerfile b/ops_omgx/docker/nginx-eth-proxy/Dockerfile
new file mode 100644
index 000000000000..5bb81aada11b
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/Dockerfile
@@ -0,0 +1,2 @@
+FROM nginx:latest
+COPY proxy_no_lua.conf /etc/nginx/conf.d/default.conf
diff --git a/ops_omgx/docker/nginx-eth-proxy/Dockerfile.data_transport_layer_nginx b/ops_omgx/docker/nginx-eth-proxy/Dockerfile.data_transport_layer_nginx
new file mode 100644
index 000000000000..288c2bd89987
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/Dockerfile.data_transport_layer_nginx
@@ -0,0 +1,2 @@
+FROM nginx:latest
+COPY proxy_no_lua_data_transport_layer.conf /etc/nginx/conf.d/default.conf
diff --git a/ops_omgx/docker/nginx-eth-proxy/Dockerfile.eth_rcp_proxy b/ops_omgx/docker/nginx-eth-proxy/Dockerfile.eth_rcp_proxy
new file mode 100644
index 000000000000..a1c98ef41553
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/Dockerfile.eth_rcp_proxy
@@ -0,0 +1,22 @@
+FROM openresty/openresty:buster
+LABEL maintainer="Optimistic Systems "
+ARG GOTEMPLATE_VERSION=v3.9.0
+
+RUN DEBIAN_FRONTEND=noninteractive apt-get update \
+ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+ openresty-opm \
+ && opm get knyar/nginx-lua-prometheus
+
+RUN curl -o /usr/local/bin/gomplate \
+ -sSL https://github.com/hairyhenderson/gomplate/releases/download/$GOTEMPLATE_VERSION/gomplate_linux-amd64-slim \
+ && chmod +x /usr/local/bin/gomplate
+
+RUN mkdir -p /var/log/nginx/ \
+ && ln -sf /dev/stdout /var/log/nginx/access.log \
+ && ln -sf /dev/stderr /var/log/nginx/error.log
+
+COPY eth-jsonrpc-access.lua /usr/local/openresty/nginx/eth-jsonrpc-access.lua
+COPY nginx.template.conf /docker-entrypoint.d/nginx.template.conf
+COPY docker-entrypoint.sh /docker-entrypoint.sh
+RUN chmod +x /docker-entrypoint.sh
+ENTRYPOINT ["/docker-entrypoint.sh"]
diff --git a/ops_omgx/docker/nginx-eth-proxy/Dockerfile.nginx_no_lua b/ops_omgx/docker/nginx-eth-proxy/Dockerfile.nginx_no_lua
new file mode 100644
index 000000000000..5bb81aada11b
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/Dockerfile.nginx_no_lua
@@ -0,0 +1,2 @@
+FROM nginx:latest
+COPY proxy_no_lua.conf /etc/nginx/conf.d/default.conf
diff --git a/ops_omgx/docker/nginx-eth-proxy/docker-entrypoint.sh b/ops_omgx/docker/nginx-eth-proxy/docker-entrypoint.sh
new file mode 100755
index 000000000000..477f1dd8f934
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/docker-entrypoint.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+set -eo pipefail
+
+if [ -z "$SEQUENCER" ];then
+ echo "SEQUENCER env must be set, exiting"
+ exit 1
+fi
+
+if [ -z "$ETH_CALLS_ALLOWED" ];then
+ echo "ETH_CALLS_ALLOWED env must be set, exiting"
+ exit 1
+fi
+
+gomplate -f /docker-entrypoint.d/nginx.template.conf > /usr/local/openresty/nginx/conf/nginx.conf
+
+cat /usr/local/openresty/nginx/conf/nginx.conf
+
+exec openresty "$@"
diff --git a/ops_omgx/docker/nginx-eth-proxy/eth-jsonrpc-access.lua b/ops_omgx/docker/nginx-eth-proxy/eth-jsonrpc-access.lua
new file mode 100644
index 000000000000..3f2280ec815f
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/eth-jsonrpc-access.lua
@@ -0,0 +1,91 @@
+-- Source: https://github.com/adetante/ethereum-nginx-proxy
+local cjson = require('cjson')
+
+local function empty(s)
+ return s == nil or s == ''
+end
+
+local function split(s)
+ local res = {}
+ local i = 1
+ for v in string.gmatch(s, "([^,]+)") do
+ res[i] = v
+ i = i + 1
+ end
+ return res
+end
+
+local function contains(arr, val)
+ for i, v in ipairs (arr) do
+ if v == val then
+ return true
+ end
+ end
+ return false
+end
+
+-- parse conf
+local blacklist, whitelist = nil
+if not empty(ngx.var.jsonrpc_blacklist) then
+ blacklist = split(ngx.var.jsonrpc_blacklist)
+end
+if not empty(ngx.var.jsonrpc_whitelist) then
+ whitelist = split(ngx.var.jsonrpc_whitelist)
+end
+
+-- check conf
+if blacklist ~= nil and whitelist ~= nil then
+ ngx.log(ngx.ERR, 'invalid conf: jsonrpc_blacklist and jsonrpc_whitelist are both set')
+ ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
+ return
+end
+
+-- get request content
+ngx.req.read_body()
+
+-- try to parse the body as JSON
+local success, body = pcall(cjson.decode, ngx.var.request_body);
+if not success then
+ ngx.log(ngx.ERR, 'invalid JSON request')
+ ngx.exit(ngx.HTTP_BAD_REQUEST)
+ return
+end
+
+local method = body['method']
+local version = body['jsonrpc']
+
+-- check we have a method and a version
+if empty(method) or empty(version) then
+ ngx.log(ngx.ERR, 'no method and/or jsonrpc attribute')
+ ngx.exit(ngx.HTTP_BAD_REQUEST)
+ return
+end
+
+metric_sequencer_requests:inc(1, {method, ngx.var.server_name, ngx.var.status})
+
+-- check the version is supported
+if version ~= "2.0" then
+ ngx.log(ngx.ERR, 'jsonrpc version not supported: ' .. version)
+ ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
+ return
+end
+
+-- if whitelist is configured, check that the method is whitelisted
+if whitelist ~= nil then
+ if not contains(whitelist, method) then
+ ngx.log(ngx.ERR, 'jsonrpc method is not whitelisted: ' .. method)
+ ngx.exit(ngx.HTTP_FORBIDDEN)
+ return
+ end
+end
+
+-- if blacklist is configured, check that the method is not blacklisted
+if blacklist ~= nil then
+ if contains(blacklist, method) then
+ ngx.log(ngx.ERR, 'jsonrpc method is blacklisted: ' .. method)
+ ngx.exit(ngx.HTTP_FORBIDDEN)
+ return
+ end
+end
+
+return
diff --git a/ops_omgx/docker/nginx-eth-proxy/nginx.template.conf b/ops_omgx/docker/nginx-eth-proxy/nginx.template.conf
new file mode 100644
index 000000000000..c0f6cce8b8a5
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/nginx.template.conf
@@ -0,0 +1,93 @@
+worker_processes 5;
+daemon off;
+error_log /var/log/nginx/error.log;
+worker_rlimit_nofile 8192;
+pcre_jit on;
+
+events {
+ worker_connections 4096;
+}
+
+http {
+ include mime.types;
+ index index.html;
+
+ # See Move default writable paths to a dedicated directory (#119)
+ # https://github.com/openresty/docker-openresty/issues/119
+ client_body_temp_path /var/run/openresty/nginx-client-body;
+ proxy_temp_path /var/run/openresty/nginx-proxy;
+ fastcgi_temp_path /var/run/openresty/nginx-fastcgi;
+ uwsgi_temp_path /var/run/openresty/nginx-uwsgi;
+ scgi_temp_path /var/run/openresty/nginx-scgi;
+
+ keepalive_timeout 0;
+
+ default_type application/octet-stream;
+ log_format main '$remote_addr - $remote_user [$time_local] $status '
+ '"$request" $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+ access_log /var/log/nginx/access.log main;
+ sendfile on;
+ tcp_nopush on;
+
+ lua_shared_dict prometheus_metrics 10M;
+ init_worker_by_lua_block {
+ prometheus = require("prometheus").init("prometheus_metrics")
+ metric_requests = prometheus:counter(
+ "nginx_http_requests_total", "Number of HTTP requests", {"host", "status"})
+ metric_sequencer_requests = prometheus:counter(
+ "nginx_eth_sequencer_requests", "Number of requests going to the sequencer", {"method", "host", "status"})
+ metric_replica_requests = prometheus:counter(
+ "nginx_eth_replica_requests", "Number of requests going to the replicas", {"host", "status"})
+ metric_latency = prometheus:histogram(
+ "nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
+ metric_connections = prometheus:gauge(
+ "nginx_http_connections", "Number of HTTP connections", {"state"})
+ }
+ log_by_lua_block {
+ metric_requests:inc(1, {ngx.var.server_name, ngx.var.status})
+ metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name})
+ }
+
+ upstream sequencer {
+ server {{env.Getenv "SEQUENCER"}};
+ }
+
+ server { # RPC proxy server
+ listen 80;
+ location = /health {
+ return 200 'healthz';
+ }
+
+ location = /ws {
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+ proxy_pass http://geth_l2:8546;
+ proxy_redirect off;
+ }
+
+ location / {
+ set $jsonrpc_whitelist {{env.Getenv "ETH_CALLS_ALLOWED"}};
+ access_by_lua_file 'eth-jsonrpc-access.lua';
+ proxy_pass http://sequencer;
+ }
+ }
+
+ server { # Metrics server
+ listen 9145;
+ location /metrics {
+ content_by_lua_block {
+ metric_connections:set(ngx.var.connections_reading, {"reading"})
+ metric_connections:set(ngx.var.connections_waiting, {"waiting"})
+ metric_connections:set(ngx.var.connections_writing, {"writing"})
+ prometheus:collect()
+ }
+ }
+ }
+
+}
diff --git a/ops_omgx/docker/nginx-eth-proxy/proxy_no_lua.conf b/ops_omgx/docker/nginx-eth-proxy/proxy_no_lua.conf
new file mode 100644
index 000000000000..e19eef42ee9c
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/proxy_no_lua.conf
@@ -0,0 +1,34 @@
+server {
+ resolver 10.0.0.2 valid=300s;
+
+ listen 80 default_server;
+
+ location /health {
+ return 200 "healthy";
+ add_header Content-Type text/plain;
+
+ }
+
+ location /ws {
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+ proxy_pass http://geth_l2:8546;
+ proxy_redirect off;
+ }
+
+ location / {
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+ proxy_pass http://geth_l2:8545;
+ }
+}
diff --git a/ops_omgx/docker/nginx-eth-proxy/proxy_no_lua_data_transport_layer.conf b/ops_omgx/docker/nginx-eth-proxy/proxy_no_lua_data_transport_layer.conf
new file mode 100644
index 000000000000..3e7b7328e4ba
--- /dev/null
+++ b/ops_omgx/docker/nginx-eth-proxy/proxy_no_lua_data_transport_layer.conf
@@ -0,0 +1,22 @@
+server {
+ resolver 10.0.0.2 valid=300s;
+
+ listen 80 default_server;
+
+ location /health {
+ return 200 "healthy";
+ add_header Content-Type text/plain;
+
+ }
+
+ location / {
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+ proxy_pass http://data_transport_layer:7878;
+ }
+}
diff --git a/ops_omgx/docker/omgx-monitor/Dockerfile b/ops_omgx/docker/omgx-monitor/Dockerfile
new file mode 100644
index 000000000000..e1bfb095dc1f
--- /dev/null
+++ b/ops_omgx/docker/omgx-monitor/Dockerfile
@@ -0,0 +1,9 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY entrypoint.sh /usr/local/bin/entrypoint.sh
+RUN chmod +x /usr/local/bin/entrypoint.sh && \
+ chmod +x /opt/secret2env
diff --git a/ops_omgx/docker/omgx-monitor/entrypoint.sh b/ops_omgx/docker/omgx-monitor/entrypoint.sh
new file mode 100644
index 000000000000..978245acf030
--- /dev/null
+++ b/ops_omgx/docker/omgx-monitor/entrypoint.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+export NODE_ENV=`/opt/secret2env -name $SECRETNAME|grep -w NODE_ENV|sed 's/NODE_ENV=//g'`
+export L1_NODE_WEB3_WS=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_WS|sed 's/L1_NODE_WEB3_WS=//g'`
+export L1_LIQUIDITY_POOL_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w L1_LIQUIDITY_POOL_ADDRESS|sed 's/L1_LIQUIDITY_POOL_ADDRESS=//g'`
+export L2_LIQUIDITY_POOL_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w L2_LIQUIDITY_POOL_ADDRESS|sed 's/L2_LIQUIDITY_POOL_ADDRESS=//g'`
+export RELAYER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w RELAYER_ADDRESS|sed 's/RELAYER_ADDRESS=//g'`
+export SEQUENCER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w SEQUENCER_ADDRESS|sed 's/SEQUENCER_ADDRESS=//g'`
+npm start
diff --git a/ops_omgx/docker/optimism-chain-scanner/Dockerfile b/ops_omgx/docker/optimism-chain-scanner/Dockerfile
new file mode 100644
index 000000000000..a2d2a622686f
--- /dev/null
+++ b/ops_omgx/docker/optimism-chain-scanner/Dockerfile
@@ -0,0 +1,11 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY wait-for-l1-and-l2.sh /opt/
+RUN chmod +x /opt/wait-for-l1-and-l2.sh && \
+ chmod +x /opt/secret2env && \
+ apt update && \
+ apt install -y musl musl-dev musl-tools
diff --git a/ops_omgx/docker/optimism-chain-scanner/branch_name b/ops_omgx/docker/optimism-chain-scanner/branch_name
new file mode 100644
index 000000000000..cae3cec8bf3e
--- /dev/null
+++ b/ops_omgx/docker/optimism-chain-scanner/branch_name
@@ -0,0 +1 @@
+optimism-integation-local
diff --git a/ops_omgx/docker/optimism-chain-scanner/inject-env.sh b/ops_omgx/docker/optimism-chain-scanner/inject-env.sh
new file mode 100644
index 000000000000..780a4f4eaa36
--- /dev/null
+++ b/ops_omgx/docker/optimism-chain-scanner/inject-env.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ -f "/opt/secret2env" ]; then
+ BRANCH_NAME=`cat /branch_name`
+ ENVIRON=`/opt/secret2env -name $BRANCH_NAME`
+ sed -i "2s#^#$ENVIRON#" /opt/wait-for-l1-and-l2.sh
+fi
+cmd="$@"
+$cmd
diff --git a/ops_omgx/docker/optimism-chain-scanner/secret2env b/ops_omgx/docker/optimism-chain-scanner/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/optimism-chain-scanner/secret2env differ
diff --git a/ops_omgx/docker/optimism-chain-scanner/wait-for-l1-and-l2.sh b/ops_omgx/docker/optimism-chain-scanner/wait-for-l1-and-l2.sh
new file mode 100644
index 000000000000..351e3bb0bf3a
--- /dev/null
+++ b/ops_omgx/docker/optimism-chain-scanner/wait-for-l1-and-l2.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+export ADDRESS_MANAGER_ADDRESS=`/opt/secret2env -name $SECRETNAME|grep -w ADDRESS_MANAGER_ADDRESS|sed 's/ADDRESS_MANAGER_ADDRESS=//g'`
+export DEPLOYER_PRIVATE_KEY=`/opt/secret2env -name $SECRETNAME|grep -w DEPLOYER_PRIVATE_KEY|sed 's/DEPLOYER_PRIVATE_KEY=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export MYSQL_DATABASE_NAME=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_DATABASE_NAME|sed 's/MYSQL_DATABASE_NAME=//g'`
+export MYSQL_HOST_URL=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_HOST_URL|sed 's/MYSQL_HOST_URL=//g'`
+export MYSQL_PASSWORD=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_PASSWORD|sed 's/MYSQL_PASSWORD=//g'`
+export MYSQL_PORT=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_PORT|sed 's/MYSQL_PORT=//g'`
+export MYSQL_USERNAME=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_USERNAME|sed 's/MYSQL_USERNAME=//g'`
+cmd="$@"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+RETRIES=${RETRIES:-120}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L1_NODE_WEB3_URL"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for L1 $L1_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $L1_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $L1_NODE_WEB3_URL"
+
+RETRIES=${RETRIES:-30}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for L2 $L2_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $L2_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Node at $L2_NODE_WEB3_URL"
+
+if [ ! -z "$DEPLOYER_HTTP" ]; then
+ RETRIES=${RETRIES:-20}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$DEPLOYER_HTTP/addresses.json"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for DEPLOEYR $DEPLOYER_HTTP to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+ ADDRESS_MANAGER_ADDRESS=$(curl --silent $DEPLOYER_HTTP/addresses.json | jq -r .AddressManager)
+ exec env \
+ ADDRESS_MANAGER_ADDRESS=$ADDRESS_MANAGER_ADDRESS \
+ L1_BLOCK_OFFSET=$L1_BLOCK_OFFSET \
+ $cmd
+else
+ exec $cmd
+fi
diff --git a/ops_omgx/docker/optimism-message-scanner/Dockerfile b/ops_omgx/docker/optimism-message-scanner/Dockerfile
new file mode 100644
index 000000000000..a2d2a622686f
--- /dev/null
+++ b/ops_omgx/docker/optimism-message-scanner/Dockerfile
@@ -0,0 +1,11 @@
+ARG BUILD_IMAGE=""
+ARG BUILD_IMAGE_VERSION=""
+
+FROM ${BUILD_IMAGE}:${BUILD_IMAGE_VERSION} as builder
+
+COPY secret2env /opt/secret2env
+COPY wait-for-l1-and-l2.sh /opt/
+RUN chmod +x /opt/wait-for-l1-and-l2.sh && \
+ chmod +x /opt/secret2env && \
+ apt update && \
+ apt install -y musl musl-dev musl-tools
diff --git a/ops_omgx/docker/optimism-message-scanner/branch_name b/ops_omgx/docker/optimism-message-scanner/branch_name
new file mode 100644
index 000000000000..cae3cec8bf3e
--- /dev/null
+++ b/ops_omgx/docker/optimism-message-scanner/branch_name
@@ -0,0 +1 @@
+optimism-integation-local
diff --git a/ops_omgx/docker/optimism-message-scanner/inject-env.sh b/ops_omgx/docker/optimism-message-scanner/inject-env.sh
new file mode 100644
index 000000000000..780a4f4eaa36
--- /dev/null
+++ b/ops_omgx/docker/optimism-message-scanner/inject-env.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+if [ -f "/opt/secret2env" ]; then
+ BRANCH_NAME=`cat /branch_name`
+ ENVIRON=`/opt/secret2env -name $BRANCH_NAME`
+ sed -i "2s#^#$ENVIRON#" /opt/wait-for-l1-and-l2.sh
+fi
+cmd="$@"
+$cmd
diff --git a/ops_omgx/docker/optimism-message-scanner/secret2env b/ops_omgx/docker/optimism-message-scanner/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/docker/optimism-message-scanner/secret2env differ
diff --git a/ops_omgx/docker/optimism-message-scanner/wait-for-l1-and-l2.sh b/ops_omgx/docker/optimism-message-scanner/wait-for-l1-and-l2.sh
new file mode 100644
index 000000000000..eb5ce6f792d0
--- /dev/null
+++ b/ops_omgx/docker/optimism-message-scanner/wait-for-l1-and-l2.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+
+# Copyright Optimism PBC 2020
+# MIT License
+# github.com/ethereum-optimism
+
+export DEPLOYER_PRIVATE_KEY=`/opt/secret2env -name $SECRETNAME|grep -w DEPLOYER_PRIVATE_KEY|sed 's/DEPLOYER_PRIVATE_KEY=//g'`
+export L1_NODE_WEB3_URL=`/opt/secret2env -name $SECRETNAME|grep -w L1_NODE_WEB3_URL|sed 's/L1_NODE_WEB3_URL=//g'`
+export MYSQL_DATABASE_NAME=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_DATABASE_NAME|sed 's/MYSQL_DATABASE_NAME=//g'`
+export MYSQL_HOST_URL=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_HOST_URL|sed 's/MYSQL_HOST_URL=//g'`
+export MYSQL_PASSWORD=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_PASSWORD|sed 's/MYSQL_PASSWORD=//g'`
+export MYSQL_PORT=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_PORT|sed 's/MYSQL_PORT=//g'`
+export MYSQL_USERNAME=`/opt/secret2env -name $SECRETNAME|grep -w MYSQL_USERNAME|sed 's/MYSQL_USERNAME=//g'`
+
+cmd="node /usr/local/bin/run-L2ToL1Message-scanner.js"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+
+RETRIES=${RETRIES:-120}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L1_NODE_WEB3_URL"); do
+ sleep 5
+ echo "Will wait $((RETRIES--)) more times for L1 $L1_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $L1_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $L1_NODE_WEB3_URL"
+
+RETRIES=${RETRIES:-30}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$L2_NODE_WEB3_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for L2 $L2_NODE_WEB3_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $L2_NODE_WEB3_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Node at $L2_NODE_WEB3_URL"
+
+if [ ! -z "$DEPLOYER_HTTP" ]; then
+ RETRIES=${RETRIES:-20}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$DEPLOYER_HTTP/addresses.json"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $DEPLOYER_HTTP to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+ ADDRESS_MANAGER_ADDRESS=$(curl --silent $DEPLOYER_HTTP/addresses.json | jq -r .AddressManager)
+ exec env \
+ ADDRESS_MANAGER_ADDRESS=$ADDRESS_MANAGER_ADDRESS \
+ L1_BLOCK_OFFSET=$L1_BLOCK_OFFSET \
+ $cmd
+else
+ $cmd
+fi
diff --git a/ops_omgx/goHealthCheck-src/go.mod b/ops_omgx/goHealthCheck-src/go.mod
new file mode 100644
index 000000000000..c85953d79ff4
--- /dev/null
+++ b/ops_omgx/goHealthCheck-src/go.mod
@@ -0,0 +1 @@
+module github.com/omgnetwork/optimism/ops_omgx/goHealthCheck
diff --git a/ops_omgx/goHealthCheck-src/main.go b/ops_omgx/goHealthCheck-src/main.go
new file mode 100644
index 000000000000..cc78aabad9b4
--- /dev/null
+++ b/ops_omgx/goHealthCheck-src/main.go
@@ -0,0 +1,29 @@
+package main
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+)
+
+var port = ":10000"
+
+type Message struct {
+ Content string
+}
+
+func main() {
+ // env overriding port
+ if os.Getenv("HEALTH_PORT") != "" {
+ port = os.Getenv("HEALTH_PORT")
+ }
+
+ http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintf(w, "OK")
+ })
+
+ log.Print(fmt.Sprintf("Listening on %s...", port))
+
+ log.Fatal(http.ListenAndServe(port, nil))
+}
diff --git a/ops_omgx/health-check/manual.sh b/ops_omgx/health-check/manual.sh
new file mode 100644
index 000000000000..549c830c8aca
--- /dev/null
+++ b/ops_omgx/health-check/manual.sh
@@ -0,0 +1,143 @@
+#!/bin/bash
+cmd="$@"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+NODE_URL="http://localhost:9545"
+
+function print_usage_and_exit {
+ cat <] L1 web3 node url [default: http://localhost:9545]
+ -h, --help This help :)
+ Examples:
+ $(basename $0) --node
+EOF
+ exit 2
+}
+
+function timestamp {
+ local epoch=${1:-}
+
+ if [[ $epoch == true ]] ; then
+ date '+%s'
+ else
+ date '+%F %H:%M:%S'
+ fi
+}
+
+function log_output {
+ LOG_LEVEL="${1:-INFO}"
+ echo "[$(timestamp)] $(basename ${0}) ${LOG_LEVEL}: ${@:2}" >&2
+}
+
+function error {
+ log_output ERROR "${@}"
+ exit 1
+}
+
+function getLatestBlock {
+ JSON='{"jsonrpc":"2.0","id":0,"method":"eth_getBlockByNumber","params":["latest", true]}'
+ RESULT=$(curl --silent --fail \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$NODE_URL");
+ CHECK=$(python -c "import sys, json; print('0' if 'error' in json.loads('$RESULT') else '1')")
+ ret=$?
+ if [ $ret -ne 0 ];
+ then
+ echo "Error while getting latest block: $RESULT"
+ else
+ if [ $CHECK == "1" ]; then
+ HASH=$(python -c "import sys, json; print(json.loads('$RESULT')['result']['hash'])")
+ echo "Latest block hash: $HASH"
+ else
+ ERROR=$(python -c "import sys, json; print(json.loads('$RESULT')['error']['message'])")
+ echo "Error while getting latest block: $ERROR"
+ fi
+ fi
+}
+
+function getGasPrice {
+ JSON='{"jsonrpc":"2.0","id":0,"method":"eth_gasPrice","params":[]}'
+ RESULT=$(curl --silent --fail \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$NODE_URL");
+ CHECK=$(python -c "import sys, json; print('0' if 'error' in json.loads('$RESULT') else '1')")
+ ret=$?
+ if [ $ret -ne 0 ];
+ then
+ echo "Error while getting gas price: $RESULT"
+ else
+ if [ $CHECK == "1" ]; then
+ PRICE=$(python -c "import sys, json; print(json.loads('$RESULT')['result'])")
+ echo "Gas price: $(($PRICE)) gwei"
+ else
+ ERROR=$(python -c "import sys, json; print(json.loads('$RESULT')['error']['message'])")
+ echo "Error while getting gas price: $ERROR"
+ fi
+ fi
+}
+
+function getChainId {
+ JSON='{"jsonrpc":"2.0","id":0,"method":"eth_chainId","params":[]}'
+ RESULT=$(curl --silent --fail \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$NODE_URL");
+ CHECK=$(python -c "import sys, json; print('0' if 'error' in json.loads('$RESULT') else '1')")
+ ret=$?
+ if [ $ret -ne 0 ];
+ then
+ echo "Error while getting chain id: $RESULT"
+ else
+ if [ $CHECK == "1" ]; then
+ CHAIN_ID=$(python -c "import sys, json; print(json.loads('$RESULT')['result'])")
+ echo "Chain id: $(($CHAIN_ID))"
+ else
+ ERROR=$(python -c "import sys, json; print(json.loads('$RESULT')['error']['message'])")
+ echo "Error while getting chain id: $ERROR"
+ fi
+ fi
+}
+
+if [[ $# -gt 0 ]]; then
+ while [[ $# -gt 0 ]]; do
+ case "${1}" in
+ -h|--help)
+ print_usage_and_exit
+ ;;
+ --node)
+ NODE_URL="${2}"
+ shift 2
+ ;;
+ --*)
+ error "Unknown option ${1}"
+ ;;
+ *)
+ error "Unknown sub-command ${1}"
+ ;;
+ esac
+ done
+else
+ echo "Warning: command without option --node will use default value: $NODE_URL"
+fi
+
+PS3='=============Please enter your choice: '
+options=("Get latest block" "Get gas price" "Get chain id" "Quit")
+select opt in "${options[@]}"
+do
+ case $opt in
+ "Get latest block")
+ getLatestBlock
+ ;;
+ "Get gas price")
+ getGasPrice
+ ;;
+ "Get chain id")
+ getChainId
+ ;;
+ "Quit")
+ break
+ ;;
+ *) echo "invalid option $REPLY";;
+ esac
+done
\ No newline at end of file
diff --git a/ops_omgx/health-check/test-deployer.sh b/ops_omgx/health-check/test-deployer.sh
new file mode 100644
index 000000000000..063c3b3000ec
--- /dev/null
+++ b/ops_omgx/health-check/test-deployer.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+cmd="$@"
+NODE_URL="http://localhost:8080"
+
+function print_usage_and_exit {
+ cat <] Deployer node url [default: http://localhost:8080]
+ -h, --help This help :)
+ Examples:
+ $(basename $0) --node
+EOF
+ exit 2
+}
+
+function timestamp {
+ local epoch=${1:-}
+
+ if [[ $epoch == true ]] ; then
+ date '+%s'
+ else
+ date '+%F %H:%M:%S'
+ fi
+}
+
+function log_output {
+ LOG_LEVEL="${1:-INFO}"
+ echo "[$(timestamp)] $(basename ${0}) ${LOG_LEVEL}: ${@:2}" >&2
+}
+
+function error {
+ log_output ERROR "${@}"
+ exit 1
+}
+
+if [[ $# -gt 0 ]]; then
+ while [[ $# -gt 0 ]]; do
+ case "${1}" in
+ -h|--help)
+ print_usage_and_exit
+ ;;
+ --node)
+ NODE_URL="${2}"
+ shift 2
+ ;;
+ --*)
+ error "Unknown option ${1}"
+ ;;
+ *)
+ error "Unknown sub-command ${1}"
+ ;;
+ esac
+ done
+else
+ echo "Warning: command without option --node will use default value: $NODE_URL"
+fi
+
+if [ ! -z "$NODE_URL" ]; then
+ RETRIES=${RETRIES:-20}
+ until $(curl --silent --fail \
+ --output /dev/null \
+ "$NODE_URL/addresses.json"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $NODE_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for contract deployment"
+ exit 1
+ fi
+ done
+ echo "Contracts are deployed"
+fi
diff --git a/ops_omgx/health-check/test-l1-node.sh b/ops_omgx/health-check/test-l1-node.sh
new file mode 100644
index 000000000000..42878acc49a8
--- /dev/null
+++ b/ops_omgx/health-check/test-l1-node.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+cmd="$@"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+NODE_URL="http://localhost:9545"
+
+function print_usage_and_exit {
+ cat <] L1 web3 node url [default: http://localhost:9545]
+ -h, --help This help :)
+ Examples:
+ $(basename $0) --node
+EOF
+ exit 2
+}
+
+function timestamp {
+ local epoch=${1:-}
+
+ if [[ $epoch == true ]] ; then
+ date '+%s'
+ else
+ date '+%F %H:%M:%S'
+ fi
+}
+
+function log_output {
+ LOG_LEVEL="${1:-INFO}"
+ echo "[$(timestamp)] $(basename ${0}) ${LOG_LEVEL}: ${@:2}" >&2
+}
+
+function error {
+ log_output ERROR "${@}"
+ exit 1
+}
+
+if [[ $# -gt 0 ]]; then
+ while [[ $# -gt 0 ]]; do
+ case "${1}" in
+ -h|--help)
+ print_usage_and_exit
+ ;;
+ --node)
+ NODE_URL="${2}"
+ shift 2
+ ;;
+ --*)
+ error "Unknown option ${1}"
+ ;;
+ *)
+ error "Unknown sub-command ${1}"
+ ;;
+ esac
+ done
+else
+ echo "Warning: command without option --node will use default value: $NODE_URL"
+fi
+
+RETRIES=${RETRIES:-20}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$NODE_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $NODE_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer one node at $NODE_URL"
+ exit 1
+ fi
+done
+echo "Connected to L1 Node at $NODE_URL"
diff --git a/ops_omgx/health-check/test-l2-node.sh b/ops_omgx/health-check/test-l2-node.sh
new file mode 100644
index 000000000000..73f79fd7ee78
--- /dev/null
+++ b/ops_omgx/health-check/test-l2-node.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+cmd="$@"
+JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
+NODE_URL="http://localhost:8545"
+
+function print_usage_and_exit {
+ cat <] L2 web3 node url [default: http://localhost:8545]
+ -h, --help This help :)
+ Examples:
+ $(basename $0) --node
+EOF
+ exit 2
+}
+
+function timestamp {
+ local epoch=${1:-}
+
+ if [[ $epoch == true ]] ; then
+ date '+%s'
+ else
+ date '+%F %H:%M:%S'
+ fi
+}
+
+function log_output {
+ LOG_LEVEL="${1:-INFO}"
+ echo "[$(timestamp)] $(basename ${0}) ${LOG_LEVEL}: ${@:2}" >&2
+}
+
+function error {
+ log_output ERROR "${@}"
+ exit 1
+}
+
+if [[ $# -gt 0 ]]; then
+ while [[ $# -gt 0 ]]; do
+ case "${1}" in
+ -h|--help)
+ print_usage_and_exit
+ ;;
+ --node)
+ NODE_URL="${2}"
+ shift 2
+ ;;
+ --*)
+ error "Unknown option ${1}"
+ ;;
+ *)
+ error "Unknown sub-command ${1}"
+ ;;
+ esac
+ done
+else
+ echo "Warning: command without option --node will use default value: $NODE_URL"
+fi
+
+RETRIES=${RETRIES:-30}
+until $(curl --silent --fail \
+ --output /dev/null \
+ -H "Content-Type: application/json" \
+ --data "$JSON" "$NODE_URL"); do
+ sleep 1
+ echo "Will wait $((RETRIES--)) more times for $NODE_URL to be up..."
+
+ if [ "$RETRIES" -lt 0 ]; then
+ echo "Timeout waiting for layer two node at $NODE_URL"
+ exit 1
+ fi
+done
+echo "Connected to L2 Node at $NODE_URL"
diff --git a/ops_omgx/healthcheck b/ops_omgx/healthcheck
new file mode 100755
index 000000000000..a169ae03f1a4
Binary files /dev/null and b/ops_omgx/healthcheck differ
diff --git a/ops_omgx/lambda/integration/env.yml.example b/ops_omgx/lambda/integration/env.yml.example
new file mode 100644
index 000000000000..23daea65f25c
--- /dev/null
+++ b/ops_omgx/lambda/integration/env.yml.example
@@ -0,0 +1,4 @@
+ROLE:
+SECURITYGROUP:
+SUBNET1:
+SUBNET2:
\ No newline at end of file
diff --git a/ops_omgx/lambda/integration/serverless.yml b/ops_omgx/lambda/integration/serverless.yml
new file mode 100644
index 000000000000..c6153a1eae13
--- /dev/null
+++ b/ops_omgx/lambda/integration/serverless.yml
@@ -0,0 +1,43 @@
+service: integration-sls-omgx-rinkeby-message-relayer # NOTE: update this with your service name
+
+provider:
+ name: aws
+ runtime: python3.7
+ stackName: integration-sls-omgx-rinkeby-message-relayer
+ stage: prod
+ region: us-east-1
+ role: ${file(env.yml):ROLE}
+
+package:
+ exclude:
+ - .gitignore
+ individually: true
+
+functions:
+ get_whitelist:
+ handler: whitelist.get_whitelist
+ vpc:
+ securityGroupIds:
+ - ${file(env.yml):SECURITYGROUP}
+ subnetIds:
+ - ${file(env.yml):SUBNET1}
+ - ${file(env.yml):SUBNET2}
+ events:
+ - http:
+ path: get.whitelist
+ method: get
+ cors: true
+
+ get_blacklist:
+ handler: whitelist.get_whitelist
+ vpc:
+ securityGroupIds:
+ - ${file(env.yml):SECURITYGROUP}
+ subnetIds:
+ - ${file(env.yml):SUBNET1}
+ - ${file(env.yml):SUBNET2}
+ events:
+ - http:
+ path: get.blacklist
+ method: get
+ cors: true
diff --git a/ops_omgx/lambda/integration/whitelist.py b/ops_omgx/lambda/integration/whitelist.py
new file mode 100644
index 000000000000..c5d373a1fe19
--- /dev/null
+++ b/ops_omgx/lambda/integration/whitelist.py
@@ -0,0 +1,26 @@
+import json
+
+def get_whitelist(event, context):
+ whitelist = [
+<<<<<<< HEAD:ops_omgx/lambda/integration/whitelist.py
+ "0x36DB8a0cb3eA240dA2e46B3C75aD273a98119E0B",
+=======
+ "0x1E7C2Ed00FaaFeD62afC9DD630ACB8C8c6C16D52",
+ "0x2C12649A5A4FC61F146E0a3409f3e4c7FbeD15Dc"
+>>>>>>> develop:packages/omgx/bl-wl/lambda/whitelist.py
+ ]
+ response = {
+ "statusCode": 201,
+ "headers": {
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Allow-Credentials": True,
+ "Strict-Transport-Security": "max-age=63072000; includeSubdomains; preload",
+ "X-Content-Type-Options": "nosniff",
+ "X-Frame-Options": "DENY",
+ "X-XSS-Protection": "1; mode=block",
+ "Referrer-Policy": "same-origin",
+ "Permissions-Policy": "*",
+ },
+ "body": json.dumps(whitelist),
+ }
+ return response
diff --git a/ops_omgx/lambda/production/env.yml.example b/ops_omgx/lambda/production/env.yml.example
new file mode 100644
index 000000000000..23daea65f25c
--- /dev/null
+++ b/ops_omgx/lambda/production/env.yml.example
@@ -0,0 +1,4 @@
+ROLE:
+SECURITYGROUP:
+SUBNET1:
+SUBNET2:
\ No newline at end of file
diff --git a/ops_omgx/lambda/production/serverless.yml b/ops_omgx/lambda/production/serverless.yml
new file mode 100644
index 000000000000..581f9b51c04e
--- /dev/null
+++ b/ops_omgx/lambda/production/serverless.yml
@@ -0,0 +1,47 @@
+service: sls-omgx-rinkeby-message-relayer # NOTE: update this with your service name
+
+provider:
+ name: aws
+ runtime: python3.7
+ stackName: sls-omgx-rinkeby-message-relayer
+ stage: prod
+ region: us-east-1
+ role: ${file(env.yml):ROLE}
+
+package:
+ exclude:
+ - .gitignore
+ individually: true
+
+functions:
+ get_whitelist:
+ handler: whitelist.get_whitelist
+ vpc:
+ securityGroupIds:
+ - ${file(env.yml):SECURITYGROUP}
+ subnetIds:
+ - ${file(env.yml):SUBNET1}
+ - ${file(env.yml):SUBNET2}
+ events:
+ - http:
+ path: get.whitelist
+ method: get
+ cors: true
+
+ get_blacklist:
+ handler: whitelist.get_whitelist
+ vpc:
+ securityGroupIds:
+ - ${file(env.yml):SECURITYGROUP}
+ subnetIds:
+ - ${file(env.yml):SUBNET1}
+ - ${file(env.yml):SUBNET2}
+ events:
+ - http:
+ path: get.blacklist
+ method: get
+<<<<<<< HEAD:ops_omgx/lambda/production/serverless.yml
+ cors: true
+=======
+ cors: true
+>>>>>>> develop:packages/omgx/bl-wl/lambda/serverless.yml
diff --git a/ops_omgx/lambda/production/whitelist.py b/ops_omgx/lambda/production/whitelist.py
new file mode 100644
index 000000000000..1bdfcd8812e3
--- /dev/null
+++ b/ops_omgx/lambda/production/whitelist.py
@@ -0,0 +1,20 @@
+import json
+
+def get_whitelist(event, context):
+ whitelist = ["0x27f54feB333AD17981a58B31dc978E99463C6323"]
+
+ response = {
+ "statusCode": 201,
+ "headers": {
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Allow-Credentials": True,
+ "Strict-Transport-Security": "max-age=63072000; includeSubdomains; preload",
+ "X-Content-Type-Options": "nosniff",
+ "X-Frame-Options": "DENY",
+ "X-XSS-Protection": "1; mode=block",
+ "Referrer-Policy": "same-origin",
+ "Permissions-Policy": "*",
+ },
+ "body": json.dumps(whitelist),
+ }
+ return response
diff --git a/ops_omgx/monitoring/.dockerignore b/ops_omgx/monitoring/.dockerignore
new file mode 100644
index 000000000000..a68bf2a5bb34
--- /dev/null
+++ b/ops_omgx/monitoring/.dockerignore
@@ -0,0 +1,8 @@
+.git
+.DS_Store
+.gitignore
+*.env
+Dockerfile
+docker-compose.yml
+README.md
+node_modules
diff --git a/ops_omgx/monitoring/.editorconfig b/ops_omgx/monitoring/.editorconfig
new file mode 100644
index 000000000000..b9fb7ab8fc1a
--- /dev/null
+++ b/ops_omgx/monitoring/.editorconfig
@@ -0,0 +1,11 @@
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/ops_omgx/monitoring/.gitignore b/ops_omgx/monitoring/.gitignore
new file mode 100644
index 000000000000..961f42f76897
--- /dev/null
+++ b/ops_omgx/monitoring/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+*.env
+coverage
+!artifacts
+!artifacts-ovm
diff --git a/ops_omgx/monitoring/Dockerfile b/ops_omgx/monitoring/Dockerfile
new file mode 100644
index 000000000000..8c1ad1c85373
--- /dev/null
+++ b/ops_omgx/monitoring/Dockerfile
@@ -0,0 +1,18 @@
+FROM node:12-alpine
+
+# Create app directory
+WORKDIR /usr/src/app
+
+# Install app dependencies
+# Wildcard is used to ensure both package and package lock JSON are copied
+COPY package*.json ./
+
+RUN npm ci
+
+COPY . .
+COPY ./dummy-transaction/entrypoint.sh /usr/local/bin/
+
+RUN chmod 755 /usr/src/app
+RUN chmod 755 /usr/local/bin/entrypoint.sh
+
+CMD [ "entrypoint.sh" ]
diff --git a/ops_omgx/monitoring/README.md b/ops_omgx/monitoring/README.md
new file mode 100644
index 000000000000..670b4409656e
--- /dev/null
+++ b/ops_omgx/monitoring/README.md
@@ -0,0 +1,38 @@
+## Description
+Script'll subscribe l1 and l2. Every new block, callback'll get balance of l1 pool and l2 pool, then log to console. Datadog agent can collect logs from docker host.
+
+## How to setup monitoring
+1. Create .env follow example:
+ ```
+ NODE_ENV=rinkeby
+ L1_NODE_WEB3_WS=ws://localhost:9545
+ L2_NODE_WEB3_WS=ws://localhost:8546
+ L1_LIQUIDITY_POOL_ADDRESS=0x1383fF5A0Ef67f4BE949408838478917d87FeAc7
+ L2_LIQUIDITY_POOL_ADDRESS=0x88b3743A9e1FdB3C8C92Cec7A6A370c1403c7C60
+ RELAYER_ADDRESS=0x3C8b7FdbF1e5B2519B00A8c9317C4BA51d6a4f9d
+ SEQUENCER_ADDRESS=0xE50faB5E5F46BB3E3e412d6DFbA73491a2D97695
+ RECONNECT_TIME=10000 // delay time to reconect provider
+ ```
+2. run `npm start`
+
+## How to setup dummy-transaction
+1. Create .env follow example:
+ ```
+ NODE_ENV=rinkeby
+ L1_NODE_WEB3_URL=https://rinkeby.infura.io/v3/d64a23da1a714a0f9f8bf6c9352235a8
+ L2_NODE_WEB3_URL=http://ec2-54-226-193-17.compute-1.amazonaws.com:8545
+ L1_LIQUIDITY_POOL_ADDRESS=0x473d2bbF979D0BFA39EBAB320c3216408386e68d
+ L2_LIQUIDITY_POOL_ADDRESS=0x1eCD5FBbb64F375A74670A1233CfA74D695fD861
+ L1_GAS_USED=229932
+ L1_ADDRESS_MANAGER=0x93A96D6A5beb1F661cf052722A1424CDDA3e9418
+ L2_DEPOSITED_ERC20=0x0e52DEfc53ec6dCc52d630af949a9b6313455aDF
+ DUMMY_DELAY_MINS=5
+ DUMMY_ETH_AMOUNT=0.0005
+ ```
+2. run `npm run dummy-transaction`
+
+## How to deploy image
+1. Build new image: `docker build -t enyalabs/omgx-monitor:{version-number} .` version-number:
+ - format `v1.1.2` is for monitoring service
+ - format `dummy-v1.1.2` is for dummy-transaction service
+2. Push new image to docker hub: `docker push enyalabs/omgx-monitor:{version-number}`
diff --git a/ops_omgx/monitoring/docker-compose.yml b/ops_omgx/monitoring/docker-compose.yml
new file mode 100644
index 000000000000..f5b322cdf405
--- /dev/null
+++ b/ops_omgx/monitoring/docker-compose.yml
@@ -0,0 +1,7 @@
+version: "3.4"
+
+services:
+ monitoring:
+ image: enyalabs/omgx-monitor:v1.2.3
+ env_file:
+ - .env
diff --git a/ops_omgx/monitoring/dummy-transaction/docker-compose.yml b/ops_omgx/monitoring/dummy-transaction/docker-compose.yml
new file mode 100644
index 000000000000..996882d41b44
--- /dev/null
+++ b/ops_omgx/monitoring/dummy-transaction/docker-compose.yml
@@ -0,0 +1,7 @@
+version: "3.4"
+
+services:
+ monitoring:
+ image: enyalabs/omgx-monitor:dummy-v1.1.0
+ env_file:
+ - ../.env
diff --git a/ops_omgx/monitoring/dummy-transaction/entrypoint.sh b/ops_omgx/monitoring/dummy-transaction/entrypoint.sh
new file mode 100644
index 000000000000..808ce47fe447
--- /dev/null
+++ b/ops_omgx/monitoring/dummy-transaction/entrypoint.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+npm run dummy-transaction
diff --git a/ops_omgx/monitoring/entrypoint.sh b/ops_omgx/monitoring/entrypoint.sh
new file mode 100644
index 000000000000..311d0302c069
--- /dev/null
+++ b/ops_omgx/monitoring/entrypoint.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+npm start
diff --git a/ops_omgx/monitoring/jest.config.js b/ops_omgx/monitoring/jest.config.js
new file mode 100644
index 000000000000..7087c9644a15
--- /dev/null
+++ b/ops_omgx/monitoring/jest.config.js
@@ -0,0 +1,14 @@
+export default {
+ "transform": {
+ "^.+\\.tsx?$": "ts-jest",
+ },
+ "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
+ "moduleFileExtensions": [
+ "ts",
+ "tsx",
+ "js",
+ "jsx",
+ "json",
+ "node",
+ ],
+};
diff --git a/ops_omgx/monitoring/package-lock.json b/ops_omgx/monitoring/package-lock.json
new file mode 100644
index 000000000000..b41fdd6c9b64
--- /dev/null
+++ b/ops_omgx/monitoring/package-lock.json
@@ -0,0 +1,20594 @@
+{
+ "name": "omgx-liquidity-pool-utils",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz",
+ "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz",
+ "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.14.5",
+ "@babel/helper-compilation-targets": "^7.14.5",
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helpers": "^7.14.6",
+ "@babel/parser": "^7.14.6",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.1.2",
+ "semver": "^6.3.0",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.14.5"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "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/generator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
+ "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ },
+ "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
+ }
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz",
+ "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
+ "browserslist": "^4.16.6",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
+ "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
+ "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
+ "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz",
+ "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
+ "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz",
+ "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5",
+ "@babel/helper-simple-access": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "dependencies": {
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
+ "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
+ "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
+ "dev": true
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz",
+ "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.14.5",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz",
+ "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
+ "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
+ "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz",
+ "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
+ "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.0",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz",
+ "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==",
+ "dev": true
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-typescript": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz",
+ "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/template": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
+ "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.14.5"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz",
+ "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.14.5",
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-hoist-variables": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/parser": "^7.14.7",
+ "@babel/types": "^7.14.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.14.5"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
+ "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "to-fast-properties": "^2.0.0"
+ },
+ "dependencies": {
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true
+ }
+ }
+ },
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "@dabh/diagnostics": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz",
+ "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==",
+ "requires": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "@eth-optimism/contracts": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.4.1.tgz",
+ "integrity": "sha512-oXHNUFUMVL0hLJfuquj9/8PKdCQPSVCxg3vCGbjgeWA3PAsMUn3JCg15dsw+9qhcADt8CaE0brF/OJbarFWD8g==",
+ "requires": {
+ "@eth-optimism/core-utils": "^0.4.6",
+ "@ethersproject/abstract-provider": "^5.0.8",
+ "@ethersproject/abstract-signer": "^5.1.0",
+ "@ethersproject/contracts": "^5.0.5",
+ "glob": "^7.1.6"
+ }
+ },
+ "@eth-optimism/core-utils": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.4.7.tgz",
+ "integrity": "sha512-H+NdGAyx6w4Wmjy3PaTF7xnBEeKh8BZK1jfU6yy52sd2E0oH7ABd0H5FtRY2SLPTH8AZ8gAgOhrTNoqE0Mlktw==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.0.9",
+ "ethers": "^5.0.31",
+ "lodash": "^4.17.21"
+ }
+ },
+ "@eth-optimism/hardhat-ovm": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@eth-optimism/hardhat-ovm/-/hardhat-ovm-0.1.2.tgz",
+ "integrity": "sha512-rOQBv8nffanfbDzixAScpwD68uuQXaf5x1z0rz52QvdTK6bMm1NswXscmQKn/uJqiH2ZLS27uPhm/YAC//44lQ==",
+ "requires": {
+ "node-fetch": "^2.6.1"
+ }
+ },
+ "@ethersproject/abi": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.0.tgz",
+ "integrity": "sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/hash": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
+ "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/abstract-provider": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz",
+ "integrity": "sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/networks": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0",
+ "@ethersproject/web": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/abstract-signer": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz",
+ "integrity": "sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.3.0",
+ "@ethersproject/bignumber": "^5.3.0",
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0",
+ "@ethersproject/properties": "^5.3.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.3.0.tgz",
+ "integrity": "sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.3.0",
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/keccak256": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0",
+ "@ethersproject/rlp": "^5.3.0"
+ }
+ },
+ "@ethersproject/base64": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz",
+ "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ }
+ }
+ },
+ "@ethersproject/basex": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.4.0.tgz",
+ "integrity": "sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.3.0.tgz",
+ "integrity": "sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.3.0.tgz",
+ "integrity": "sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==",
+ "requires": {
+ "@ethersproject/logger": "^5.3.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.3.0.tgz",
+ "integrity": "sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.3.0"
+ }
+ },
+ "@ethersproject/contracts": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.4.0.tgz",
+ "integrity": "sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw==",
+ "requires": {
+ "@ethersproject/abi": "^5.4.0",
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/hardware-wallets": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hardware-wallets/-/hardware-wallets-5.4.0.tgz",
+ "integrity": "sha512-Ea4ymm4etZoSWy93OcEGZkuVqyYdl/RjMlaXY6yQIYjsGi75sm4apbTiBA8DA9uajkv1FVakJZEBBTaVGgnBLA==",
+ "requires": {
+ "@ledgerhq/hw-app-eth": "5.27.2",
+ "@ledgerhq/hw-transport": "5.26.0",
+ "@ledgerhq/hw-transport-node-hid": "5.26.0",
+ "@ledgerhq/hw-transport-u2f": "5.26.0",
+ "ethers": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.3.0.tgz",
+ "integrity": "sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.3.0",
+ "@ethersproject/address": "^5.3.0",
+ "@ethersproject/bignumber": "^5.3.0",
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/keccak256": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0",
+ "@ethersproject/properties": "^5.3.0",
+ "@ethersproject/strings": "^5.3.0"
+ }
+ },
+ "@ethersproject/hdnode": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.4.0.tgz",
+ "integrity": "sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/basex": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/pbkdf2": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/sha2": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0",
+ "@ethersproject/wordlists": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/json-wallets": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz",
+ "integrity": "sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/hdnode": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/pbkdf2": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/random": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0",
+ "aes-js": "3.0.0",
+ "scrypt-js": "3.0.1"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.3.0.tgz",
+ "integrity": "sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==",
+ "requires": {
+ "@ethersproject/bytes": "^5.3.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.3.0.tgz",
+ "integrity": "sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA=="
+ },
+ "@ethersproject/networks": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.0.tgz",
+ "integrity": "sha512-5fywtKRDcnaVeA5SjxXH3DOQqe/IbeD/plwydi94SdPps1fbDUrnO6SzDExaruBZXxpxJcO9upG9UComsei4bg==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ }
+ }
+ },
+ "@ethersproject/pbkdf2": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz",
+ "integrity": "sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/sha2": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ }
+ }
+ },
+ "@ethersproject/properties": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.3.0.tgz",
+ "integrity": "sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==",
+ "requires": {
+ "@ethersproject/logger": "^5.3.0"
+ }
+ },
+ "@ethersproject/providers": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.4.0.tgz",
+ "integrity": "sha512-XRmI9syLnkNdLA8ikEeg0duxmwSWTTt9S+xabnTOyI51JPJyhQ0QUNT+wvmod218ebb7rLupHDPQ7UVe2/+Tjg==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/basex": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/hash": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/networks": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/random": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/sha2": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0",
+ "@ethersproject/web": "^5.4.0",
+ "bech32": "1.1.4",
+ "ws": "7.4.6"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
+ "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/random": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.4.0.tgz",
+ "integrity": "sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ }
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.3.0.tgz",
+ "integrity": "sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==",
+ "requires": {
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0"
+ }
+ },
+ "@ethersproject/sha2": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.4.0.tgz",
+ "integrity": "sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "hash.js": "1.1.7"
+ },
+ "dependencies": {
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ }
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.3.0.tgz",
+ "integrity": "sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==",
+ "requires": {
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0",
+ "@ethersproject/properties": "^5.3.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/solidity": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.4.0.tgz",
+ "integrity": "sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/sha2": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.3.0.tgz",
+ "integrity": "sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==",
+ "requires": {
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/constants": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.3.0.tgz",
+ "integrity": "sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==",
+ "requires": {
+ "@ethersproject/address": "^5.3.0",
+ "@ethersproject/bignumber": "^5.3.0",
+ "@ethersproject/bytes": "^5.3.0",
+ "@ethersproject/constants": "^5.3.0",
+ "@ethersproject/keccak256": "^5.3.0",
+ "@ethersproject/logger": "^5.3.0",
+ "@ethersproject/properties": "^5.3.0",
+ "@ethersproject/rlp": "^5.3.0",
+ "@ethersproject/signing-key": "^5.3.0"
+ }
+ },
+ "@ethersproject/units": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.4.0.tgz",
+ "integrity": "sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ }
+ }
+ },
+ "@ethersproject/wallet": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.4.0.tgz",
+ "integrity": "sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/hash": "^5.4.0",
+ "@ethersproject/hdnode": "^5.4.0",
+ "@ethersproject/json-wallets": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/random": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0",
+ "@ethersproject/wordlists": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
+ "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/web": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz",
+ "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==",
+ "requires": {
+ "@ethersproject/base64": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@ethersproject/wordlists": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.4.0.tgz",
+ "integrity": "sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/hash": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
+ "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ }
+ }
+ },
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "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
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "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
+ }
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
+ },
+ "@jest/console": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz",
+ "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/core": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz",
+ "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^27.0.6",
+ "@jest/reporters": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/transform": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.4",
+ "jest-changed-files": "^27.0.6",
+ "jest-config": "^27.0.6",
+ "jest-haste-map": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-regex-util": "^27.0.6",
+ "jest-resolve": "^27.0.6",
+ "jest-resolve-dependencies": "^27.0.6",
+ "jest-runner": "^27.0.6",
+ "jest-runtime": "^27.0.6",
+ "jest-snapshot": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-validate": "^27.0.6",
+ "jest-watcher": "^27.0.6",
+ "micromatch": "^4.0.4",
+ "p-each-series": "^2.1.0",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/environment": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz",
+ "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==",
+ "dev": true,
+ "requires": {
+ "@jest/fake-timers": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "jest-mock": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/fake-timers": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz",
+ "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "@sinonjs/fake-timers": "^7.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^27.0.6",
+ "jest-mock": "^27.0.6",
+ "jest-util": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/globals": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz",
+ "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "expect": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/reporters": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz",
+ "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==",
+ "dev": true,
+ "requires": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/transform": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.4",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.3",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "jest-haste-map": "^27.0.6",
+ "jest-resolve": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-worker": "^27.0.6",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/source-map": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz",
+ "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.4",
+ "source-map": "^0.6.0"
+ }
+ },
+ "@jest/test-result": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz",
+ "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/test-sequencer": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz",
+ "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==",
+ "dev": true,
+ "requires": {
+ "@jest/test-result": "^27.0.6",
+ "graceful-fs": "^4.2.4",
+ "jest-haste-map": "^27.0.6",
+ "jest-runtime": "^27.0.6"
+ }
+ },
+ "@jest/transform": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz",
+ "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.0.6",
+ "babel-plugin-istanbul": "^6.0.0",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-haste-map": "^27.0.6",
+ "jest-regex-util": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/types": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
+ "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@ledgerhq/cryptoassets": {
+ "version": "5.53.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz",
+ "integrity": "sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw==",
+ "requires": {
+ "invariant": "2"
+ }
+ },
+ "@ledgerhq/devices": {
+ "version": "5.51.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz",
+ "integrity": "sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==",
+ "requires": {
+ "@ledgerhq/errors": "^5.50.0",
+ "@ledgerhq/logs": "^5.50.0",
+ "rxjs": "6",
+ "semver": "^7.3.5"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@ledgerhq/errors": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz",
+ "integrity": "sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow=="
+ },
+ "@ledgerhq/hw-app-eth": {
+ "version": "5.27.2",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz",
+ "integrity": "sha512-llNdrE894cCN8j6yxJEUniciyLVcLmu5N0UmIJLOObztG+5rOF4bX54h4SreTWK+E10Z0CzHSeyE5Lz/tVcqqQ==",
+ "requires": {
+ "@ledgerhq/cryptoassets": "^5.27.2",
+ "@ledgerhq/errors": "^5.26.0",
+ "@ledgerhq/hw-transport": "^5.26.0",
+ "bignumber.js": "^9.0.1",
+ "rlp": "^2.2.6"
+ }
+ },
+ "@ledgerhq/hw-transport": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz",
+ "integrity": "sha512-NFeJOJmyEfAX8uuIBTpocWHcz630sqPcXbu864Q+OCBm4EK5UOKV1h/pX7e0xgNIKY8zhJ/O4p4cIZp9tnXLHQ==",
+ "requires": {
+ "@ledgerhq/devices": "^5.26.0",
+ "@ledgerhq/errors": "^5.26.0",
+ "events": "^3.2.0"
+ }
+ },
+ "@ledgerhq/hw-transport-node-hid": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.26.0.tgz",
+ "integrity": "sha512-qhaefZVZatJ6UuK8Wb6WSFNOLWc2mxcv/xgsfKi5HJCIr4bPF/ecIeN+7fRcEaycxj4XykY6Z4A7zDVulfFH4w==",
+ "optional": true,
+ "requires": {
+ "@ledgerhq/devices": "^5.26.0",
+ "@ledgerhq/errors": "^5.26.0",
+ "@ledgerhq/hw-transport": "^5.26.0",
+ "@ledgerhq/hw-transport-node-hid-noevents": "^5.26.0",
+ "@ledgerhq/logs": "^5.26.0",
+ "lodash": "^4.17.20",
+ "node-hid": "1.3.0",
+ "usb": "^1.6.3"
+ }
+ },
+ "@ledgerhq/hw-transport-node-hid-noevents": {
+ "version": "5.51.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.51.1.tgz",
+ "integrity": "sha512-9wFf1L8ZQplF7XOY2sQGEeOhpmBRzrn+4X43kghZ7FBDoltrcK+s/D7S+7ffg3j2OySyP6vIIIgloXylao5Scg==",
+ "optional": true,
+ "requires": {
+ "@ledgerhq/devices": "^5.51.1",
+ "@ledgerhq/errors": "^5.50.0",
+ "@ledgerhq/hw-transport": "^5.51.1",
+ "@ledgerhq/logs": "^5.50.0",
+ "node-hid": "2.1.1"
+ },
+ "dependencies": {
+ "@ledgerhq/hw-transport": {
+ "version": "5.51.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz",
+ "integrity": "sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==",
+ "optional": true,
+ "requires": {
+ "@ledgerhq/devices": "^5.51.1",
+ "@ledgerhq/errors": "^5.50.0",
+ "events": "^3.3.0"
+ }
+ },
+ "node-addon-api": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
+ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
+ "optional": true
+ },
+ "node-hid": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-2.1.1.tgz",
+ "integrity": "sha512-Skzhqow7hyLZU93eIPthM9yjot9lszg9xrKxESleEs05V2NcbUptZc5HFqzjOkSmL0sFlZFr3kmvaYebx06wrw==",
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "node-addon-api": "^3.0.2",
+ "prebuild-install": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@ledgerhq/hw-transport-u2f": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.26.0.tgz",
+ "integrity": "sha512-QTxP1Rsh+WZ184LUOelYVLeaQl3++V3I2jFik+l9JZtakwEHjD0XqOT750xpYNL/vfHsy31Wlz+oicdxGzFk+w==",
+ "requires": {
+ "@ledgerhq/errors": "^5.26.0",
+ "@ledgerhq/hw-transport": "^5.26.0",
+ "@ledgerhq/logs": "^5.26.0",
+ "u2f-api": "0.2.7"
+ }
+ },
+ "@ledgerhq/logs": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz",
+ "integrity": "sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA=="
+ },
+ "@openzeppelin/contracts": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1.tgz",
+ "integrity": "sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ=="
+ },
+ "@openzeppelin/contracts-upgradeable": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-3.4.1.tgz",
+ "integrity": "sha512-wBGlUzEkOxcj/ghtcF2yKc8ZYh+PTUtm1mK38zoENulJ6aplij7eH8quo3lMugfzPJy+V6V5qI8QhdQmCn7hkQ=="
+ },
+ "@sindresorhus/is": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+ },
+ "@sinonjs/commons": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
+ "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz",
+ "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "@szmarczak/http-timer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+ "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+ "requires": {
+ "defer-to-connect": "^1.0.1"
+ }
+ },
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true
+ },
+ "@tsconfig/node10": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz",
+ "integrity": "sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ=="
+ },
+ "@tsconfig/node12": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.7.tgz",
+ "integrity": "sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A=="
+ },
+ "@tsconfig/node14": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz",
+ "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ=="
+ },
+ "@tsconfig/node16": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz",
+ "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA=="
+ },
+ "@types/babel__core": {
+ "version": "7.1.14",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz",
+ "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "@types/babel__generator": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz",
+ "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__template": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz",
+ "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__traverse": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.0.tgz",
+ "integrity": "sha512-IilJZ1hJBUZwMOVDNTdflOOLzJB/ZtljYVa7k3gEZN/jqIJIPkWHC6dvbX+DD2CwZDHB9wAKzZPzzqMIkW37/w==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.3.0"
+ }
+ },
+ "@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/graceful-fs": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
+ "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+ "dev": true
+ },
+ "@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "@types/istanbul-reports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+ "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "@types/jest": {
+ "version": "26.0.23",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz",
+ "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==",
+ "dev": true,
+ "requires": {
+ "jest-diff": "^26.0.0",
+ "pretty-format": "^26.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "15.12.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.5.tgz",
+ "integrity": "sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg=="
+ },
+ "@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/prettier": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz",
+ "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==",
+ "dev": true
+ },
+ "@types/qs": {
+ "version": "6.9.6",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz",
+ "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA=="
+ },
+ "@types/secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/stack-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
+ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==",
+ "dev": true
+ },
+ "@types/yargs": {
+ "version": "15.0.13",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz",
+ "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "@types/yargs-parser": {
+ "version": "20.2.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz",
+ "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==",
+ "dev": true
+ },
+ "abab": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
+ "dev": true
+ },
+ "abi-decoder": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-2.4.0.tgz",
+ "integrity": "sha512-TOLU2q1HgYOjs1GKGtVzaqrYkar6I2fT9a80rzx6/9EJ/5crb4nCGuro0grZayixem93T7omrajYmLiMkYDLDA==",
+ "requires": {
+ "web3-eth-abi": "^1.2.1",
+ "web3-utils": "^1.2.1"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
+ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ }
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true
+ },
+ "aes-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
+ "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "requires": {
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.21.3"
+ }
+ },
+ "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": "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"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+ "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "optional": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
+ },
+ "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"
+ }
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "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": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "async": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
+ },
+ "async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="
+ },
+ "available-typed-arrays": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz",
+ "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA=="
+ },
+ "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.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
+ },
+ "babel-jest": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz",
+ "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==",
+ "dev": true,
+ "requires": {
+ "@jest/transform": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.0.0",
+ "babel-preset-jest": "^27.0.6",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "babel-plugin-istanbul": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+ "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^4.0.0",
+ "test-exclude": "^6.0.0"
+ }
+ },
+ "babel-plugin-jest-hoist": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz",
+ "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ }
+ },
+ "babel-preset-current-node-syntax": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ }
+ },
+ "babel-preset-jest": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz",
+ "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-jest-hoist": "^27.0.6",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "base-x": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz",
+ "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "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"
+ }
+ },
+ "bech32": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
+ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
+ },
+ "bignumber.js": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
+ "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+ },
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "requires": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "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": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "optional": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "blakejs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz",
+ "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U="
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "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"
+ }
+ },
+ "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": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+ }
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+ }
+ }
+ },
+ "browserslist": {
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001219",
+ "colorette": "^1.2.2",
+ "electron-to-chromium": "^1.3.723",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.71"
+ }
+ },
+ "bs-logger": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+ "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+ "dev": true,
+ "requires": {
+ "fast-json-stable-stringify": "2.x"
+ }
+ },
+ "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"
+ }
+ },
+ "bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "requires": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "requires": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "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="
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ },
+ "bufferutil": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
+ "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "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
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ },
+ "cacheable-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+ "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^3.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^1.0.2"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+ }
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001241",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz",
+ "integrity": "sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "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"
+ }
+ },
+ "char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ },
+ "ci-info": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz",
+ "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==",
+ "dev": true
+ },
+ "cids": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz",
+ "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==",
+ "requires": {
+ "buffer": "^5.5.0",
+ "class-is": "^1.1.0",
+ "multibase": "~0.6.0",
+ "multicodec": "^1.0.0",
+ "multihashes": "~0.4.15"
+ },
+ "dependencies": {
+ "multicodec": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz",
+ "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==",
+ "requires": {
+ "buffer": "^5.6.0",
+ "varint": "^5.0.0"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "cjs-module-lexer": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz",
+ "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==",
+ "dev": true
+ },
+ "class-is": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
+ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw=="
+ },
+ "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==",
+ "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="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "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=="
+ },
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "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==",
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "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="
+ },
+ "collect-v8-coverage": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+ "dev": true
+ },
+ "color": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
+ "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
+ "requires": {
+ "color-convert": "^1.9.1",
+ "color-string": "^1.5.2"
+ }
+ },
+ "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="
+ },
+ "color-string": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz",
+ "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==",
+ "requires": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+ },
+ "colorspace": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz",
+ "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==",
+ "requires": {
+ "color": "3.0.x",
+ "text-hex": "1.0.x"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "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.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"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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=",
+ "optional": true
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ },
+ "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=="
+ }
+ }
+ },
+ "content-hash": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz",
+ "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==",
+ "requires": {
+ "cids": "^0.7.1",
+ "multicodec": "^0.5.5",
+ "multihashes": "^0.4.15"
+ }
+ },
+ "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=="
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ },
+ "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
+ }
+ }
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
+ },
+ "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==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "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"
+ }
+ },
+ "create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+ },
+ "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"
+ }
+ },
+ "cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "dev": true
+ },
+ "cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "requires": {
+ "cssom": "~0.3.6"
+ },
+ "dependencies": {
+ "cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
+ }
+ }
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.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-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ }
+ },
+ "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"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "decimal.js": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+ "dev": true
+ },
+ "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-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+ "dev": true
+ },
+ "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==",
+ "optional": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
+ "defer-to-connect": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+ },
+ "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==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "optional": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "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="
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
+ "optional": true
+ },
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true
+ },
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
+ },
+ "diff-sequences": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
+ "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
+ "dev": true
+ },
+ "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": "0.7.2",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
+ "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
+ "dev": true,
+ "requires": {
+ "esutils": "^1.1.6",
+ "isarray": "0.0.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
+ }
+ }
+ },
+ "dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "dev": true,
+ "requires": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "dependencies": {
+ "webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "dev": true
+ }
+ }
+ },
+ "dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="
+ },
+ "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"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "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="
+ },
+ "electron-to-chromium": {
+ "version": "1.3.762",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.762.tgz",
+ "integrity": "sha512-LehWjRpfPcK8F1Lf/NZoAwWLWnjJVo0SZeQ9j/tvnBWYcT99qDqgo4raAfS2oTKZjPrR/jxruh85DGgDUmywEA==",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "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=="
+ },
+ "enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enyalabs_contracts": {
+ "version": "git+ssh://git@github.enya:enyalabs/contracts.git#f2521b04dced06e4fbcf704570ebb32c3010fac4",
+ "from": "git+ssh://git@github.enya:enyalabs/contracts.git",
+ "requires": {
+ "@eth-optimism/core-utils": "^0.1.10",
+ "@eth-optimism/hardhat-ovm": "^0.1.0",
+ "@ethersproject/abstract-provider": "^5.0.8",
+ "@ethersproject/contracts": "^5.0.5",
+ "@ethersproject/hardware-wallets": "^5.0.8",
+ "@openzeppelin/contracts": "^3.3.0",
+ "@openzeppelin/contracts-upgradeable": "^3.3.0",
+ "ganache-core": "^2.13.2",
+ "glob": "^7.1.6",
+ "hardhat-gas-reporter": "^1.0.4"
+ },
+ "dependencies": {
+ "@eth-optimism/core-utils": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.1.10.tgz",
+ "integrity": "sha512-RyZ79yP1gJP8Clx6AqvoDiJzbOVQccsyj0OobwiNfO4gUU1Lpmz37zXsQITSO+3bKWj+ipxg2baZnJwfoTxl5g==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.0.9",
+ "colors": "^1.4.0",
+ "debug": "^4.3.1",
+ "ethers": "^5.0.31",
+ "pino": "^6.11.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "enyalabs_core-utils": {
+ "version": "git+ssh://git@github.enya:enyalabs/core-utils.git#897cc9b14a6487537be431305cfdc1d100a02e1b",
+ "from": "git+ssh://git@github.enya:enyalabs/core-utils.git",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.0.9",
+ "ethers": "^5.0.31",
+ "lodash": "^4.17.21",
+ "pino": "^6.11.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
+ "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.2",
+ "is-callable": "^1.2.3",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.3",
+ "is-string": "^1.0.6",
+ "object-inspect": "^1.10.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "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-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "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": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz",
+ "integrity": "sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.1",
+ "jest-docblock": "^21.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=="
+ },
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz",
+ "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "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"
+ }
+ },
+ "eth-gas-reporter": {
+ "version": "0.2.22",
+ "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.22.tgz",
+ "integrity": "sha512-L1FlC792aTf3j/j+gGzSNlGrXKSxNPXQNk6TnV5NNZ2w3jnQCRyJjDl0zUo25Cq2t90IS5vGdbkwqFQK7Ce+kw==",
+ "requires": {
+ "@ethersproject/abi": "^5.0.0-beta.146",
+ "@solidity-parser/parser": "^0.12.0",
+ "cli-table3": "^0.5.0",
+ "colors": "^1.1.2",
+ "ethereumjs-util": "6.2.0",
+ "ethers": "^4.0.40",
+ "fs-readdir-recursive": "^1.1.0",
+ "lodash": "^4.17.14",
+ "markdown-table": "^1.1.3",
+ "mocha": "^7.1.1",
+ "req-cwd": "^2.0.0",
+ "request": "^2.88.0",
+ "request-promise-native": "^1.0.5",
+ "sha1": "^1.1.1",
+ "sync-request": "^6.0.0"
+ },
+ "dependencies": {
+ "@solidity-parser/parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.2.tgz",
+ "integrity": "sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q=="
+ },
+ "ethereumjs-util": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz",
+ "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "ethjs-util": "0.1.6",
+ "keccak": "^2.0.0",
+ "rlp": "^2.2.3",
+ "secp256k1": "^3.0.1"
+ }
+ },
+ "ethers": {
+ "version": "4.0.48",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz",
+ "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==",
+ "requires": {
+ "aes-js": "3.0.0",
+ "bn.js": "^4.4.0",
+ "elliptic": "6.5.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": {
+ "elliptic": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+ "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+ "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"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "keccak": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz",
+ "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==",
+ "requires": {
+ "bindings": "^1.5.0",
+ "inherits": "^2.0.4",
+ "nan": "^2.14.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "scrypt-js": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
+ "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw=="
+ },
+ "secp256k1": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz",
+ "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==",
+ "requires": {
+ "bindings": "^1.5.0",
+ "bip66": "^1.1.5",
+ "bn.js": "^4.11.8",
+ "create-hash": "^1.2.0",
+ "drbg.js": "^1.0.1",
+ "elliptic": "^6.5.2",
+ "nan": "^2.14.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "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="
+ }
+ }
+ },
+ "eth-lib": {
+ "version": "0.1.29",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz",
+ "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==",
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "nano-json-stream-parser": "^0.1.2",
+ "servify": "^0.1.12",
+ "ws": "^3.0.0",
+ "xhr-request-promise": "^0.1.2"
+ },
+ "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=="
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "requires": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
+ }
+ }
+ }
+ },
+ "ethereum-bloom-filters": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz",
+ "integrity": "sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg==",
+ "requires": {
+ "js-sha3": "^0.8.0"
+ },
+ "dependencies": {
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ }
+ }
+ },
+ "ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "requires": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "ethereumjs-common": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz",
+ "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA=="
+ },
+ "ethereumjs-tx": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
+ "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
+ "requires": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "ethers": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.0.tgz",
+ "integrity": "sha512-hqN1x0CV8VMpQ25WnNEjaMqtB3nA4DRAb2FSmmNaUbD1dF6kWbHs8YaXbVvD37FCg3GTEyc4rV9Pxafk1ByHKw==",
+ "requires": {
+ "@ethersproject/abi": "5.4.0",
+ "@ethersproject/abstract-provider": "5.4.0",
+ "@ethersproject/abstract-signer": "5.4.0",
+ "@ethersproject/address": "5.4.0",
+ "@ethersproject/base64": "5.4.0",
+ "@ethersproject/basex": "5.4.0",
+ "@ethersproject/bignumber": "5.4.0",
+ "@ethersproject/bytes": "5.4.0",
+ "@ethersproject/constants": "5.4.0",
+ "@ethersproject/contracts": "5.4.0",
+ "@ethersproject/hash": "5.4.0",
+ "@ethersproject/hdnode": "5.4.0",
+ "@ethersproject/json-wallets": "5.4.0",
+ "@ethersproject/keccak256": "5.4.0",
+ "@ethersproject/logger": "5.4.0",
+ "@ethersproject/networks": "5.4.0",
+ "@ethersproject/pbkdf2": "5.4.0",
+ "@ethersproject/properties": "5.4.0",
+ "@ethersproject/providers": "5.4.0",
+ "@ethersproject/random": "5.4.0",
+ "@ethersproject/rlp": "5.4.0",
+ "@ethersproject/sha2": "5.4.0",
+ "@ethersproject/signing-key": "5.4.0",
+ "@ethersproject/solidity": "5.4.0",
+ "@ethersproject/strings": "5.4.0",
+ "@ethersproject/transactions": "5.4.0",
+ "@ethersproject/units": "5.4.0",
+ "@ethersproject/wallet": "5.4.0",
+ "@ethersproject/web": "5.4.0",
+ "@ethersproject/wordlists": "5.4.0"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz",
+ "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz",
+ "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
+ "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
+ "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
+ "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ }
+ }
+ },
+ "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.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"
+ }
+ },
+ "eventemitter3": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
+ },
+ "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"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true
+ },
+ "expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "optional": true
+ },
+ "expect": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz",
+ "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-styles": "^5.0.0",
+ "jest-get-type": "^27.0.6",
+ "jest-matcher-utils": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-regex-util": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "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": {
+ "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=="
+ }
+ }
+ },
+ "ext": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+ "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+ "requires": {
+ "type": "^2.0.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
+ "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fast-redact": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.1.tgz",
+ "integrity": "sha512-kYpn4Y/valC9MdrISg47tZOpYBNoTXKgT9GYXFpHN/jYFs+lFkPoisY+LcBODdKVMY96ATzvzsWv+ES/4Kmufw=="
+ },
+ "fast-safe-stringify": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
+ },
+ "fb-watchman": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+ "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+ "dev": true,
+ "requires": {
+ "bser": "2.1.1"
+ }
+ },
+ "fecha": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz",
+ "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q=="
+ },
+ "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=="
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "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"
+ }
+ },
+ "flat": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
+ "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
+ "requires": {
+ "is-buffer": "~2.0.3"
+ }
+ },
+ "flatstr": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
+ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw=="
+ },
+ "fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
+ },
+ "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="
+ },
+ "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.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "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==",
+ "optional": true
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs-minipass": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+ "requires": {
+ "minipass": "^2.6.0"
+ }
+ },
+ "fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "ganache-core": {
+ "version": "2.13.2",
+ "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz",
+ "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==",
+ "requires": {
+ "abstract-leveldown": "3.0.0",
+ "async": "2.6.2",
+ "bip39": "2.5.0",
+ "cachedown": "1.0.0",
+ "clone": "2.1.2",
+ "debug": "3.2.6",
+ "encoding-down": "5.0.4",
+ "eth-sig-util": "3.0.0",
+ "ethereumjs-abi": "0.6.8",
+ "ethereumjs-account": "3.0.0",
+ "ethereumjs-block": "2.2.2",
+ "ethereumjs-common": "1.5.0",
+ "ethereumjs-tx": "2.1.2",
+ "ethereumjs-util": "6.2.1",
+ "ethereumjs-vm": "4.2.0",
+ "ethereumjs-wallet": "0.6.5",
+ "heap": "0.2.6",
+ "keccak": "3.0.1",
+ "level-sublevel": "6.6.4",
+ "levelup": "3.1.1",
+ "lodash": "4.17.20",
+ "lru-cache": "5.1.1",
+ "merkle-patricia-tree": "3.0.0",
+ "patch-package": "6.2.2",
+ "seedrandom": "3.0.1",
+ "source-map-support": "0.5.12",
+ "tmp": "0.1.0",
+ "web3": "1.2.11",
+ "web3-provider-engine": "14.2.1",
+ "websocket": "1.0.32"
+ },
+ "dependencies": {
+ "@ethersproject/abi": {
+ "version": "5.0.0-beta.153",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz",
+ "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/address": ">=5.0.0-beta.128",
+ "@ethersproject/bignumber": ">=5.0.0-beta.130",
+ "@ethersproject/bytes": ">=5.0.0-beta.129",
+ "@ethersproject/constants": ">=5.0.0-beta.128",
+ "@ethersproject/hash": ">=5.0.0-beta.128",
+ "@ethersproject/keccak256": ">=5.0.0-beta.127",
+ "@ethersproject/logger": ">=5.0.0-beta.129",
+ "@ethersproject/properties": ">=5.0.0-beta.131",
+ "@ethersproject/strings": ">=5.0.0-beta.130"
+ }
+ },
+ "@ethersproject/abstract-provider": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.8.tgz",
+ "integrity": "sha512-fqJXkewcGdi8LogKMgRyzc/Ls2js07yor7+g9KfPs09uPOcQLg7cc34JN+lk34HH9gg2HU0DIA5797ZR8znkfw==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/networks": "^5.0.7",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/transactions": "^5.0.9",
+ "@ethersproject/web": "^5.0.12"
+ }
+ },
+ "@ethersproject/abstract-signer": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.10.tgz",
+ "integrity": "sha512-irx7kH7FDAeW7QChDPW19WsxqeB1d3XLyOLSXm0bfPqL1SS07LXWltBJUBUxqC03ORpAOcM3JQj57DU8JnVY2g==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.0.8",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.9.tgz",
+ "integrity": "sha512-gKkmbZDMyGbVjr8nA5P0md1GgESqSGH7ILIrDidPdNXBl4adqbuA3OAuZx/O2oGpL6PtJ9BDa0kHheZ1ToHU3w==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/rlp": "^5.0.7"
+ }
+ },
+ "@ethersproject/base64": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.7.tgz",
+ "integrity": "sha512-S5oh5DVfCo06xwJXT8fQC68mvJfgScTl2AXvbYMsHNfIBTDb084Wx4iA9MNlEReOv6HulkS+gyrUM/j3514rSw==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.0.13",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.13.tgz",
+ "integrity": "sha512-b89bX5li6aK492yuPP5mPgRVgIxxBP7ksaBtKX5QQBsrZTpNOjf/MR4CjcUrAw8g+RQuD6kap9lPjFgY4U1/5A==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "bn.js": "^4.4.0"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.9.tgz",
+ "integrity": "sha512-k+17ZViDtAugC0s7HM6rdsTWEdIYII4RPCDkPEuxKc6i40Bs+m6tjRAtCECX06wKZnrEoR9pjOJRXHJ/VLoOcA==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.8.tgz",
+ "integrity": "sha512-sCc73pFBsl59eDfoQR5OCEZCRv5b0iywadunti6MQIr5lt3XpwxK1Iuzd8XSFO02N9jUifvuZRrt0cY0+NBgTg==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bignumber": "^5.0.13"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.10.tgz",
+ "integrity": "sha512-Tf0bvs6YFhw28LuHnhlDWyr0xfcDxSXdwM4TcskeBbmXVSKLv3bJQEEEBFUcRX0fJuslR3gCVySEaSh7vuMx5w==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.0.10",
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.7.tgz",
+ "integrity": "sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.8.tgz",
+ "integrity": "sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A==",
+ "optional": true
+ },
+ "@ethersproject/networks": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.7.tgz",
+ "integrity": "sha512-dI14QATndIcUgcCBL1c5vUr/YsI5cCHLN81rF7PU+yS7Xgp2/Rzbr9+YqpC6NBXHFUASjh6GpKqsVMpufAL0BQ==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/properties": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.7.tgz",
+ "integrity": "sha512-812H1Rus2vjw0zbasfDI1GLNPDsoyX1pYqiCgaR1BuyKxUTbwcH1B+214l6VGe1v+F6iEVb7WjIwMjKhb4EUsg==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.7.tgz",
+ "integrity": "sha512-ulUTVEuV7PT4jJTPpfhRHK57tkLEDEY9XSYJtrSNHOqdwMvH0z7BM2AKIMq4LVDlnu4YZASdKrkFGEIO712V9w==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.8.tgz",
+ "integrity": "sha512-YKxQM45eDa6WAD+s3QZPdm1uW1MutzVuyoepdRRVmMJ8qkk7iOiIhUkZwqKLNxKzEJijt/82ycuOREc9WBNAKg==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "elliptic": "6.5.3"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.8.tgz",
+ "integrity": "sha512-5IsdXf8tMY8QuHl8vTLnk9ehXDDm6x9FB9S9Og5IA1GYhLe5ZewydXSjlJlsqU2t9HRbfv97OJZV/pX8DVA/Hw==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.9.tgz",
+ "integrity": "sha512-0Fu1yhdFBkrbMjenEr+39tmDxuHmaw0pe9Jb18XuKoItj7Z3p7+UzdHLr2S/okvHDHYPbZE5gtANDdQ3ZL1nBA==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/rlp": "^5.0.7",
+ "@ethersproject/signing-key": "^5.0.8"
+ }
+ },
+ "@ethersproject/web": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.12.tgz",
+ "integrity": "sha512-gVxS5iW0bgidZ76kr7LsTxj4uzN5XpCLzvZrLp8TP+4YgxHfCeetFyQkRPgBEAJdNrexdSBayvyJvzGvOq0O8g==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/base64": "^5.0.7",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
+ }
+ },
+ "@sindresorhus/is": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+ "optional": true
+ },
+ "@szmarczak/http-timer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+ "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+ "optional": true,
+ "requires": {
+ "defer-to-connect": "^1.0.1"
+ }
+ },
+ "@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/node": {
+ "version": "14.14.20",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz",
+ "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A=="
+ },
+ "@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/secp256k1": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz",
+ "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+ },
+ "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==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "optional": true,
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "aes-js": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==",
+ "optional": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.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==",
+ "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="
+ },
+ "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=",
+ "optional": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "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": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.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="
+ },
+ "async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
+ "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
+ "requires": {
+ "lodash": "^4.17.11"
+ }
+ },
+ "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-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ },
+ "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.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
+ },
+ "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"
+ },
+ "dependencies": {
+ "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="
+ },
+ "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"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "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"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ }
+ }
+ },
+ "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": {
+ "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"
+ }
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+ }
+ }
+ },
+ "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": {
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+ }
+ }
+ },
+ "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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "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"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "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=",
+ "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"
+ },
+ "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"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "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"
+ },
+ "dependencies": {
+ "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="
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "backoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
+ "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=",
+ "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"
+ }
+ }
+ }
+ },
+ "base-x": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz",
+ "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "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"
+ },
+ "dependencies": {
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ }
+ }
+ },
+ "bignumber.js": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
+ "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==",
+ "optional": true
+ },
+ "bip39": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz",
+ "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==",
+ "requires": {
+ "create-hash": "^1.1.0",
+ "pbkdf2": "^3.0.9",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "unorm": "^1.3.3"
+ }
+ },
+ "blakejs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz",
+ "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U="
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "optional": true
+ },
+ "bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw=="
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "optional": 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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "optional": true
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "optional": true
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "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==",
+ "optional": true,
+ "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==",
+ "optional": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
+ "optional": true
+ }
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "optional": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "requires": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "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=",
+ "optional": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ },
+ "bufferutil": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
+ "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "optional": true
+ },
+ "bytewise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz",
+ "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=",
+ "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=",
+ "requires": {
+ "typewise-core": "^1.2"
+ }
+ },
+ "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"
+ }
+ },
+ "cacheable-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+ "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+ "optional": true,
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^3.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^1.0.2"
+ },
+ "dependencies": {
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "optional": true
+ }
+ }
+ },
+ "cachedown": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz",
+ "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=",
+ "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==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
+ "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
+ "requires": {
+ "pseudomap": "^1.0.1"
+ }
+ }
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001174",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz",
+ "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA=="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "optional": true
+ },
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+ },
+ "cids": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz",
+ "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==",
+ "optional": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "class-is": "^1.1.0",
+ "multibase": "~0.6.0",
+ "multicodec": "^1.0.0",
+ "multihashes": "~0.4.15"
+ },
+ "dependencies": {
+ "multicodec": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz",
+ "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==",
+ "optional": true,
+ "requires": {
+ "buffer": "^5.6.0",
+ "varint": "^5.0.0"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "class-is": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
+ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==",
+ "optional": true
+ },
+ "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"
+ }
+ },
+ "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-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "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-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"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+ },
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "optional": true,
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "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.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "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"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ },
+ "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==",
+ "optional": true
+ }
+ }
+ },
+ "content-hash": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz",
+ "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==",
+ "optional": true,
+ "requires": {
+ "cids": "^0.7.1",
+ "multicodec": "^0.5.5",
+ "multihashes": "^0.4.15"
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ },
+ "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=="
+ }
+ }
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "optional": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "optional": true
+ },
+ "cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==",
+ "optional": true
+ },
+ "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.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ },
+ "core-js-pure": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.2.tgz",
+ "integrity": "sha512-v6zfIQqL/pzTVAbZvYUozsxNfxcFb6Ks3ZfEbuneJl3FW9Jb8F6vLWB6f+qTmAu72msUdyb84V8d/yBFf7FNnw=="
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "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-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"
+ }
+ },
+ "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==",
+ "optional": 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"
+ }
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.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"
+ }
+ },
+ "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"
+ }
+ },
+ "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-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "optional": true,
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "defer-to-connect": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+ "optional": true
+ },
+ "deferred-leveldown": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz",
+ "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==",
+ "requires": {
+ "abstract-leveldown": "~5.0.0",
+ "inherits": "^2.0.3"
+ },
+ "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==",
+ "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==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "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"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "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=",
+ "optional": true
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "optional": 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=",
+ "optional": 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"
+ }
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "dotignore": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
+ "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "optional": true
+ },
+ "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=",
+ "optional": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.636",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.636.tgz",
+ "integrity": "sha512-Adcvng33sd3gTjNIDNXGD1G4H6qCImIy2euUJAQHtLNplEKU5WEz5KRJxupRNIIT8sD5oFZLTKBWAf12Bsz24A=="
+ },
+ "elliptic": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+ "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+ "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"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "optional": true
+ },
+ "encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "requires": {
+ "iconv-lite": "^0.6.2"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+ "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ }
+ }
+ },
+ "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==",
+ "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==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ }
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "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-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "optional": 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="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "optional": 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==",
+ "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": {
+ "ethereumjs-tx": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz",
+ "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==",
+ "requires": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "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=",
+ "optional": true,
+ "requires": {
+ "idna-uts46-hx": "^2.3.1",
+ "js-sha3": "^0.5.7"
+ }
+ },
+ "eth-json-rpc-infura": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz",
+ "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==",
+ "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"
+ }
+ },
+ "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"
+ },
+ "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==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "ethereumjs-account": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz",
+ "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==",
+ "requires": {
+ "ethereumjs-util": "^5.0.0",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-block": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz",
+ "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereum-common": "0.2.0",
+ "ethereumjs-tx": "^1.2.2",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "ethereum-common": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz",
+ "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA=="
+ }
+ }
+ },
+ "ethereumjs-tx": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz",
+ "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==",
+ "requires": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-vm": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz",
+ "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==",
+ "requires": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "ethereumjs-account": "^2.0.3",
+ "ethereumjs-block": "~2.2.0",
+ "ethereumjs-common": "^1.1.0",
+ "ethereumjs-util": "^6.0.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1"
+ },
+ "dependencies": {
+ "ethereumjs-block": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz",
+ "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ }
+ }
+ },
+ "ethereumjs-tx": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
+ "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
+ "requires": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ }
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "level-codec": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz",
+ "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ=="
+ },
+ "level-errors": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz",
+ "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==",
+ "requires": {
+ "errno": "~0.1.1"
+ }
+ },
+ "level-iterator-stream": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz",
+ "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ }
+ }
+ },
+ "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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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="
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+ },
+ "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=="
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "eth-lib": {
+ "version": "0.1.29",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz",
+ "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "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=",
+ "requires": {
+ "json-rpc-random-id": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "eth-sig-util": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.0.tgz",
+ "integrity": "sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==",
+ "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"
+ },
+ "dependencies": {
+ "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.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz",
+ "integrity": "sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==",
+ "requires": {
+ "bn.js": "^4.8.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.0.0"
+ }
+ }
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ethereumjs-account": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz",
+ "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==",
+ "requires": {
+ "ethereumjs-util": "^5.0.0",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-block": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz",
+ "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereum-common": "0.2.0",
+ "ethereumjs-tx": "^1.2.2",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "ethereum-common": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz",
+ "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA=="
+ }
+ }
+ },
+ "ethereumjs-tx": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz",
+ "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==",
+ "requires": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-vm": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz",
+ "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==",
+ "requires": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "ethereumjs-account": "^2.0.3",
+ "ethereumjs-block": "~2.2.0",
+ "ethereumjs-common": "^1.1.0",
+ "ethereumjs-util": "^6.0.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1"
+ },
+ "dependencies": {
+ "ethereumjs-block": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz",
+ "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ }
+ }
+ },
+ "ethereumjs-tx": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
+ "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
+ "requires": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ }
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "level-codec": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz",
+ "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ=="
+ },
+ "level-errors": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz",
+ "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==",
+ "requires": {
+ "errno": "~0.1.1"
+ }
+ },
+ "level-iterator-stream": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz",
+ "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ }
+ }
+ },
+ "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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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="
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+ },
+ "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=="
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "ethashjs": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz",
+ "integrity": "sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==",
+ "requires": {
+ "async": "^2.1.2",
+ "buffer-xor": "^2.0.1",
+ "ethereumjs-util": "^7.0.2",
+ "miller-rabin": "^4.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ=="
+ },
+ "buffer-xor": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz",
+ "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==",
+ "requires": {
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz",
+ "integrity": "sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.4"
+ }
+ }
+ }
+ },
+ "ethereum-bloom-filters": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz",
+ "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==",
+ "optional": true,
+ "requires": {
+ "js-sha3": "^0.8.0"
+ },
+ "dependencies": {
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
+ "optional": true
+ }
+ }
+ },
+ "ethereum-common": {
+ "version": "0.0.18",
+ "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz",
+ "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8="
+ },
+ "ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "requires": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "ethereumjs-abi": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz",
+ "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==",
+ "requires": {
+ "bn.js": "^4.11.8",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "ethereumjs-account": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz",
+ "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==",
+ "requires": {
+ "ethereumjs-util": "^6.0.0",
+ "rlp": "^2.2.1",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-block": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz",
+ "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "level-codec": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz",
+ "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ=="
+ },
+ "level-errors": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz",
+ "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==",
+ "requires": {
+ "errno": "~0.1.1"
+ }
+ },
+ "level-iterator-stream": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz",
+ "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ }
+ }
+ },
+ "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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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="
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+ },
+ "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=="
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "ethereumjs-blockchain": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz",
+ "integrity": "sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==",
+ "requires": {
+ "async": "^2.6.1",
+ "ethashjs": "~0.0.7",
+ "ethereumjs-block": "~2.2.2",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.1.0",
+ "flow-stoplight": "^1.0.0",
+ "level-mem": "^3.0.1",
+ "lru-cache": "^5.1.1",
+ "rlp": "^2.2.2",
+ "semaphore": "^1.1.0"
+ }
+ },
+ "ethereumjs-common": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz",
+ "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ=="
+ },
+ "ethereumjs-tx": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
+ "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
+ "requires": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "ethereumjs-vm": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz",
+ "integrity": "sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==",
+ "requires": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "core-js-pure": "^3.0.1",
+ "ethereumjs-account": "^3.0.0",
+ "ethereumjs-block": "^2.2.2",
+ "ethereumjs-blockchain": "^4.0.3",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.2",
+ "ethereumjs-util": "^6.2.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",
+ "util.promisify": "^1.0.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==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "level-codec": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz",
+ "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ=="
+ },
+ "level-errors": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz",
+ "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==",
+ "requires": {
+ "errno": "~0.1.1"
+ }
+ },
+ "level-iterator-stream": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz",
+ "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ }
+ }
+ },
+ "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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+ },
+ "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=="
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "ethereumjs-wallet": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz",
+ "integrity": "sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==",
+ "optional": true,
+ "requires": {
+ "aes-js": "^3.1.1",
+ "bs58check": "^2.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethereumjs-util": "^6.0.0",
+ "randombytes": "^2.0.6",
+ "safe-buffer": "^5.1.2",
+ "scryptsy": "^1.2.1",
+ "utf8": "^3.0.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "ethjs-unit": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
+ "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=",
+ "optional": 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=",
+ "optional": 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==",
+ "requires": {
+ "is-hex-prefixed": "1.0.0",
+ "strip-hex-prefix": "1.0.0"
+ }
+ },
+ "eventemitter3": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
+ "optional": true
+ },
+ "events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg=="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "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-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "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-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"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "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=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "optional": 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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "optional": true
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "optional": 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==",
+ "optional": true
+ }
+ }
+ },
+ "ext": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+ "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+ "requires": {
+ "type": "^2.0.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
+ "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA=="
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "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=",
+ "requires": {
+ "checkpoint-store": "^1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "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"
+ },
+ "dependencies": {
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "optional": 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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "optional": true
+ }
+ }
+ },
+ "find-yarn-workspace-root": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz",
+ "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==",
+ "requires": {
+ "fs-extra": "^4.0.3",
+ "micromatch": "^3.1.4"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.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-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "flow-stoplight": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz",
+ "integrity": "sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s="
+ },
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "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=",
+ "optional": 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=",
+ "optional": true
+ },
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "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="
+ },
+ "get-intrinsic": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz",
+ "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "optional": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "requires": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "got": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+ "optional": true,
+ "requires": {
+ "@sindresorhus/is": "^0.14.0",
+ "@szmarczak/http-timer": "^1.1.2",
+ "cacheable-request": "^6.0.0",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^4.1.0",
+ "lowercase-keys": "^1.0.1",
+ "mimic-response": "^1.0.1",
+ "p-cancelable": "^1.0.0",
+ "to-readable-stream": "^1.0.0",
+ "url-parse-lax": "^3.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==",
+ "optional": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+ },
+ "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.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "requires": {
+ "ajv": "^6.12.3",
+ "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"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ }
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
+ },
+ "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==",
+ "optional": 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": {
+ "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-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"
+ }
+ }
+ }
+ },
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.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"
+ }
+ },
+ "heap": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz",
+ "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw="
+ },
+ "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=",
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.1"
+ }
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "optional": 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==",
+ "optional": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "optional": true
+ }
+ }
+ },
+ "http-https": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz",
+ "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=",
+ "optional": 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"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "optional": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "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==",
+ "optional": 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=",
+ "optional": true
+ }
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "immediate": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
+ "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw="
+ },
+ "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.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "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"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "optional": true
+ },
+ "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-arguments": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+ },
+ "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": "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-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
+ },
+ "is-fn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz",
+ "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw="
+ },
+ "is-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+ },
+ "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-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+ },
+ "is-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
+ "optional": true
+ },
+ "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=",
+ "optional": 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-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-retry-allowed": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
+ "optional": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "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": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "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="
+ },
+ "isurl": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+ "optional": true,
+ "requires": {
+ "has-to-string-tag-x": "^1.2.0",
+ "is-object": "^1.0.1"
+ }
+ },
+ "js-sha3": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
+ "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=",
+ "optional": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ },
+ "json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+ "optional": true
+ },
+ "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"
+ }
+ },
+ "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-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.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=",
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "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="
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "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="
+ },
+ "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": "3.0.1",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz",
+ "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==",
+ "requires": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "keyv": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+ "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+ "optional": true,
+ "requires": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ },
+ "klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "requires": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
+ "level-codec": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
+ "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
+ "requires": {
+ "buffer": "^5.6.0"
+ }
+ },
+ "level-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
+ "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
+ "requires": {
+ "errno": "~0.1.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.5",
+ "xtend": "^4.0.0"
+ }
+ },
+ "level-mem": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz",
+ "integrity": "sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==",
+ "requires": {
+ "level-packager": "~4.0.0",
+ "memdown": "~3.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==",
+ "requires": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
+ },
+ "memdown": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz",
+ "integrity": "sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==",
+ "requires": {
+ "abstract-leveldown": "~5.0.0",
+ "functional-red-black-tree": "~1.0.1",
+ "immediate": "~3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "level-packager": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz",
+ "integrity": "sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==",
+ "requires": {
+ "encoding-down": "~5.0.0",
+ "levelup": "^3.0.0"
+ }
+ },
+ "level-post": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz",
+ "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==",
+ "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==",
+ "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"
+ }
+ },
+ "level-ws": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz",
+ "integrity": "sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.8",
+ "xtend": "^4.0.1"
+ }
+ },
+ "levelup": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz",
+ "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==",
+ "requires": {
+ "deferred-leveldown": "~4.0.0",
+ "level-errors": "~2.0.0",
+ "level-iterator-stream": "~3.0.0",
+ "xtend": "~4.0.0"
+ },
+ "dependencies": {
+ "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==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "xtend": "^4.0.0"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+ },
+ "looper": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz",
+ "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew="
+ },
+ "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"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "optional": 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==",
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "ltgt": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz",
+ "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ="
+ },
+ "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"
+ }
+ },
+ "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=",
+ "optional": true
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "optional": true
+ },
+ "merkle-patricia-tree": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz",
+ "integrity": "sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==",
+ "requires": {
+ "async": "^2.6.1",
+ "ethereumjs-util": "^5.2.0",
+ "level-mem": "^3.0.1",
+ "level-ws": "^1.0.0",
+ "readable-stream": "^3.0.6",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ },
+ "dependencies": {
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "optional": true
+ },
+ "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.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "optional": true
+ },
+ "mime-db": {
+ "version": "1.45.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+ "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
+ },
+ "mime-types": {
+ "version": "2.1.28",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+ "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
+ "requires": {
+ "mime-db": "1.45.0"
+ }
+ },
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "optional": 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"
+ }
+ },
+ "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": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "minizlib": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+ "optional": true,
+ "requires": {
+ "minipass": "^2.9.0"
+ },
+ "dependencies": {
+ "minipass": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ }
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "mkdirp-promise": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz",
+ "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=",
+ "optional": true,
+ "requires": {
+ "mkdirp": "*"
+ }
+ },
+ "mock-fs": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz",
+ "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==",
+ "optional": true
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "multibase": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz",
+ "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==",
+ "optional": true,
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ },
+ "multicodec": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz",
+ "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==",
+ "optional": true,
+ "requires": {
+ "varint": "^5.0.0"
+ }
+ },
+ "multihashes": {
+ "version": "0.4.21",
+ "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz",
+ "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==",
+ "optional": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "multibase": "^0.7.0",
+ "varint": "^5.0.0"
+ },
+ "dependencies": {
+ "multibase": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz",
+ "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==",
+ "optional": true,
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ }
+ }
+ },
+ "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=",
+ "optional": 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"
+ }
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "optional": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+ },
+ "node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node-fetch": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
+ "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
+ },
+ "node-gyp-build": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
+ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+ },
+ "normalize-url": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
+ "optional": true
+ },
+ "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=",
+ "optional": 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=",
+ "optional": true
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "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-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"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "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.9.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
+ "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
+ },
+ "object-is": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz",
+ "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "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.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz",
+ "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "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.4",
+ "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz",
+ "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=",
+ "optional": 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=",
+ "optional": 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"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "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": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+ "optional": true
+ },
+ "p-timeout": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
+ "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
+ "optional": true,
+ "requires": {
+ "p-finally": "^1.0.0"
+ },
+ "dependencies": {
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "optional": true
+ }
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "optional": true,
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-headers": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
+ "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "optional": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "patch-package": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz",
+ "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==",
+ "requires": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^2.4.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^1.2.1",
+ "fs-extra": "^7.0.1",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.0",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "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="
+ },
+ "slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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-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=",
+ "optional": true
+ },
+ "pbkdf2": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+ "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+ "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"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "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="
+ },
+ "prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+ "optional": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "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"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "optional": true,
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "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.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "optional": 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",
+ "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="
+ },
+ "pull-defer": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz",
+ "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA=="
+ },
+ "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==",
+ "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=",
+ "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="
+ },
+ "pull-stream": {
+ "version": "3.6.14",
+ "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz",
+ "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew=="
+ },
+ "pull-window": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz",
+ "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=",
+ "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==",
+ "optional": true,
+ "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==",
+ "optional": true,
+ "requires": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
+ },
+ "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==",
+ "optional": 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==",
+ "optional": 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==",
+ "optional": true,
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ },
+ "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=="
+ }
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "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-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"
+ }
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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="
+ }
+ }
+ },
+ "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=",
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "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.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.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+ "optional": true,
+ "requires": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "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.2.6",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz",
+ "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==",
+ "requires": {
+ "bn.js": "^4.11.1"
+ }
+ },
+ "rustbn.js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz",
+ "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA=="
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "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"
+ }
+ },
+ "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=="
+ },
+ "scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+ },
+ "scryptsy": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz",
+ "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=",
+ "optional": true,
+ "requires": {
+ "pbkdf2": "^3.0.3"
+ }
+ },
+ "secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
+ "requires": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "seedrandom": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz",
+ "integrity": "sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg=="
+ },
+ "semaphore": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz",
+ "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA=="
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "optional": 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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "optional": 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==",
+ "optional": 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==",
+ "optional": true,
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "servify": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz",
+ "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==",
+ "optional": true,
+ "requires": {
+ "body-parser": "^1.16.0",
+ "cors": "^2.8.1",
+ "express": "^4.14.0",
+ "request": "^2.79.0",
+ "xhr": "^2.3.3"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "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"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "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==",
+ "optional": 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"
+ }
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "optional": true
+ },
+ "simple-get": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
+ "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
+ "optional": true,
+ "requires": {
+ "decompress-response": "^3.3.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "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-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "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-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"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "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=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "requires": {
+ "atob": "^2.1.2",
+ "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.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==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "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=="
+ }
+ }
+ },
+ "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="
+ },
+ "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"
+ }
+ },
+ "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"
+ },
+ "dependencies": {
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "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-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"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "optional": true
+ },
+ "stream-to-pull-stream": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz",
+ "integrity": "sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==",
+ "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="
+ }
+ }
+ },
+ "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=",
+ "optional": true
+ },
+ "string.prototype.trim": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.3.tgz",
+ "integrity": "sha512-16IL9pIBA5asNOSukPfxX2W68BaBvxyiRK16H3RA/lWW9BDosh+w7f+LhomPHpXJ82QEe7w7/rY/S1CV97raLg==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
+ "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
+ "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "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"
+ },
+ "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=="
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "swarm-js": {
+ "version": "0.1.40",
+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz",
+ "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==",
+ "optional": true,
+ "requires": {
+ "bluebird": "^3.5.0",
+ "buffer": "^5.0.5",
+ "eth-lib": "^0.1.26",
+ "fs-extra": "^4.0.2",
+ "got": "^7.1.0",
+ "mime-types": "^2.1.16",
+ "mkdirp-promise": "^5.0.1",
+ "mock-fs": "^4.1.0",
+ "setimmediate": "^1.0.5",
+ "tar": "^4.0.2",
+ "xhr-request": "^1.0.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "optional": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "optional": true
+ },
+ "got": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+ "optional": 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"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "optional": true
+ },
+ "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==",
+ "optional": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "optional": true
+ },
+ "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=",
+ "optional": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ }
+ }
+ },
+ "tape": {
+ "version": "4.13.3",
+ "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz",
+ "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==",
+ "requires": {
+ "deep-equal": "~1.1.1",
+ "defined": "~1.0.0",
+ "dotignore": "~0.1.2",
+ "for-each": "~0.3.3",
+ "function-bind": "~1.1.1",
+ "glob": "~7.1.6",
+ "has": "~1.0.3",
+ "inherits": "~2.0.4",
+ "is-regex": "~1.0.5",
+ "minimist": "~1.2.5",
+ "object-inspect": "~1.7.0",
+ "resolve": "~1.17.0",
+ "resumer": "~0.0.0",
+ "string.prototype.trim": "~1.2.1",
+ "through": "~2.3.8"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "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"
+ }
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
+ },
+ "resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
+ "tar": {
+ "version": "4.4.13",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+ "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+ "optional": true,
+ "requires": {
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.8.6",
+ "minizlib": "^1.2.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.3"
+ },
+ "dependencies": {
+ "fs-minipass": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+ "optional": true,
+ "requires": {
+ "minipass": "^2.6.0"
+ }
+ },
+ "minipass": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ }
+ }
+ },
+ "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=",
+ "optional": true
+ },
+ "tmp": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
+ "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
+ "requires": {
+ "rimraf": "^2.6.3"
+ }
+ },
+ "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": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "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-readable-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+ "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+ "optional": true
+ },
+ "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"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "optional": true
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+ },
+ "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": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
+ },
+ "tweetnacl-util": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
+ "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw=="
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "optional": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "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==",
+ "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=",
+ "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="
+ },
+ "typewiselite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz",
+ "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4="
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "optional": 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==",
+ "optional": true
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
+ "unorm": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
+ "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "optional": 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="
+ }
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "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-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "optional": true,
+ "requires": {
+ "prepend-http": "^2.0.0"
+ }
+ },
+ "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=",
+ "optional": 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=",
+ "optional": 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=="
+ },
+ "utf-8-validate": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz",
+ "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+ "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==",
+ "optional": true
+ },
+ "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.1.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
+ "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "for-each": "^0.3.3",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.1"
+ }
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "optional": true
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "varint": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
+ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==",
+ "optional": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "optional": 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"
+ }
+ },
+ "web3": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz",
+ "integrity": "sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==",
+ "optional": true,
+ "requires": {
+ "web3-bzz": "1.2.11",
+ "web3-core": "1.2.11",
+ "web3-eth": "1.2.11",
+ "web3-eth-personal": "1.2.11",
+ "web3-net": "1.2.11",
+ "web3-shh": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-bzz": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz",
+ "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==",
+ "optional": true,
+ "requires": {
+ "@types/node": "^12.12.6",
+ "got": "9.6.0",
+ "swarm-js": "^0.1.40",
+ "underscore": "1.9.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz",
+ "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==",
+ "optional": true
+ }
+ }
+ },
+ "web3-core": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz",
+ "integrity": "sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==",
+ "optional": true,
+ "requires": {
+ "@types/bn.js": "^4.11.5",
+ "@types/node": "^12.12.6",
+ "bignumber.js": "^9.0.0",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-requestmanager": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz",
+ "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==",
+ "optional": true
+ }
+ }
+ },
+ "web3-core-helpers": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz",
+ "integrity": "sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==",
+ "optional": true,
+ "requires": {
+ "underscore": "1.9.1",
+ "web3-eth-iban": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-core-method": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz",
+ "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/transactions": "^5.0.0-beta.135",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-promievent": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-core-promievent": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz",
+ "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==",
+ "optional": true,
+ "requires": {
+ "eventemitter3": "4.0.4"
+ }
+ },
+ "web3-core-requestmanager": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz",
+ "integrity": "sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==",
+ "optional": true,
+ "requires": {
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11",
+ "web3-providers-http": "1.2.11",
+ "web3-providers-ipc": "1.2.11",
+ "web3-providers-ws": "1.2.11"
+ }
+ },
+ "web3-core-subscriptions": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz",
+ "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==",
+ "optional": true,
+ "requires": {
+ "eventemitter3": "4.0.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11"
+ }
+ },
+ "web3-eth": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz",
+ "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==",
+ "optional": true,
+ "requires": {
+ "underscore": "1.9.1",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-eth-abi": "1.2.11",
+ "web3-eth-accounts": "1.2.11",
+ "web3-eth-contract": "1.2.11",
+ "web3-eth-ens": "1.2.11",
+ "web3-eth-iban": "1.2.11",
+ "web3-eth-personal": "1.2.11",
+ "web3-net": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-eth-abi": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz",
+ "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==",
+ "optional": true,
+ "requires": {
+ "@ethersproject/abi": "5.0.0-beta.153",
+ "underscore": "1.9.1",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-eth-accounts": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz",
+ "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==",
+ "optional": true,
+ "requires": {
+ "crypto-browserify": "3.12.0",
+ "eth-lib": "0.2.8",
+ "ethereumjs-common": "^1.3.2",
+ "ethereumjs-tx": "^2.1.1",
+ "scrypt-js": "^3.0.1",
+ "underscore": "1.9.1",
+ "uuid": "3.3.2",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "optional": true
+ }
+ }
+ },
+ "web3-eth-contract": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz",
+ "integrity": "sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==",
+ "optional": true,
+ "requires": {
+ "@types/bn.js": "^4.11.5",
+ "underscore": "1.9.1",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-promievent": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-eth-abi": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-eth-ens": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz",
+ "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==",
+ "optional": true,
+ "requires": {
+ "content-hash": "^2.5.2",
+ "eth-ens-namehash": "2.0.8",
+ "underscore": "1.9.1",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-promievent": "1.2.11",
+ "web3-eth-abi": "1.2.11",
+ "web3-eth-contract": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-eth-iban": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz",
+ "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.11.9",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-eth-personal": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz",
+ "integrity": "sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==",
+ "optional": true,
+ "requires": {
+ "@types/node": "^12.12.6",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-net": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.19.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz",
+ "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==",
+ "optional": true
+ }
+ }
+ },
+ "web3-net": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz",
+ "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==",
+ "optional": true,
+ "requires": {
+ "web3-core": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-utils": "1.2.11"
+ }
+ },
+ "web3-provider-engine": {
+ "version": "14.2.1",
+ "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz",
+ "integrity": "sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==",
+ "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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "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",
+ "ethereumjs-util": "^5.1.1"
+ }
+ },
+ "ethereumjs-abi": {
+ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0",
+ "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.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ }
+ }
+ },
+ "ethereumjs-account": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz",
+ "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==",
+ "requires": {
+ "ethereumjs-util": "^5.0.0",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-block": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz",
+ "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereum-common": "0.2.0",
+ "ethereumjs-tx": "^1.2.2",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "ethereum-common": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz",
+ "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA=="
+ }
+ }
+ },
+ "ethereumjs-tx": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz",
+ "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==",
+ "requires": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "ethereumjs-vm": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz",
+ "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==",
+ "requires": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "ethereumjs-account": "^2.0.3",
+ "ethereumjs-block": "~2.2.0",
+ "ethereumjs-common": "^1.1.0",
+ "ethereumjs-util": "^6.0.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1"
+ },
+ "dependencies": {
+ "ethereumjs-block": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz",
+ "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==",
+ "requires": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ },
+ "dependencies": {
+ "ethereumjs-util": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz",
+ "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==",
+ "requires": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ }
+ }
+ },
+ "ethereumjs-tx": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
+ "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
+ "requires": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "requires": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ }
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "level-codec": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz",
+ "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ=="
+ },
+ "level-errors": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz",
+ "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==",
+ "requires": {
+ "errno": "~0.1.1"
+ }
+ },
+ "level-iterator-stream": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz",
+ "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ }
+ }
+ },
+ "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": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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="
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+ },
+ "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=="
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "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-providers-http": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz",
+ "integrity": "sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==",
+ "optional": true,
+ "requires": {
+ "web3-core-helpers": "1.2.11",
+ "xhr2-cookies": "1.1.0"
+ }
+ },
+ "web3-providers-ipc": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz",
+ "integrity": "sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==",
+ "optional": true,
+ "requires": {
+ "oboe": "2.1.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11"
+ }
+ },
+ "web3-providers-ws": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz",
+ "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==",
+ "optional": true,
+ "requires": {
+ "eventemitter3": "4.0.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11",
+ "websocket": "^1.0.31"
+ }
+ },
+ "web3-shh": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz",
+ "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==",
+ "optional": true,
+ "requires": {
+ "web3-core": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-net": "1.2.11"
+ }
+ },
+ "web3-utils": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz",
+ "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.11.9",
+ "eth-lib": "0.2.8",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "underscore": "1.9.1",
+ "utf8": "3.0.0"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "optional": true,
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ }
+ }
+ },
+ "websocket": {
+ "version": "1.0.32",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz",
+ "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==",
+ "requires": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.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==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "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=="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "optional": true,
+ "requires": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.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==",
+ "optional": true
+ }
+ }
+ },
+ "xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "requires": {
+ "global": "~4.4.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==",
+ "optional": 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.3",
+ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz",
+ "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==",
+ "optional": true,
+ "requires": {
+ "xhr-request": "^1.1.0"
+ }
+ },
+ "xhr2-cookies": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz",
+ "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=",
+ "optional": true,
+ "requires": {
+ "cookiejar": "^2.1.1"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "yaeti": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
+ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ }
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "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"
+ }
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": 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=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true
+ },
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
+ "optional": true
+ },
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "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": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "requires": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "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
+ },
+ "got": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+ "requires": {
+ "@sindresorhus/is": "^0.14.0",
+ "@szmarczak/http-timer": "^1.1.2",
+ "cacheable-request": "^6.0.0",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^4.1.0",
+ "lowercase-keys": "^1.0.1",
+ "mimic-response": "^1.0.1",
+ "p-cancelable": "^1.0.0",
+ "to-readable-stream": "^1.0.0",
+ "url-parse-lax": "^3.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
+ },
+ "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.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "hardhat-gas-reporter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.4.tgz",
+ "integrity": "sha512-G376zKh81G3K9WtDA+SoTLWsoygikH++tD1E7llx+X7J+GbIqfwhDKKgvJjcnEesMrtR9UqQHK02lJuXY1RTxw==",
+ "requires": {
+ "eth-gas-reporter": "^0.2.20",
+ "sha1": "^1.1.1"
+ }
+ },
+ "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-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
+ },
+ "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=="
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+ },
+ "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==",
+ "requires": {
+ "has-symbol-support-x": "^1.4.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "optional": true
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "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"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+ },
+ "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"
+ }
+ },
+ "html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "dev": true,
+ "requires": {
+ "whatwg-encoding": "^1.0.5"
+ }
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "requires": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ }
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+ },
+ "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==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
+ }
+ },
+ "http-https": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz",
+ "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs="
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "requires": {
+ "@types/node": "^10.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
+ }
+ }
+ },
+ "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-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "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==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "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.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "optional": true
+ },
+ "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"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-arguments": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "is-bigint": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+ "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA=="
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+ "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+ },
+ "is-callable": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
+ },
+ "is-ci": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz",
+ "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^3.1.1"
+ }
+ },
+ "is-core-module": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+ "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
+ "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+ },
+ "is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true
+ },
+ "is-generator-function": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz",
+ "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A=="
+ },
+ "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==",
+ "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="
+ },
+ "is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "is-number-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+ "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw=="
+ },
+ "is-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="
+ },
+ "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="
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+ "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-retry-allowed": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+ },
+ "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.6",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+ "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w=="
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz",
+ "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==",
+ "requires": {
+ "available-typed-arrays": "^1.0.2",
+ "call-bind": "^1.0.2",
+ "es-abstract": "^1.18.0-next.2",
+ "foreach": "^2.0.5",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "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": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+ "dev": true
+ },
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+ "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+ "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "isurl": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+ "requires": {
+ "has-to-string-tag-x": "^1.2.0",
+ "is-object": "^1.0.1"
+ }
+ },
+ "jest": {
+ "version": "27.0.3",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.3.tgz",
+ "integrity": "sha512-0G9+QqXFIZWgf5rs3yllpaA+13ZawVHfyuhuCV1EnoFbX++rVMRrYWCAnk+dfhwyv9/VTQvn+XG969u8aPRsBg==",
+ "dev": true,
+ "requires": {
+ "@jest/core": "^27.0.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.0.3"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "jest-cli": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz",
+ "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==",
+ "dev": true,
+ "requires": {
+ "@jest/core": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.4",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-validate": "^27.0.6",
+ "prompts": "^2.0.1",
+ "yargs": "^16.0.3"
+ }
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ }
+ }
+ },
+ "jest-changed-files": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz",
+ "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "jest-circus": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz",
+ "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.0.6",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.0.6",
+ "jest-matcher-utils": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-runtime": "^27.0.6",
+ "jest-snapshot": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "pretty-format": "^27.0.6",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-config": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz",
+ "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.1.0",
+ "@jest/test-sequencer": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "babel-jest": "^27.0.6",
+ "chalk": "^4.0.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.4",
+ "is-ci": "^3.0.0",
+ "jest-circus": "^27.0.6",
+ "jest-environment-jsdom": "^27.0.6",
+ "jest-environment-node": "^27.0.6",
+ "jest-get-type": "^27.0.6",
+ "jest-jasmine2": "^27.0.6",
+ "jest-regex-util": "^27.0.6",
+ "jest-resolve": "^27.0.6",
+ "jest-runner": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-validate": "^27.0.6",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-diff": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
+ "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-docblock": {
+ "version": "21.2.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz",
+ "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==",
+ "dev": true
+ },
+ "jest-each": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz",
+ "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "pretty-format": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-environment-jsdom": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz",
+ "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^27.0.6",
+ "@jest/fake-timers": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "jest-mock": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jsdom": "^16.6.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-environment-node": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz",
+ "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^27.0.6",
+ "@jest/fake-timers": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "jest-mock": "^27.0.6",
+ "jest-util": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-get-type": {
+ "version": "26.3.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+ "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+ "dev": true
+ },
+ "jest-haste-map": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz",
+ "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "fsevents": "^2.3.2",
+ "graceful-fs": "^4.2.4",
+ "jest-regex-util": "^27.0.6",
+ "jest-serializer": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-worker": "^27.0.6",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-jasmine2": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz",
+ "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==",
+ "dev": true,
+ "requires": {
+ "@babel/traverse": "^7.1.0",
+ "@jest/environment": "^27.0.6",
+ "@jest/source-map": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.0.6",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.0.6",
+ "jest-matcher-utils": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-runtime": "^27.0.6",
+ "jest-snapshot": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "pretty-format": "^27.0.6",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-leak-detector": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz",
+ "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==",
+ "dev": true,
+ "requires": {
+ "jest-get-type": "^27.0.6",
+ "pretty-format": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-matcher-utils": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
+ "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.0.6",
+ "jest-get-type": "^27.0.6",
+ "pretty-format": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "diff-sequences": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
+ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-diff": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
+ "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.0.6",
+ "jest-get-type": "^27.0.6",
+ "pretty-format": "^27.0.6"
+ }
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-message-util": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
+ "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.0.6",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.0.6",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-mock": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz",
+ "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "@types/node": "*"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-pnp-resolver": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+ "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+ "dev": true
+ },
+ "jest-regex-util": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz",
+ "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==",
+ "dev": true
+ },
+ "jest-resolve": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz",
+ "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "chalk": "^4.0.0",
+ "escalade": "^3.1.1",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.0.6",
+ "jest-validate": "^27.0.6",
+ "resolve": "^1.20.0",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-resolve-dependencies": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz",
+ "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "jest-regex-util": "^27.0.6",
+ "jest-snapshot": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-runner": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz",
+ "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^27.0.6",
+ "@jest/environment": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/transform": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.4",
+ "jest-docblock": "^27.0.6",
+ "jest-environment-jsdom": "^27.0.6",
+ "jest-environment-node": "^27.0.6",
+ "jest-haste-map": "^27.0.6",
+ "jest-leak-detector": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-resolve": "^27.0.6",
+ "jest-runtime": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-worker": "^27.0.6",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-docblock": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz",
+ "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==",
+ "dev": true,
+ "requires": {
+ "detect-newline": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-runtime": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz",
+ "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^27.0.6",
+ "@jest/environment": "^27.0.6",
+ "@jest/fake-timers": "^27.0.6",
+ "@jest/globals": "^27.0.6",
+ "@jest/source-map": "^27.0.6",
+ "@jest/test-result": "^27.0.6",
+ "@jest/transform": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.4",
+ "jest-haste-map": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-mock": "^27.0.6",
+ "jest-regex-util": "^27.0.6",
+ "jest-resolve": "^27.0.6",
+ "jest-snapshot": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "jest-validate": "^27.0.6",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0",
+ "yargs": "^16.0.3"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ }
+ }
+ },
+ "jest-serializer": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz",
+ "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.4"
+ }
+ },
+ "jest-snapshot": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz",
+ "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/parser": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.0.6",
+ "graceful-fs": "^4.2.4",
+ "jest-diff": "^27.0.6",
+ "jest-get-type": "^27.0.6",
+ "jest-haste-map": "^27.0.6",
+ "jest-matcher-utils": "^27.0.6",
+ "jest-message-util": "^27.0.6",
+ "jest-resolve": "^27.0.6",
+ "jest-util": "^27.0.6",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.0.6",
+ "semver": "^7.3.2"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "diff-sequences": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
+ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-diff": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
+ "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.0.6",
+ "jest-get-type": "^27.0.6",
+ "pretty-format": "^27.0.6"
+ }
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-util": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz",
+ "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "is-ci": "^3.0.0",
+ "picomatch": "^2.2.3"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-validate": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz",
+ "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.0.6",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.0.6"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-get-type": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+ "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^27.0.6",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-watcher": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz",
+ "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==",
+ "dev": true,
+ "requires": {
+ "@jest/test-result": "^27.0.6",
+ "@jest/types": "^27.0.6",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.0.6",
+ "string-length": "^4.0.1"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
+ "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-worker": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz",
+ "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.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="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "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="
+ },
+ "jsdom": {
+ "version": "16.6.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz",
+ "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.5",
+ "xml-name-validator": "^3.0.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
+ "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "tough-cookie": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+ "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.1.2"
+ }
+ }
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+ },
+ "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-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": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "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": "3.0.1",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz",
+ "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==",
+ "requires": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "keyv": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+ "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+ "requires": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true
+ },
+ "kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
+ },
+ "leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "log-symbols": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "requires": {
+ "chalk": "^2.4.2"
+ }
+ },
+ "logform": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz",
+ "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==",
+ "requires": {
+ "colors": "^1.2.1",
+ "fast-safe-stringify": "^2.0.4",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "triple-beam": "^1.3.0"
+ }
+ },
+ "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"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+ },
+ "makeerror": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+ "dev": true,
+ "requires": {
+ "tmpl": "1.0.x"
+ }
+ },
+ "markdown-table": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
+ "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q=="
+ },
+ "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="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "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.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.48.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
+ "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ=="
+ },
+ "mime-types": {
+ "version": "2.1.31",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
+ "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
+ "requires": {
+ "mime-db": "1.48.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
+ },
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+ },
+ "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"
+ }
+ },
+ "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": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "minipass": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+ "requires": {
+ "minipass": "^2.9.0"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "optional": true
+ },
+ "mkdirp-promise": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz",
+ "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=",
+ "requires": {
+ "mkdirp": "*"
+ }
+ },
+ "mocha": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
+ "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
+ "requires": {
+ "ansi-colors": "3.2.3",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.3.0",
+ "debug": "3.2.6",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "find-up": "3.0.0",
+ "glob": "7.1.3",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.13.1",
+ "log-symbols": "3.0.0",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.5",
+ "ms": "2.1.1",
+ "node-environment-flags": "1.0.6",
+ "object.assign": "4.1.0",
+ "strip-json-comments": "2.0.1",
+ "supports-color": "6.0.0",
+ "which": "1.3.1",
+ "wide-align": "1.1.3",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw=="
+ },
+ "chokidar": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
+ "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.1",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.2.0"
+ }
+ },
+ "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"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+ },
+ "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"
+ }
+ },
+ "fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "optional": true
+ },
+ "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"
+ }
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.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"
+ }
+ },
+ "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=="
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "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.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "readdirp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
+ "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
+ "requires": {
+ "picomatch": "^2.0.4"
+ }
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "mock-fs": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz",
+ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw=="
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "multibase": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz",
+ "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==",
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ },
+ "multicodec": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz",
+ "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==",
+ "requires": {
+ "varint": "^5.0.0"
+ }
+ },
+ "multihashes": {
+ "version": "0.4.21",
+ "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz",
+ "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==",
+ "requires": {
+ "buffer": "^5.5.0",
+ "multibase": "^0.7.0",
+ "varint": "^5.0.0"
+ },
+ "dependencies": {
+ "multibase": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz",
+ "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==",
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ }
+ }
+ },
+ "nan": {
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+ "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
+ },
+ "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="
+ },
+ "napi-build-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
+ "optional": 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
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "node-abi": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz",
+ "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==",
+ "optional": true,
+ "requires": {
+ "semver": "^5.4.1"
+ }
+ },
+ "node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node-environment-flags": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
+ "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
+ "requires": {
+ "object.getownpropertydescriptors": "^2.0.3",
+ "semver": "^5.7.0"
+ }
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "node-gyp-build": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
+ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+ },
+ "node-hid": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-1.3.0.tgz",
+ "integrity": "sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g==",
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.14.0",
+ "node-abi": "^2.18.0",
+ "prebuild-install": "^5.3.4"
+ },
+ "dependencies": {
+ "decompress-response": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+ "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+ "optional": true,
+ "requires": {
+ "mimic-response": "^2.0.0"
+ }
+ },
+ "mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "optional": true
+ },
+ "prebuild-install": {
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz",
+ "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==",
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.3",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^2.7.0",
+ "noop-logger": "^0.1.1",
+ "npmlog": "^4.0.1",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^3.0.3",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0",
+ "which-pm-runs": "^1.0.0"
+ }
+ },
+ "simple-get": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
+ "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
+ "optional": true,
+ "requires": {
+ "decompress-response": "^4.2.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ }
+ }
+ },
+ "node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+ "dev": true
+ },
+ "node-modules-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "1.1.73",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
+ "dev": true
+ },
+ "noop-logger": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
+ "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
+ "optional": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "normalize-url": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+ "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "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",
+ "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="
+ }
+ }
+ },
+ "nwsapi": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+ "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=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-inspect": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
+ "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw=="
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
+ "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2"
+ }
+ },
+ "oboe": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz",
+ "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=",
+ "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=",
+ "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"
+ }
+ },
+ "one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "requires": {
+ "fn.name": "1.x.x"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "p-cancelable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+ },
+ "p-each-series": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
+ "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-timeout": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
+ "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
+ "requires": {
+ "p-finally": "^1.0.0"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104="
+ },
+ "parse-headers": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
+ "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
+ },
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ },
+ "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-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "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="
+ },
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "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"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
+ },
+ "pino": {
+ "version": "6.11.3",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-6.11.3.tgz",
+ "integrity": "sha512-drPtqkkSf0ufx2gaea3TryFiBHdNIdXKf5LN0hTM82SXI4xVIve2wLwNg92e1MT6m3jASLu6VO7eGY6+mmGeyw==",
+ "requires": {
+ "fast-redact": "^3.0.0",
+ "fast-safe-stringify": "^2.0.7",
+ "flatstr": "^1.0.12",
+ "pino-std-serializers": "^3.1.0",
+ "quick-format-unescaped": "^4.0.3",
+ "sonic-boom": "^1.0.2"
+ }
+ },
+ "pino-std-serializers": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz",
+ "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg=="
+ },
+ "pirates": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+ "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+ "dev": true,
+ "requires": {
+ "node-modules-regexp": "^1.0.0"
+ }
+ },
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "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
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ }
+ }
+ },
+ "prebuild-install": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz",
+ "integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==",
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.3",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^2.21.0",
+ "npmlog": "^4.0.1",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^3.0.3",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "dependencies": {
+ "decompress-response": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+ "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+ "optional": true,
+ "requires": {
+ "mimic-response": "^2.0.0"
+ }
+ },
+ "mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "optional": true
+ },
+ "simple-get": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
+ "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
+ "optional": true,
+ "requires": {
+ "decompress-response": "^4.2.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+ },
+ "pretty-format": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
+ "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "promise": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
+ "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ },
+ "prompts": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz",
+ "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==",
+ "dev": true,
+ "requires": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "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.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ },
+ "query-string": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+ "requires": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
+ },
+ "quick-format-unescaped": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz",
+ "integrity": "sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg=="
+ },
+ "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"
+ }
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "optional": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "req-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
+ "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=",
+ "requires": {
+ "req-from": "^2.0.0"
+ }
+ },
+ "req-from": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
+ "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=",
+ "requires": {
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "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.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.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ }
+ }
+ },
+ "request-promise-core": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+ "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+ "requires": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "request-promise-native": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+ "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+ "requires": {
+ "request-promise-core": "1.1.4",
+ "stealthy-require": "^1.1.1",
+ "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-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=="
+ },
+ "resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "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
+ }
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+ },
+ "responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+ "requires": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "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.2.6",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz",
+ "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==",
+ "requires": {
+ "bn.js": "^4.11.1"
+ }
+ },
+ "rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
+ "requires": {
+ "xmlchars": "^2.2.0"
+ }
+ },
+ "scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+ },
+ "secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
+ "requires": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "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": {
+ "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=="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "servify": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz",
+ "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==",
+ "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="
+ },
+ "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=="
+ },
+ "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"
+ }
+ },
+ "sha1": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
+ "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=",
+ "requires": {
+ "charenc": ">= 0.0.1",
+ "crypt": ">= 0.0.1"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+ },
+ "simple-get": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
+ "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
+ "requires": {
+ "decompress-response": "^3.3.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+ "requires": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "sonic-boom": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz",
+ "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==",
+ "requires": {
+ "atomic-sleep": "^1.0.0",
+ "flatstr": "^1.0.12"
+ }
+ },
+ "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-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.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"
+ }
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+ },
+ "stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "dependencies": {
+ "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
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "stealthy-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
+ },
+ "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="
+ },
+ "string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "requires": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "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.trimend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.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": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "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-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": "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"
+ }
+ },
+ "swarm-js": {
+ "version": "0.1.40",
+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz",
+ "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==",
+ "requires": {
+ "bluebird": "^3.5.0",
+ "buffer": "^5.0.5",
+ "eth-lib": "^0.1.26",
+ "fs-extra": "^4.0.2",
+ "got": "^7.1.0",
+ "mime-types": "^2.1.16",
+ "mkdirp-promise": "^5.0.1",
+ "mock-fs": "^4.1.0",
+ "setimmediate": "^1.0.5",
+ "tar": "^4.0.2",
+ "xhr-request": "^1.0.1"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "got": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+ "requires": {
+ "decompress-response": "^3.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"
+ }
+ },
+ "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=="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ }
+ }
+ },
+ "symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
+ },
+ "sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "requires": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ }
+ },
+ "sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "requires": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "tar": {
+ "version": "4.4.13",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+ "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+ "requires": {
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.8.6",
+ "minizlib": "^1.2.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.3"
+ }
+ },
+ "tar-fs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "optional": true,
+ "requires": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "optional": true,
+ "requires": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ }
+ },
+ "terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-hyperlinks": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
+ "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ }
+ }
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
+ },
+ "then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "requires": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
+ }
+ }
+ },
+ "throat": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
+ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+ "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="
+ },
+ "tmpl": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+ "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
+ },
+ "to-readable-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+ "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "triple-beam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+ },
+ "ts-jest": {
+ "version": "27.0.3",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.3.tgz",
+ "integrity": "sha512-U5rdMjnYam9Ucw+h0QvtNDbc5+88nxt7tbIvqaZUhFrfG4+SkWhMXjejCLVGcpILTPuV+H3W/GZDZrnZFpPeXw==",
+ "dev": true,
+ "requires": {
+ "bs-logger": "0.x",
+ "buffer-from": "1.x",
+ "fast-json-stable-stringify": "2.x",
+ "jest-util": "^27.0.0",
+ "json5": "2.x",
+ "lodash": "4.x",
+ "make-error": "1.x",
+ "mkdirp": "1.x",
+ "semver": "7.x",
+ "yargs-parser": "20.x"
+ },
+ "dependencies": {
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "ts-node": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz",
+ "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==",
+ "requires": {
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "source-map-support": "^0.5.17",
+ "yn": "3.1.1"
+ }
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "tslint": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
+ "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^4.0.1",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.3",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.13.0",
+ "tsutils": "^2.29.0"
+ }
+ },
+ "tslint-config-prettier": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz",
+ "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==",
+ "dev": true
+ },
+ "tslint-config-standard": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-9.0.0.tgz",
+ "integrity": "sha512-CAw9J743RnPMemQV/XQ4YyNreC+A1NItACfkm+cBedrOkz6CQfwlnbKn8anUXBfoa4Zo4tjAhblRbsMNcSLfSw==",
+ "dev": true,
+ "requires": {
+ "tslint-eslint-rules": "^5.3.1"
+ }
+ },
+ "tslint-eslint-rules": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz",
+ "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==",
+ "dev": true,
+ "requires": {
+ "doctrine": "0.7.2",
+ "tslib": "1.9.0",
+ "tsutils": "^3.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
+ "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==",
+ "dev": true
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ }
+ }
+ },
+ "tslint-plugin-prettier": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.3.0.tgz",
+ "integrity": "sha512-F9e4K03yc9xuvv+A0v1EmjcnDwpz8SpCD8HzqSDe0eyg34cBinwn9JjmnnRrNAs4HdleRQj7qijp+P/JTxt4vA==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-prettier": "^2.2.0",
+ "lines-and-columns": "^1.1.6",
+ "tslib": "^1.7.1"
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "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": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-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
+ },
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "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==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "typescript": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz",
+ "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew=="
+ },
+ "u2f-api": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz",
+ "integrity": "sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg=="
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
+ },
+ "unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "underscore": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "requires": {
+ "prepend-http": "^2.0.0"
+ }
+ },
+ "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="
+ },
+ "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="
+ },
+ "usb": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/usb/-/usb-1.7.1.tgz",
+ "integrity": "sha512-HTCfx6NnNRhv5y98t04Y8j2+A8dmQnEGxCMY2/zN/0gkiioLYfTZ5w/PEKlWRVUY+3qLe9xwRv9pHLkjQYNw/g==",
+ "optional": true,
+ "requires": {
+ "bindings": "^1.4.0",
+ "node-addon-api": "3.0.2",
+ "prebuild-install": "^5.3.3"
+ },
+ "dependencies": {
+ "decompress-response": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+ "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+ "optional": true,
+ "requires": {
+ "mimic-response": "^2.0.0"
+ }
+ },
+ "mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "optional": true
+ },
+ "node-addon-api": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz",
+ "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==",
+ "optional": true
+ },
+ "prebuild-install": {
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz",
+ "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==",
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.3",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^2.7.0",
+ "noop-logger": "^0.1.1",
+ "npmlog": "^4.0.1",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^3.0.3",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0",
+ "which-pm-runs": "^1.0.0"
+ }
+ },
+ "simple-get": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
+ "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
+ "optional": true,
+ "requires": {
+ "decompress-response": "^4.2.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ }
+ }
+ },
+ "utf-8-validate": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz",
+ "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+ "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
+ },
+ "util": {
+ "version": "0.12.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
+ "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "safe-buffer": "^5.1.2",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "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="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "v8-to-istanbul": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz",
+ "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
+ "varint": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
+ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "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"
+ }
+ },
+ "w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
+ "requires": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "dev": true,
+ "requires": {
+ "xml-name-validator": "^3.0.0"
+ }
+ },
+ "walker": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+ "dev": true,
+ "requires": {
+ "makeerror": "1.0.x"
+ }
+ },
+ "web3": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.6.tgz",
+ "integrity": "sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==",
+ "requires": {
+ "web3-bzz": "1.3.6",
+ "web3-core": "1.3.6",
+ "web3-eth": "1.3.6",
+ "web3-eth-personal": "1.3.6",
+ "web3-net": "1.3.6",
+ "web3-shh": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-bzz": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.6.tgz",
+ "integrity": "sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==",
+ "requires": {
+ "@types/node": "^12.12.6",
+ "got": "9.6.0",
+ "swarm-js": "^0.1.40",
+ "underscore": "1.12.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.20.14",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.14.tgz",
+ "integrity": "sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg=="
+ }
+ }
+ },
+ "web3-core": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.6.tgz",
+ "integrity": "sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==",
+ "requires": {
+ "@types/bn.js": "^4.11.5",
+ "@types/node": "^12.12.6",
+ "bignumber.js": "^9.0.0",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-core-requestmanager": "1.3.6",
+ "web3-utils": "1.3.6"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.20.14",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.14.tgz",
+ "integrity": "sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg=="
+ }
+ }
+ },
+ "web3-core-helpers": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz",
+ "integrity": "sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==",
+ "requires": {
+ "underscore": "1.12.1",
+ "web3-eth-iban": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-core-method": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.6.tgz",
+ "integrity": "sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==",
+ "requires": {
+ "@ethersproject/transactions": "^5.0.0-beta.135",
+ "underscore": "1.12.1",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-promievent": "1.3.6",
+ "web3-core-subscriptions": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-core-promievent": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz",
+ "integrity": "sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==",
+ "requires": {
+ "eventemitter3": "4.0.4"
+ }
+ },
+ "web3-core-requestmanager": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz",
+ "integrity": "sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==",
+ "requires": {
+ "underscore": "1.12.1",
+ "util": "^0.12.0",
+ "web3-core-helpers": "1.3.6",
+ "web3-providers-http": "1.3.6",
+ "web3-providers-ipc": "1.3.6",
+ "web3-providers-ws": "1.3.6"
+ }
+ },
+ "web3-core-subscriptions": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz",
+ "integrity": "sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==",
+ "requires": {
+ "eventemitter3": "4.0.4",
+ "underscore": "1.12.1",
+ "web3-core-helpers": "1.3.6"
+ }
+ },
+ "web3-eth": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.6.tgz",
+ "integrity": "sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==",
+ "requires": {
+ "underscore": "1.12.1",
+ "web3-core": "1.3.6",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-core-subscriptions": "1.3.6",
+ "web3-eth-abi": "1.3.6",
+ "web3-eth-accounts": "1.3.6",
+ "web3-eth-contract": "1.3.6",
+ "web3-eth-ens": "1.3.6",
+ "web3-eth-iban": "1.3.6",
+ "web3-eth-personal": "1.3.6",
+ "web3-net": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-eth-abi": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz",
+ "integrity": "sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==",
+ "requires": {
+ "@ethersproject/abi": "5.0.7",
+ "underscore": "1.12.1",
+ "web3-utils": "1.3.6"
+ },
+ "dependencies": {
+ "@ethersproject/abi": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz",
+ "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==",
+ "requires": {
+ "@ethersproject/address": "^5.0.4",
+ "@ethersproject/bignumber": "^5.0.7",
+ "@ethersproject/bytes": "^5.0.4",
+ "@ethersproject/constants": "^5.0.4",
+ "@ethersproject/hash": "^5.0.4",
+ "@ethersproject/keccak256": "^5.0.3",
+ "@ethersproject/logger": "^5.0.5",
+ "@ethersproject/properties": "^5.0.3",
+ "@ethersproject/strings": "^5.0.4"
+ }
+ }
+ }
+ },
+ "web3-eth-accounts": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz",
+ "integrity": "sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==",
+ "requires": {
+ "crypto-browserify": "3.12.0",
+ "eth-lib": "0.2.8",
+ "ethereumjs-common": "^1.3.2",
+ "ethereumjs-tx": "^2.1.1",
+ "scrypt-js": "^3.0.1",
+ "underscore": "1.12.1",
+ "uuid": "3.3.2",
+ "web3-core": "1.3.6",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-utils": "1.3.6"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ }
+ }
+ },
+ "web3-eth-contract": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz",
+ "integrity": "sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==",
+ "requires": {
+ "@types/bn.js": "^4.11.5",
+ "underscore": "1.12.1",
+ "web3-core": "1.3.6",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-core-promievent": "1.3.6",
+ "web3-core-subscriptions": "1.3.6",
+ "web3-eth-abi": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-eth-ens": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz",
+ "integrity": "sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==",
+ "requires": {
+ "content-hash": "^2.5.2",
+ "eth-ens-namehash": "2.0.8",
+ "underscore": "1.12.1",
+ "web3-core": "1.3.6",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-promievent": "1.3.6",
+ "web3-eth-abi": "1.3.6",
+ "web3-eth-contract": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-eth-iban": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz",
+ "integrity": "sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-eth-personal": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz",
+ "integrity": "sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==",
+ "requires": {
+ "@types/node": "^12.12.6",
+ "web3-core": "1.3.6",
+ "web3-core-helpers": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-net": "1.3.6",
+ "web3-utils": "1.3.6"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "12.20.14",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.14.tgz",
+ "integrity": "sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg=="
+ }
+ }
+ },
+ "web3-net": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.6.tgz",
+ "integrity": "sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==",
+ "requires": {
+ "web3-core": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-utils": "1.3.6"
+ }
+ },
+ "web3-providers-http": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.6.tgz",
+ "integrity": "sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==",
+ "requires": {
+ "web3-core-helpers": "1.3.6",
+ "xhr2-cookies": "1.1.0"
+ }
+ },
+ "web3-providers-ipc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz",
+ "integrity": "sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==",
+ "requires": {
+ "oboe": "2.1.5",
+ "underscore": "1.12.1",
+ "web3-core-helpers": "1.3.6"
+ }
+ },
+ "web3-providers-ws": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz",
+ "integrity": "sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==",
+ "requires": {
+ "eventemitter3": "4.0.4",
+ "underscore": "1.12.1",
+ "web3-core-helpers": "1.3.6",
+ "websocket": "^1.0.32"
+ }
+ },
+ "web3-shh": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.6.tgz",
+ "integrity": "sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==",
+ "requires": {
+ "web3-core": "1.3.6",
+ "web3-core-method": "1.3.6",
+ "web3-core-subscriptions": "1.3.6",
+ "web3-net": "1.3.6"
+ }
+ },
+ "web3-utils": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz",
+ "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "eth-lib": "0.2.8",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "underscore": "1.12.1",
+ "utf8": "3.0.0"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true
+ },
+ "websocket": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
+ "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
+ "requires": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ }
+ },
+ "whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ }
+ },
+ "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-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "which-pm-runs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+ "optional": true
+ },
+ "which-typed-array": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz",
+ "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==",
+ "requires": {
+ "available-typed-arrays": "^1.0.2",
+ "call-bind": "^1.0.0",
+ "es-abstract": "^1.18.0-next.1",
+ "foreach": "^2.0.5",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.1",
+ "is-typed-array": "^1.1.3"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "winston": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz",
+ "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==",
+ "requires": {
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.1.0",
+ "is-stream": "^2.0.0",
+ "logform": "^2.2.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.4.0"
+ },
+ "dependencies": {
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+ }
+ }
+ },
+ "winston-transport": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
+ "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
+ "requires": {
+ "readable-stream": "^2.3.7",
+ "triple-beam": "^1.2.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "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==",
+ "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=="
+ },
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "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==",
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
+ },
+ "xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "requires": {
+ "global": "~4.4.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==",
+ "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.3",
+ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz",
+ "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==",
+ "requires": {
+ "xhr-request": "^1.1.0"
+ }
+ },
+ "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": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true
+ },
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+ },
+ "yaeti": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
+ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "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.2"
+ },
+ "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=="
+ },
+ "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"
+ }
+ },
+ "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="
+ },
+ "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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "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.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "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==",
+ "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==",
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ },
+ "yargs-unparser": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+ "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+ "requires": {
+ "flat": "^4.1.0",
+ "lodash": "^4.17.15",
+ "yargs": "^13.3.0"
+ }
+ },
+ "yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
+ }
+ }
+}
diff --git a/ops_omgx/monitoring/package.json b/ops_omgx/monitoring/package.json
new file mode 100644
index 000000000000..7f68155908d0
--- /dev/null
+++ b/ops_omgx/monitoring/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "omgx-liquidity-pool-utils",
+ "version": "1.0.0",
+ "main": "src/app.ts",
+ "scripts": {
+ "test": "jest --coverage",
+ "start": "ts-node src/app.ts",
+ "fast-onramp": "ts-node src/3_fast-onramp.ts",
+ "fast-exit": "ts-node src/4_fast-exit.ts",
+ "dummy-transaction": "ts-node src/dummy-transaction.ts"
+ },
+ "dependencies": {
+ "@ethersproject/abstract-provider": "5.4.0",
+ "@eth-optimism/contracts": "0.4.1",
+ "@eth-optimism/core-utils": "0.4.7",
+ "@ethersproject/providers": "5.4.0",
+ "abi-decoder": "2.4.0",
+ "dotenv": "10.0.0",
+ "ethers": "5.4.0",
+ "lodash": "4.17.21",
+ "ts-node": "10.0.0",
+ "typescript": "4.3.4",
+ "web3": "1.3.6",
+ "winston": "3.3.3"
+ },
+ "devDependencies": {
+ "@types/jest": "26.0.23",
+ "@types/node": "15.12.5",
+ "ts-jest": "27.0.3",
+ "jest": "27.0.3",
+ "tslint": "6.1.3",
+ "tslint-config-prettier": "1.18.0",
+ "tslint-config-standard": "9.0.0",
+ "tslint-plugin-prettier": "2.3.0"
+ }
+}
diff --git a/ops_omgx/monitoring/src/1_deploy-message.ts b/ops_omgx/monitoring/src/1_deploy-message.ts
new file mode 100644
index 000000000000..204ec187baf2
--- /dev/null
+++ b/ops_omgx/monitoring/src/1_deploy-message.ts
@@ -0,0 +1,101 @@
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+import { Contract, ContractFactory, utils } from 'ethers'
+import chalk from 'chalk';
+
+import L1MessageJson from './artifacts/contracts/Message/L1Message.sol/L1Message.json'
+import L2MessageJson from './artifacts-ovm/contracts/Message/L2Message.sol/L2Message.json'
+
+
+import { OptimismEnv } from './libs/env'
+
+import { promises as fs } from 'fs'
+
+async function deploy() {
+ let Factory__L1Message: ContractFactory
+ let Factory__L2Message: ContractFactory
+
+ let L1Message: Contract
+ let L2Message: Contract
+
+ let env: OptimismEnv
+
+ /************* PREFPARE ***********/
+
+ env = await OptimismEnv.new()
+
+ Factory__L1Message = new ContractFactory(
+ L1MessageJson.abi,
+ L1MessageJson.bytecode,
+ env.bobl1Wallet
+ )
+
+ Factory__L2Message = new ContractFactory(
+ L2MessageJson.abi,
+ L2MessageJson.bytecode,
+ env.bobl2Wallet
+ )
+
+
+ /*** DEPLOY CONTRACT *****/
+
+ L1Message = await Factory__L1Message.deploy(
+ env.watcher.l1.messengerAddress,
+ env.fastWatcher.l1.messengerAddress
+ )
+ await L1Message.deployTransaction.wait()
+ console.log(`🌕 ${chalk.red('L1 Message deployed to:')} ${chalk.green(L1Message.address)}`)
+
+ L2Message = await Factory__L2Message.deploy(
+ env.watcher.l2.messengerAddress,
+ { gasLimit: 3000000, gasPrice: 0 }
+ )
+ console.log(`${chalk.red('L2 message')} ${L2Message.address}`)
+
+ let result = await L2Message.deployTransaction.wait()
+ console.log(`${chalk.red('L2 message deployed result')} ${result}`)
+ console.log(`🌕 ${chalk.red('L2 Message deployed to:')} ${chalk.green(L2Message.address)}`)
+
+ // Initialize L1 message
+ const L1MessageTX = await L1Message.init(
+ L2Message.address
+ )
+ await L1MessageTX.wait()
+ console.log(`âï¸ ${chalk.blue('L1 Message initialized:')} ${chalk.green(L1MessageTX.hash)}`)
+
+ // Initialize L2 message
+ const L2MessageTX = await L2Message.init(
+ L1Message.address,
+ { gasLimit: 3000000, gasPrice: 0 }
+ )
+ await L2MessageTX.wait()
+ console.log(`âï¸ ${chalk.blue('L2 Message initialized:')} ${chalk.green(L2MessageTX.hash)}`)
+
+
+
+ /********* WRITE TO FILE **************/
+ //keep track of where things are for future use by the front end
+ console.log(`${chalk.yellow('\n\n********************************')}`)
+
+ const addresses = {
+ L1Message: L1Message.address,
+ L2Message: L2Message.address
+ }
+
+ console.log(chalk.green(JSON.stringify(addresses, null, 2)))
+
+ try {
+ await fs.writeFile('./deployment/rinkeby/addresses.json', JSON.stringify(addresses, null, 2))
+ console.log(`\n🚨 ${chalk.red('Successfully wrote addresses to file\n')}`)
+ } catch (err) {
+ console.log(`\n📬 ${chalk.red(`Error writing addresses to file: ${err}\n`)}`)
+ }
+
+ console.log(`${chalk.yellow('********************************')}`)
+}
+
+
+deploy().catch((err) => {
+ console.log(err.message)
+})
diff --git a/ops_omgx/monitoring/src/2_send-message.ts b/ops_omgx/monitoring/src/2_send-message.ts
new file mode 100644
index 000000000000..0572e075b2b4
--- /dev/null
+++ b/ops_omgx/monitoring/src/2_send-message.ts
@@ -0,0 +1,77 @@
+import { BigNumber, providers, Wallet } from 'ethers'
+import { Contract, ContractFactory, utils } from 'ethers'
+
+import { Direction } from './libs/watcher-utils'
+import { OptimismEnv } from './libs/env'
+
+import L1MessageJson from './artifacts/contracts/Message/L1Message.sol/L1Message.json'
+import L2MessageJson from './artifacts-ovm/contracts/Message/L2Message.sol/L2Message.json'
+
+import logger from './logger'
+
+
+const L1MessageAddress = process.env.L1_MESSAGE
+const L2MessageAddress = process.env.L2_MESSAGE
+const walletPKey = process.env.WALLET_PRIVATE_KEY
+const walletAddess = process.env.WALLET_ADDRESS
+const l1Web3Url = process.env.L1_NODE_WEB3_URL
+const l1GasUsed = process.env.L1_GAS_USED
+
+const l1Provider = new providers.JsonRpcProvider(l1Web3Url)
+const l1Wallet = new Wallet(walletPKey).connect(l1Provider)
+
+let L1Message: Contract
+let L2Message: Contract
+
+
+
+
+const transferL1toL2 = async () => {
+ logger.debug(`Init OptimismEnv`)
+ const env = await OptimismEnv.new()
+
+ L1Message = new Contract(
+ L1MessageAddress,
+ L1MessageJson.abi,
+ env.bobl1Wallet
+ )
+
+ logger.debug(`SendMessage L1 to L2`)
+ const trans = await env.waitForXDomainTransaction(
+ L1Message.sendMessageL1ToL2(),
+ Direction.L1ToL2
+ )
+
+ logger.debug(
+ `Transaction is sent successfully with hash:${trans.tx.hash}`,
+ { trans }
+ )
+}
+
+
+const transferL2toL1 = async () => {
+ logger.debug(`Init OptimismEnv`)
+ const env = await OptimismEnv.new()
+
+ L2Message = new Contract(
+ L2MessageAddress,
+ L2MessageJson.abi,
+ env.bobl2Wallet
+ )
+
+
+ logger.debug(`SendMessage L2 to L1`)
+ const trans = await env.waitForXFastDomainTransaction(
+ L2Message.sendMessageL2ToL1({ gasLimit: 3000000, gasPrice: 0 }),
+ Direction.L2ToL1
+ )
+
+ logger.debug(
+ `Transaction is sent successfully with hash:${trans.tx.hash}`,
+ { trans }
+ )
+}
+
+transferL2toL1().catch((err) => {
+ logger.error(err.message)
+})
diff --git a/ops_omgx/monitoring/src/3_fast-onramp.ts b/ops_omgx/monitoring/src/3_fast-onramp.ts
new file mode 100644
index 000000000000..a21b17b29d7d
--- /dev/null
+++ b/ops_omgx/monitoring/src/3_fast-onramp.ts
@@ -0,0 +1,75 @@
+import { Contract, providers, utils, Wallet } from 'ethers'
+import { getContractFactory } from '@eth-optimism/contracts'
+
+import {
+ initWatcher,
+ Direction,
+ waitForXDomainTransaction,
+} from './libs/watcher-utils'
+
+import logger from './logger'
+import L1LiquidityPoolJson from './artifacts/contracts/LP/L1LiquidityPool.sol/L1LiquidityPool.json'
+
+export const PROXY_SEQUENCER_ENTRYPOINT_ADDRESS = '0x4200000000000000000000000000000000000004'
+export const OVM_ETH_ADDRESS = '0x4200000000000000000000000000000000000006'
+// tslint:disable-next-line: variable-name
+export const Proxy__OVM_L2CrossDomainMessenger = '0x4200000000000000000000000000000000000007'
+export const addressManagerAddress = process.env.L1_ADDRESS_MANAGER
+
+const walletPKey = process.env.WALLET_PRIVATE_KEY
+const l1PoolAddress = process.env.L1_LIQUIDITY_POOL_ADDRESS
+const l1Web3Url = process.env.L1_NODE_WEB3_URL
+const l2Web3Url = process.env.L2_NODE_WEB3_URL
+const dummyEthAmount = process.env.DUMMY_ETH_AMOUNT
+const l1Provider = new providers.JsonRpcProvider(l1Web3Url)
+const l2Provider = new providers.JsonRpcProvider(l2Web3Url)
+const l1Wallet = new Wallet(walletPKey, l1Provider)
+const l2Wallet = l1Wallet.connect(l2Provider)
+
+const getAddressManager = (provider: any) => {
+ return getContractFactory('Lib_AddressManager')
+ .connect(provider)
+ .attach(addressManagerAddress) as any
+}
+
+export const fastOnRamp = async () => {
+ const l1Address = await l1Wallet.getAddress()
+ const l2Address = await l2Wallet.getAddress()
+ const addressManager = getAddressManager(l1Wallet)
+ const watcher = await initWatcher(l1Provider, l2Provider, addressManager)
+ const L1LiquidityPool = new Contract(
+ l1PoolAddress,
+ L1LiquidityPoolJson.abi,
+ l1Wallet
+ )
+
+ const depositAmount = utils.parseEther(dummyEthAmount)
+
+ const l1Balance = await l1Provider.getBalance(l1Address)
+ const l2Balance = await l2Provider.getBalance(l2Address)
+ logger.info('Start dummy transfer from L1->L2', {
+ l1Address,
+ l2Address,
+ l1Balance: utils.formatEther(l1Balance),
+ l2Balance: utils.formatEther(l2Balance),
+ })
+
+ await waitForXDomainTransaction(
+ watcher,
+ L1LiquidityPool.connect(l1Wallet).clientDepositL1(
+ 0,
+ '0x0000000000000000000000000000000000000000',
+ { value: depositAmount },
+ ),
+ Direction.L1ToL2
+ )
+
+ const l1BalanceAfter = await l1Provider.getBalance(l1Wallet.getAddress())
+ const l2BalanceAfter = await l2Provider.getBalance(l2Wallet.getAddress())
+ logger.info('Done dummy transfer from L1->L2', {
+ l1Address,
+ l2Address,
+ l1Balance: utils.formatEther(l1BalanceAfter),
+ l2Balance: utils.formatEther(l2BalanceAfter),
+ })
+}
diff --git a/ops_omgx/monitoring/src/4_fast-exit.ts b/ops_omgx/monitoring/src/4_fast-exit.ts
new file mode 100644
index 000000000000..5fac96d5b4cd
--- /dev/null
+++ b/ops_omgx/monitoring/src/4_fast-exit.ts
@@ -0,0 +1,109 @@
+import { Contract, providers, utils, Wallet } from 'ethers'
+import { getContractFactory, getContractInterface } from '@eth-optimism/contracts'
+import {
+ initFastWatcher,
+ Direction,
+ waitForXDomainTransaction,
+} from './libs/watcher-utils'
+
+import L2DepositedERC20Json from './artifacts-ovm/contracts/L2DepositedERC20.sol/L2DepositedERC20.json'
+import L2LiquidityPoolJson from './artifacts-ovm/contracts/LP/L2LiquidityPool.sol/L2LiquidityPool.json'
+
+import logger from './logger'
+
+export const PROXY_SEQUENCER_ENTRYPOINT_ADDRESS = '0x4200000000000000000000000000000000000004'
+export const OVM_ETH_ADDRESS = '0x4200000000000000000000000000000000000006'
+// tslint:disable-next-line: variable-name
+export const Proxy__OVM_L2CrossDomainMessenger = '0x4200000000000000000000000000000000000007'
+export const addressManagerAddress = process.env.L1_ADDRESS_MANAGER
+
+const walletPKey = process.env.WALLET_PRIVATE_KEY
+const l2PoolAddress = process.env.L2_LIQUIDITY_POOL_ADDRESS
+const l1Web3Url = process.env.L1_NODE_WEB3_URL
+const l2Web3Url = process.env.L2_NODE_WEB3_URL
+const l2DepositedERC20 = process.env.L2_DEPOSITED_ERC20
+const dummyEthAmount = process.env.DUMMY_ETH_AMOUNT
+const l1Provider = new providers.JsonRpcProvider(l1Web3Url)
+const l2Provider = new providers.JsonRpcProvider(l2Web3Url)
+const l1Wallet = new Wallet(walletPKey, l1Provider)
+const l2Wallet = l1Wallet.connect(l2Provider)
+
+const getAddressManager = (provider: any) => {
+ return getContractFactory('Lib_AddressManager')
+ .connect(provider)
+ .attach(addressManagerAddress) as any
+}
+
+const getL2ETHGateway = (wallet: Wallet) => {
+ const OVM_ETH = new Contract(
+ OVM_ETH_ADDRESS,
+ getContractInterface('OVM_ETH') as any,
+ wallet
+ )
+ return OVM_ETH
+}
+
+export const fastExit = async () => {
+ const l1Address = await l1Wallet.getAddress()
+ const l2Address = await l2Wallet.getAddress()
+ const addressManager = getAddressManager(l1Wallet)
+ const watcher = await initFastWatcher(l1Provider, l2Provider, addressManager)
+
+ const L2LiquidityPool = new Contract(
+ l2PoolAddress,
+ L2LiquidityPoolJson.abi,
+ l2Wallet
+ )
+
+ const L2DepositedERC20 = new Contract(
+ l2DepositedERC20,
+ L2DepositedERC20Json.abi,
+ l2Wallet
+ )
+
+ const L2ETHGateway = getL2ETHGateway(l2Wallet)
+ const fastExitAmount = utils.parseEther(dummyEthAmount)
+
+ const l1Balance = await l1Provider.getBalance(l1Address)
+ const l2Balance = await l2Provider.getBalance(l2Address)
+ const l2ERCBalance = await L2DepositedERC20.balanceOf(l2Wallet.address)
+ logger.info('Start dummy transfer from L2->L1', {
+ l1Address,
+ l2Address,
+ l1Balance: utils.formatEther(l1Balance),
+ l2Balance: utils.formatEther(l2Balance),
+ L2ERCBalance: utils.formatEther(l2ERCBalance)
+ })
+
+ logger.info('Approve TX')
+ const approveL2TX = await L2ETHGateway.connect(l2Wallet).approve(
+ L2LiquidityPool.address,
+ fastExitAmount,
+ { gasLimit: 800000, gasPrice: 0 }
+ )
+ await approveL2TX.wait()
+ logger.info('Approve TX... Done')
+
+ logger.info('Cross Domain Fast Exit')
+ await waitForXDomainTransaction(
+ watcher,
+ L2LiquidityPool.connect(l2Wallet).clientDepositL2(
+ fastExitAmount,
+ L2ETHGateway.address,
+ { gasLimit: 3000000, gasPrice: 0 }
+ ),
+ Direction.L2ToL1
+ )
+ logger.info('Cross Domain Fast Exit...Done')
+
+ const l1BalanceAfter = await l1Provider.getBalance(l1Address)
+ const l2BalanceAfter = await l2Provider.getBalance(l2Address)
+ const l2ERCBalanceAfter = await L2DepositedERC20.balanceOf(l2Wallet.address)
+ logger.info('Done dummy transfer from L2->L1', {
+ l1Address,
+ l2Address,
+ l1Balance: utils.formatEther(l1BalanceAfter),
+ l2Balance: utils.formatEther(l2BalanceAfter),
+ l2ERCBalance: utils.formatEther(l2ERCBalanceAfter),
+ })
+}
diff --git a/ops_omgx/monitoring/src/addresses.json b/ops_omgx/monitoring/src/addresses.json
new file mode 100644
index 000000000000..787ff719a174
--- /dev/null
+++ b/ops_omgx/monitoring/src/addresses.json
@@ -0,0 +1,15 @@
+{
+ "L1LiquidityPool": "0x473d2bbF979D0BFA39EBAB320c3216408386e68d",
+ "L2LiquidityPool": "0x1eCD5FBbb64F375A74670A1233CfA74D695fD861",
+ "L1ERC20": "0xB94E5aB5b3fAB8E8BFc44056a82D8b1FE45BE500",
+ "L2DepositedERC20": "0x400002009aA7ABCbdF8c712F91278d8EB9e9C805",
+ "L1ERC20Gateway": "0x676C8090FD5F25Fe0FaEf78A9342694d76027670",
+ "l1ETHGatewayAddress": "0xe3B6f4b17adE8809d292437951Af9521ad96B1cE",
+ "l1MessengerAddress": "0xaD05Bc932DA6f15a30976C533d309944c18C3b57",
+ "l1FastMessengerAddress": "0x0cE94668A5F62f91E14375E92B2746D8906d1de4",
+ "L2TokenPool": "0xD72BE35adea572e5FE19318B982e452F2002bd3B",
+ "AtomicSwap": "0xF22fda76FC54b3d52133AC37cFe4C551aF3D7270",
+ "L1Message": "0x3D1CBa2f53571c564e183750C9dDb169cEC0200c",
+ "L2Message": "0xC04f40CE8729CE79E8Df7824220E4BfB664f7bDA",
+ "L2ERC721": "0x225Fae3C23A501419bBCe912cB8672e08769D2a0"
+}
\ No newline at end of file
diff --git a/ops_omgx/monitoring/src/app.ts b/ops_omgx/monitoring/src/app.ts
new file mode 100644
index 000000000000..c9fc37d57e8d
--- /dev/null
+++ b/ops_omgx/monitoring/src/app.ts
@@ -0,0 +1,238 @@
+import _ from 'lodash'
+import abiDecoder from 'abi-decoder'
+import web3 from 'web3'
+import { TransactionReceipt, TransactionResponse, WebSocketProvider } from '@ethersproject/providers'
+import dotenv from 'dotenv'
+dotenv.config()
+import logger from './logger'
+
+const l1WsUrl = process.env.L1_NODE_WEB3_WS
+const l2WsUrl = process.env.L2_NODE_WEB3_WS
+const l1PoolAddress = process.env.L1_LIQUIDITY_POOL_ADDRESS
+const l2PoolAddress = process.env.L2_LIQUIDITY_POOL_ADDRESS
+const relayerAddress = process.env.RELAYER_ADDRESS
+const sequencerAddress = process.env.SEQUENCER_ADDRESS
+const reconnectTime = parseInt(process.env.RECONNECT_TIME, 10) || 10000
+let l1PoolBalance
+let l1RelayerBalance
+let l1SequencerBalance
+let l1BlockNumber
+let l1GasPrice
+let l2PoolBalance
+let l2BlockNumber
+let l2GasPrice
+
+// logger.info({ key: 'config', data: 'config.parsed' })
+// console.log(parseInt('0x51cff8d9', 16))
+// const LitContractABI = [{ 'anonymous': false, 'inputs': [{ 'indexed': false, 'internalType': 'uint256', 'name': 'recipientMinBalance', 'type': 'uint256' }, { 'indexed': false, 'internalType': 'uint256', 'name': 'recipientDesiredBalance', 'type': 'uint256' }], 'name': 'Configure', 'type': 'event' },{ 'anonymous': false, 'inputs': [{ 'indexed': true, 'internalType': 'address', 'name': 'caller', 'type': 'address' },{ 'indexed': false, 'internalType': 'uint256', 'name': 'amount', 'type': 'uint256' }], 'name': 'Deposit', 'type': 'event' },{ 'anonymous': false, 'inputs': [{ 'indexed': true, 'internalType': 'address', 'name': 'previousOwner', 'type': 'address' },{ 'indexed': true, 'internalType': 'address', 'name': 'newOwner', 'type': 'address' }], 'name': 'OwnershipTransferred', 'type': 'event' },{ 'anonymous': false, 'inputs': [{ 'indexed': true, 'internalType': 'address', 'name': 'account', 'type': 'address' },{ 'indexed': false, 'internalType': 'bool', 'name': 'whitelisted', 'type': 'bool' }], 'name': 'Whitelist', 'type': 'event' },{ 'anonymous': false, 'inputs': [{ 'indexed': true, 'internalType': 'address', 'name': 'caller', 'type': 'address' },{ 'indexed': true, 'internalType': 'address', 'name': 'to', 'type': 'address' },{ 'indexed': false, 'internalType': 'uint256', 'name': 'amount', 'type': 'uint256' }], 'name': 'Withdraw', 'type': 'event' },{ 'inputs': [{ 'internalType': 'uint256', 'name': 'minBalance', 'type': 'uint256' },{ 'internalType': 'uint256', 'name': 'desiredBalance', 'type': 'uint256' }], 'name': 'configure', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function' },{ 'inputs': [], 'name': 'deposit', 'outputs': [], 'stateMutability': 'payable', 'type': 'function' },{ 'inputs': [], 'name': 'owner', 'outputs': [{ 'internalType': 'address', 'name': '', 'type': 'address' }], 'stateMutability': 'view', 'type': 'function' },{ 'inputs': [], 'name': 'recipientDesiredBalance', 'outputs': [{ 'internalType': 'uint256', 'name': '', 'type': 'uint256' }], 'stateMutability': 'view', 'type': 'function' },{ 'inputs': [], 'name': 'recipientMinBalance', 'outputs': [{ 'internalType': 'uint256', 'name': '', 'type': 'uint256' }], 'stateMutability': 'view', 'type': 'function' },{ 'inputs': [], 'name': 'renounceOwnership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function' },{ 'inputs': [{ 'internalType': 'address', 'name': 'account', 'type': 'address' },{ 'internalType': 'bool', 'name': 'whitelisted', 'type': 'bool' }], 'name': 'setWhitelist', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function' },{ 'inputs': [{ 'internalType': 'address', 'name': 'newOwner', 'type': 'address' }], 'name': 'transferOwnership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function' },{ 'inputs': [{ 'internalType': 'address', 'name': '', 'type': 'address' }], 'name': 'whitelist', 'outputs': [{ 'internalType': 'bool', 'name': '', 'type': 'bool' }], 'stateMutability': 'view', 'type': 'function' },{ 'inputs': [{ 'internalType': 'address payable', 'name': 'to', 'type': 'address' }], 'name': 'withdraw', 'outputs': [{ 'internalType': 'uint256', 'name': '', 'type': 'uint256' }], 'stateMutability': 'nonpayable', 'type': 'function' },{ 'inputs': [{ 'internalType': 'address payable', 'name': 'to', 'type': 'address' },{ 'internalType': 'uint256', 'name': 'amount', 'type': 'uint256' }], 'name': 'withdrawAll', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function' },{ 'stateMutability': 'payable', 'type': 'receive' }]
+// abiDecoder.addABI(LitContractABI)
+// const testData = '0x095ea7b3000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
+// const decodedData = abiDecoder.decodeMethod(testData)
+// console.log(decodedData)
+
+enum OMGXNetwork {
+ L1 = 'L1',
+ L2 = 'L2',
+}
+
+const convertWeiToEther = (wei: any) => {
+ return parseFloat(web3.utils.fromWei(wei.toString(), 'ether'))
+}
+
+const logError = (message: string, key: string, extra = {}) => {
+ return (err: Error) => {
+ logger.error(message, {
+ key,
+ ...extra,
+ error: err.message,
+ })
+ }
+}
+
+const checkNetwork = (l1Provider: WebSocketProvider, l2Provider: WebSocketProvider) => {
+ let result = true
+ if (!l1Provider || l1Provider._websocket.readyState !== 1) {
+ logger.error('Connect to L1', {
+ key: 'network',
+ error: 'L1 network is not connected',
+ })
+ result = false
+ }
+ if (!l2Provider || l2Provider._websocket.readyState !== 1) {
+ logger.error('Connect to L2', {
+ key: 'network',
+ error: 'L2 network is not connected',
+ })
+ result = false
+ }
+ return result
+}
+
+const logBalance = (provider: WebSocketProvider, blockNumber: number, networkName: OMGXNetwork) => {
+ const promiseData = networkName === OMGXNetwork.L1 ? [
+ provider.getBalance(l1PoolAddress),
+ provider.getBalance(relayerAddress),
+ provider.getBalance(sequencerAddress),
+ provider.getGasPrice(),
+ ] : [
+ provider.getBalance(l2PoolAddress),
+ provider.getGasPrice(),
+ ]
+
+ Promise.all(promiseData)
+ .then((values) => {
+ if (values.length === 4) {
+ l1PoolBalance = convertWeiToEther(values[0])
+ l1RelayerBalance = convertWeiToEther(values[1])
+ l1SequencerBalance = convertWeiToEther(values[2])
+ l1GasPrice = parseFloat(values[3].toString())
+ l1BlockNumber = blockNumber
+ } else {
+ l2PoolBalance = convertWeiToEther(values[0])
+ l2GasPrice = parseFloat(values[1].toString())
+ l2BlockNumber = blockNumber
+ }
+ })
+ .then(() => {
+ if (l1PoolBalance !== undefined) {
+ logger.info(`${OMGXNetwork.L1} balance`, {
+ networkName: OMGXNetwork.L1,
+ key: 'balance',
+ data: {
+ poolAddress: l1PoolAddress,
+ poolBalance: l1PoolBalance,
+ relayerBalance: l1RelayerBalance,
+ sequencerBalance: l1SequencerBalance,
+ gasPrice: l1GasPrice,
+ blockNumber: l1BlockNumber,
+ }
+ })
+ }
+ if (l2PoolBalance !== undefined) {
+ logger.info(`${OMGXNetwork.L2} balance`, {
+ networkName: OMGXNetwork.L2,
+ key: 'balance',
+ data: {
+ poolAddress: l2PoolAddress,
+ poolBalance: l2PoolBalance,
+ gasPrice: l2GasPrice,
+ blockNumber: l2BlockNumber,
+ }
+ })
+ }
+ }).catch((err) => {
+ logger.error(`Get ${networkName} balance error`, {
+ networkName,
+ key: 'balance',
+ error: err.message,
+ })
+ })
+}
+
+const logTransaction = (socket: WebSocketProvider, trans: TransactionResponse, networkName: OMGXNetwork, metadata = {}) => {
+ // check from/to address is pool address
+ const poolAddress = (networkName === OMGXNetwork.L1) ? l1PoolAddress : l2PoolAddress
+ logger.debug({
+ from: trans.from,
+ to: trans.to,
+ poolAddress
+ })
+ if (trans.from !== poolAddress && trans.to !== poolAddress) {
+ return
+ }
+
+ socket.getTransactionReceipt(trans.hash)
+ .then((receipt: TransactionReceipt) => {
+ try {
+ logger.info('transaction ' + trans.hash, {
+ key: 'transaction',
+ poolAddress,
+ networkName,
+ data: _.omit(receipt, ['logs']),
+ })
+ receipt.logs.forEach((log) => {
+ logger.info('event ' + log.address, {
+ poolAddress,
+ networkName,
+ key: 'event',
+ data: log
+ })
+ })
+ } catch (err) {
+ logError('Error while logging transaction receipt', 'receipt', { ...metadata, receipt })
+ }
+ })
+ .catch(logError('Error while getting transaction receipt', 'transaction', { ...metadata }))
+}
+
+const logData = (socket: WebSocketProvider, blockNumber: string, networkName: OMGXNetwork) => {
+ const poolAddress = (networkName === OMGXNetwork.L1) ? l1PoolAddress : l2PoolAddress
+ const metadata = {
+ blockNumber,
+ networkName,
+ poolAddress,
+ }
+
+ socket.getBlockWithTransactions(blockNumber)
+ .then((block) => {
+ block.transactions.forEach((trans) => {
+ logTransaction(socket, trans, networkName, metadata)
+ })
+ })
+ .catch(logError('Error while getting block', 'block', { ...metadata }))
+}
+
+const onConnected = (networkName: OMGXNetwork) => {
+ return (event: { target: { _url: any } }) => {
+ logger.info(`${networkName} network connected`, {
+ url: event.target._url,
+ key: 'network'
+ })
+ }
+}
+
+const onError = (networkName: OMGXNetwork, provider: WebSocketProvider) => {
+ return async (event: { message: any; target: { _url: string } }) => {
+ logger.error(`${networkName} network failed to connect`, {
+ networkName,
+ error: event.message,
+ url: event.target._url,
+ key: 'network'
+ })
+ await provider.destroy()
+ setTimeout(() => {
+ logger.info(`${networkName} reconnecting ...`, {
+ networkName,
+ url: event.target._url,
+ key: 'network'
+ })
+ setupProvider(networkName, event.target._url)
+ }, reconnectTime)
+ }
+}
+
+const setupProvider = (networkName: OMGXNetwork, url: string) => {
+ const provider = new WebSocketProvider(url)
+ provider._websocket.addEventListener('open', onConnected(networkName))
+ provider._websocket.addEventListener('error', onError(networkName, provider))
+ provider._subscribe('block', ['newHeads'], (result: any) => {
+ const blockNumber = parseInt(result.number, 16)
+
+ // log transactions and events
+ logData(provider, result.number, networkName)
+
+ // log balances
+ logBalance(provider, blockNumber, networkName)
+ }).catch()
+}
+
+setupProvider(OMGXNetwork.L1, l1WsUrl)
+setupProvider(OMGXNetwork.L2, l2WsUrl)
+
+// l1Socket.getTransactionReceipt('0x4ba7c3ea403461b159df4ca0c6e38ece3b7c82fe35aa8d4669c2c00572a278e6')
+// l1Socket.getTransactionReceipt('0x041e9d9c19c3a11ef4a37f95a3661195f95b67619f5a04faa9fe534e8a9f937a')
+// .then((receipt) => {
+ // logger.debug(receipt.logs)
+ // logger.debug(abiDecoder.decodeLogs(receipt.logs))
+// })
+// .catch()
diff --git a/ops_omgx/monitoring/src/dummy-transaction.ts b/ops_omgx/monitoring/src/dummy-transaction.ts
new file mode 100644
index 000000000000..6ef5438b6da5
--- /dev/null
+++ b/ops_omgx/monitoring/src/dummy-transaction.ts
@@ -0,0 +1,23 @@
+import dotenv from 'dotenv'
+dotenv.config()
+import { fastOnRamp } from './3_fast-onramp'
+import { fastExit } from './4_fast-exit'
+import logger from './logger'
+
+const dummyDelayMins = parseInt(process.env.DUMMY_DELAY_MINS, 10) || 5
+const delayTime = 1000 * 60 * dummyDelayMins
+
+fastOnRamp().catch((err) => {
+ logger.error(err.message)
+})
+.then(fastExit).catch((err) => {
+ logger.error(err.message)
+})
+
+setInterval(() => {
+ fastOnRamp().catch((err) => {
+ logger.error(err.message)
+ }).then(fastExit).catch((err) => {
+ logger.error(err.message)
+ })
+}, delayTime)
diff --git a/ops_omgx/monitoring/src/libs/watcher-utils.ts b/ops_omgx/monitoring/src/libs/watcher-utils.ts
new file mode 100644
index 000000000000..e48faa5173bb
--- /dev/null
+++ b/ops_omgx/monitoring/src/libs/watcher-utils.ts
@@ -0,0 +1,97 @@
+import {
+ JsonRpcProvider,
+ TransactionReceipt,
+ TransactionResponse,
+} from '@ethersproject/providers'
+import { Watcher } from './watcher'
+import { Contract, Transaction } from 'ethers'
+import logger from '../logger'
+
+export const initWatcher = async (
+ l1Provider: JsonRpcProvider,
+ l2Provider: JsonRpcProvider,
+ AddressManager: Contract
+) => {
+
+ // const l1MessengerAddress = '0xF10EEfC14eB5b7885Ea9F7A631a21c7a82cf5D76'
+ const l1MessengerAddress = await AddressManager.getAddress('Proxy__OVM_L1CrossDomainMessenger')
+ logger.info('l1MessengerAddress: ' + l1MessengerAddress)
+
+ return new Watcher({
+ l1: {
+ provider: l1Provider,
+ messengerAddress: l1MessengerAddress,
+ },
+ l2: {
+ provider: l2Provider,
+ messengerAddress: '0x4200000000000000000000000000000000000007',
+ },
+ })
+}
+
+export const initFastWatcher = async (
+ l1Provider: JsonRpcProvider,
+ l2Provider: JsonRpcProvider,
+ AddressManager: Contract,
+) => {
+
+ // const l1MessengerAddress = '0xF296F4ca6A5725F55EdF1C67F80204871E65F87d'
+ const l1MessengerAddress = await AddressManager.getAddress('Proxy__OVM_L1CrossDomainMessengerFast')
+ logger.info('l1FastMessengerAddress: ' + l1MessengerAddress)
+
+ return new Watcher({
+ l1: {
+ provider: l1Provider,
+ messengerAddress: l1MessengerAddress,
+ },
+ l2: {
+ provider: l2Provider,
+ messengerAddress: '0x4200000000000000000000000000000000000007',
+ },
+ })
+}
+
+export interface CrossDomainMessagePair {
+ tx: Transaction
+ receipt: TransactionReceipt
+ remoteReceipt: TransactionReceipt
+}
+
+export enum Direction {
+ L1ToL2,
+ L2ToL1,
+}
+
+export const waitForXDomainTransaction = async (
+ watcher: Watcher,
+ tx: Promise | TransactionResponse,
+ direction: Direction
+): Promise => {
+
+ // await it if needed
+ tx = await tx
+
+ // get the receipt and the full transaction
+ const receipt = await tx.wait()
+
+ let remoteReceipt: TransactionReceipt
+ if (direction === Direction.L1ToL2) {
+ // DEPOSIT
+ const [xDomainMsgHash] = await watcher.getMessageHashesFromL1Tx(tx.hash)
+ logger.info(' Got L1->L2 message hash: ' + xDomainMsgHash)
+ remoteReceipt = await watcher.getL2TransactionReceipt(xDomainMsgHash)
+ logger.info(' Completed Deposit! L2 tx hash: ' + remoteReceipt.transactionHash)
+ } else {
+ // WITHDRAWAL
+ const [xDomainMsgHash] = await watcher.getMessageHashesFromL2Tx(tx.hash)
+ logger.info(' Got L2->L1 message hash: ' + xDomainMsgHash)
+ remoteReceipt = await watcher.getL1TransactionReceipt(xDomainMsgHash)
+ logger.info(' Completed Withdrawal! L1 tx hash: ' + remoteReceipt.transactionHash)
+ }
+
+ return {
+ tx,
+ receipt,
+ remoteReceipt,
+ }
+}
diff --git a/ops_omgx/monitoring/src/libs/watcher.ts b/ops_omgx/monitoring/src/libs/watcher.ts
new file mode 100644
index 000000000000..f9620972f97c
--- /dev/null
+++ b/ops_omgx/monitoring/src/libs/watcher.ts
@@ -0,0 +1,146 @@
+/* External Imports */
+import { ethers } from 'ethers'
+import { Provider, TransactionReceipt } from '@ethersproject/abstract-provider'
+import logger from '../logger'
+
+export interface Layer {
+ provider: Provider
+ messengerAddress: string
+}
+
+export interface WatcherOptions {
+ l1: Layer
+ l2: Layer
+}
+
+export class Watcher {
+
+ public NUM_BLOCKS_TO_FETCH: number = 10000
+
+ public l1: Layer
+ public l2: Layer
+
+ constructor (opts: WatcherOptions) {
+ this.l1 = opts.l1
+ this.l2 = opts.l2
+ }
+
+ public async getMessageHashesFromL1Tx (l1TxHash: string): Promise {
+ return this.getMessageHashesFromTx(this.l1, l1TxHash)
+ }
+
+ public async getMessageHashesFromL2Tx (l2TxHash: string): Promise {
+ return this.getMessageHashesFromTx(this.l2, l2TxHash)
+ }
+
+ public async getL1TransactionReceipt (
+ l2ToL1MsgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ logger.debug(' Calling getL1TransactionReceipt')
+ return this.getTransactionReceipt(this.l1, l2ToL1MsgHash, pollForPending)
+ }
+
+ public async getL2TransactionReceipt (
+ l1ToL2MsgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ logger.debug('Calling getL2TransactionReceipt')
+ return this.getTransactionReceipt(this.l2, l1ToL2MsgHash, pollForPending)
+ }
+
+ public async getMessageHashesFromTx (
+ layer: Layer,
+ txHash: string
+ ): Promise {
+
+ const receipt = await layer.provider.getTransactionReceipt(txHash)
+
+ if (!receipt) {
+ logger.debug('No receipt for txHash', { txHash })
+ return []
+ }
+
+ const msgHashes = []
+
+ logger.debug('Interate over ' + receipt.logs.length + ' of logs for txHash ' + txHash)
+ for (const log of receipt.logs) {
+ logger.debug('log.address', { address: log.address, messengerAddress: layer.messengerAddress })
+ if (
+ log.address === layer.messengerAddress &&
+ log.topics[0] === ethers.utils.id('SentMessage(bytes)')
+ ) {
+ const [message] = ethers.utils.defaultAbiCoder.decode(
+ ['bytes'],
+ log.data
+ )
+ msgHashes.push(ethers.utils.solidityKeccak256(['bytes'], [message]))
+ }
+ }
+ return msgHashes
+ }
+
+ public async getTransactionReceipt (
+ layer: Layer,
+ msgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+
+ logger.debug('Watcher::getTransactionReceipt')
+
+ const blockNumber = await layer.provider.getBlockNumber()
+ const startingBlock = Math.max(blockNumber - this.NUM_BLOCKS_TO_FETCH, 0)
+
+ logger.debug('Layer:', { layer })
+
+ logger.debug('Address: ' + layer.messengerAddress)
+ logger.debug('topic: ' + ethers.utils.id(`RelayedMessage(bytes32)`))
+ logger.debug('fromBlock: ' + startingBlock)
+
+ const filter = {
+ address: layer.messengerAddress,
+ topics: [ethers.utils.id(`RelayedMessage(bytes32)`)],
+ fromBlock: startingBlock,
+ }
+
+ const logs = await layer.provider.getLogs(filter)
+ logger.debug('Looking for: ' + msgHash)
+ // logger.debug("Current logs:", logs)
+
+ const matches = logs.filter((log: any) => log.data === msgHash)
+
+ // Message was relayed in the past
+ if (matches.length > 0) {
+ if (matches.length > 1) {
+ throw Error(
+ ' Found multiple transactions relaying the same message hash.'
+ )
+ }
+ return layer.provider.getTransactionReceipt(matches[0].transactionHash)
+ }
+
+ if (!pollForPending) {
+ return Promise.resolve(undefined)
+ }
+
+ // Message has yet to be relayed, poll until it is found
+ return new Promise(async (resolve, reject) => {
+ logger.debug('Watcher polling::layer.provider.getTransactionReceipt pre filter')
+ // listener that triggers on filter event
+ layer.provider.on(filter, async (log: any) => {
+ logger.debug('Watcher polling::layer.provider.getTransactionReceipt post filter')
+ logger.debug(log)
+ if (log.data === msgHash) {
+ logger.debug('FOUND')
+ try {
+ const txReceipt = await layer.provider.getTransactionReceipt(log.transactionHash)
+ layer.provider.off(filter)
+ resolve(txReceipt)
+ } catch (e) {
+ reject(e)
+ }
+ }
+ })
+ })
+ }
+}
diff --git a/ops_omgx/monitoring/src/logger.ts b/ops_omgx/monitoring/src/logger.ts
new file mode 100644
index 000000000000..70ad21d7f455
--- /dev/null
+++ b/ops_omgx/monitoring/src/logger.ts
@@ -0,0 +1,36 @@
+import { createLogger, format, transports } from 'winston'
+import _ from 'lodash'
+
+const colorizer = format.colorize()
+const alignColorsAndTime = format.combine(
+ format.colorize({
+ message: true
+ }),
+ format.timestamp({
+ format: 'YYYY-MM-DDTHH:mm:ssZ',
+ }),
+ format.metadata({ fillExcept: ['message', 'level', 'timestamp', 'label'] }),
+ format.printf((info) => {
+ const timestamp = colorizer.colorize(info.level, `[${info.level.toUpperCase()}] ${info.timestamp}:`)
+ if (!_.isEmpty(info.metadata)) {
+ const metadata = colorizer.colorize(info.level, info.metadata)
+ return `${timestamp} ${info.message}\n${metadata}`
+ }
+ return `${timestamp} ${info.message}`
+ })
+)
+const production = format.combine(
+ format.timestamp({
+ format: 'YYYY-MM-DDTHH:mm:ssZ',
+ }),
+ format.json(),
+)
+
+const logger = createLogger({
+ level: (process.env.NODE_ENV === 'local') ? 'debug' : 'info',
+ exitOnError: false,
+ format: (process.env.NODE_ENV === 'local') ? alignColorsAndTime : production,
+ transports: [ new transports.Console() ]
+})
+
+export default logger
diff --git a/ops_omgx/monitoring/tsconfig.json b/ops_omgx/monitoring/tsconfig.json
new file mode 100644
index 000000000000..2cfd5037e801
--- /dev/null
+++ b/ops_omgx/monitoring/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "target": "es2017",
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "lib": ["es2018"],
+ "allowSyntheticDefaultImports": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "suppressImplicitAnyIndexErrors": true,
+ "resolveJsonModule": true,
+ "esModuleInterop": true,
+ "sourceMap": true
+ },
+ "include": ["src/**/*.ts"]
+}
diff --git a/ops_omgx/monitoring/tslint.json b/ops_omgx/monitoring/tslint.json
new file mode 100644
index 000000000000..76d9788aed89
--- /dev/null
+++ b/ops_omgx/monitoring/tslint.json
@@ -0,0 +1,14 @@
+{
+ "extends": [
+ "tslint-config-standard",
+ "tslint:latest"
+ ],
+ "rulesDirectory": [
+ "tslint-plugin-prettier"
+ ],
+ "rules": {
+ "trailing-comma": true,
+ "object-literal-sort-keys": false,
+ "ordered-imports": false
+ }
+}
diff --git a/ops_omgx/secret2env b/ops_omgx/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/secret2env differ
diff --git a/ops_omgx/secret2env-src/Dockerfile b/ops_omgx/secret2env-src/Dockerfile
new file mode 100644
index 000000000000..d52e0ca0f005
--- /dev/null
+++ b/ops_omgx/secret2env-src/Dockerfile
@@ -0,0 +1,5 @@
+FROM golang:1.14-alpine AS build
+
+WORKDIR /src/
+COPY . /src/
+RUN env CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o secret2env
diff --git a/ops_omgx/secret2env-src/Makefile b/ops_omgx/secret2env-src/Makefile
new file mode 100644
index 000000000000..8cd21f7f148d
--- /dev/null
+++ b/ops_omgx/secret2env-src/Makefile
@@ -0,0 +1,9 @@
+.DEFAULT_GOAL := build
+
+.PHONY: build
+build:
+ go get github.com/aws/aws-sdk-go && go install github.com/aws/aws-sdk-go && go build -o secret2env
+
+.PHONY: build/linux
+build/linux:
+ env CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o secret2env
diff --git a/ops_omgx/secret2env-src/README.md b/ops_omgx/secret2env-src/README.md
new file mode 100644
index 000000000000..d7b62c8a6a31
--- /dev/null
+++ b/ops_omgx/secret2env-src/README.md
@@ -0,0 +1,32 @@
+# secret2env
+
+`secret2env` is a simple program that retrieves a secret from AWS
+secrets manager, parses the secret value as a json and exports the secret
+into multiple environment variables
+
+
+## Build
+
+`Makefile` is provided; Run `make` and it will build the program
+on the current platform and output a file in the current directory
+
+## Example
+
+We have a secret that hosts a lot of environment variables in aws region
+`us-east-1`
+
+Running `secret2env --name foo --region us-east-1` will output the
+following text:
+
+```
+export variable1=1
+export variable2=2
+export variable3=3
+```
+
+If you wish to export the variables into the current environment, you
+need to do `eval $(./secret2env -name foo -region us-east-1)` in the
+shell.
+
+In case of an error, the program will return an exit value of 1 and
+fail silently so as not to break downstream output processing).
diff --git a/ops_omgx/secret2env-src/go.mod b/ops_omgx/secret2env-src/go.mod
new file mode 100644
index 000000000000..466c4a92d2e9
--- /dev/null
+++ b/ops_omgx/secret2env-src/go.mod
@@ -0,0 +1,5 @@
+module github.com/enyalabs/enya-ops/secret2env
+
+go 1.15
+
+require github.com/aws/aws-sdk-go v1.36.3
diff --git a/ops_omgx/secret2env-src/go.sum b/ops_omgx/secret2env-src/go.sum
new file mode 100644
index 000000000000..fae3e78c6bc4
--- /dev/null
+++ b/ops_omgx/secret2env-src/go.sum
@@ -0,0 +1,21 @@
+github.com/aws/aws-sdk-go v1.36.3 h1:KYpG5OegwW3xgOsMxy01nj/Td281yxi1Ha2lJQJs4tI=
+github.com/aws/aws-sdk-go v1.36.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/ops_omgx/secret2env-src/main.go b/ops_omgx/secret2env-src/main.go
new file mode 100644
index 000000000000..f0c73c3933b1
--- /dev/null
+++ b/ops_omgx/secret2env-src/main.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "os"
+
+ "github.com/aws/aws-sdk-go/aws"
+ "github.com/aws/aws-sdk-go/aws/session"
+ "github.com/aws/aws-sdk-go/service/secretsmanager"
+)
+
+func main() {
+ var (
+ region string = "us-east-1"
+ secname string
+ verbose bool
+ )
+ flag.StringVar(®ion, "region", region, "AWS region")
+ flag.StringVar(&secname, "name", secname, "secret name")
+ flag.BoolVar(&verbose, "verbose", verbose, "print error output (if any)")
+ flag.Parse()
+
+ if secname == "" {
+ if verbose {
+ fmt.Println("please provide the secret's name")
+ }
+ os.Exit(1)
+ }
+
+ svc := secretsmanager.New(session.New(), aws.NewConfig().WithRegion(region))
+ input := &secretsmanager.GetSecretValueInput{
+ SecretId: aws.String(secname),
+ VersionStage: aws.String("AWSCURRENT"), // VersionStage defaults to AWSCURRENT if unspecified
+ }
+ result, err := svc.GetSecretValue(input)
+ if err != nil {
+ if verbose {
+ fmt.Printf("error retrieving the secret value: %v\n", err)
+ }
+ os.Exit(1)
+ }
+ kv := map[string]string{}
+ if err := json.Unmarshal([]byte(*result.SecretString), &kv); err != nil {
+ if verbose {
+ fmt.Printf("error parsing the secret's json contents: %v\n", err)
+ }
+ os.Exit(1)
+ }
+ for k, v := range kv {
+ fmt.Printf("%s=%s\n", k, v)
+ }
+}
diff --git a/ops_omgx/secret2env-src/secret2env b/ops_omgx/secret2env-src/secret2env
new file mode 100755
index 000000000000..4642b3695951
Binary files /dev/null and b/ops_omgx/secret2env-src/secret2env differ
diff --git a/ops_omgx/test/.env.example b/ops_omgx/test/.env.example
new file mode 100644
index 000000000000..e85de24ac3ee
--- /dev/null
+++ b/ops_omgx/test/.env.example
@@ -0,0 +1,17 @@
+# Rinkeby
+NODE_ENV=local
+L1_NODE_WEB3_URL=https://rinkeby.infura.io/v3/YOUR_INFURA_KEY_HERE
+L2_NODE_WEB3_URL=https://rinkeby.omgx.network
+ETH1_ADDRESS_RESOLVER_ADDRESS=0x927b167526bAbB9be047421db732C663a0b77B11
+TEST_PRIVATE_KEY_1=0xPRIVATE_KEY_OF_THE_FIRST_TEST_WALLET
+TARGET_GAS_LIMIT=9000000000
+CHAIN_ID=28
+
+# Local
+NODE_ENV=local
+L1_NODE_WEB3_URL=http://localhost:9545
+L2_NODE_WEB3_URL=http://localhost:8545
+ETH1_ADDRESS_RESOLVER_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3
+TEST_PRIVATE_KEY_1=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
+TARGET_GAS_LIMIT=9000000000
+CHAIN_ID=28
\ No newline at end of file
diff --git a/ops_omgx/test/contracts/Message/L1Message.sol b/ops_omgx/test/contracts/Message/L1Message.sol
new file mode 100644
index 000000000000..ed292bf757ea
--- /dev/null
+++ b/ops_omgx/test/contracts/Message/L1Message.sol
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+
+/* Library Imports */
+import "../libraries/OVM_CrossDomainEnabledFast.sol";
+import { L2Message } from "./L2Message.sol";
+
+contract L1Message is OVM_CrossDomainEnabledFast {
+
+ address L2MessageAddress;
+ string crossDomainMessage;
+
+ event ReceiveL2Message (
+ string _message
+ );
+
+ /********************
+ * Constructor *
+ ********************/
+ constructor (
+ address _l1CrossDomainMessenger,
+ address _l1CustomCrossDomainMessenger
+ )
+ OVM_CrossDomainEnabledFast(
+ _l1CrossDomainMessenger,
+ _l1CustomCrossDomainMessenger
+ )
+ {}
+
+ function init (
+ address _L2MessageAddress
+ )
+ public
+ {
+ L2MessageAddress = _L2MessageAddress;
+ }
+
+ function sendMessageL1ToL2 () public {
+ bytes memory data = abi.encodeWithSelector(
+ L2Message.receiveL1Message.selector,
+ "messageFromL1"
+ );
+
+ // Send calldata into L1
+ sendCrossDomainMessage(
+ address(L2MessageAddress),
+ 1200000,
+ data
+ );
+ }
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * Receive message from L2
+ * @param _message message
+ */
+ function receiveL2Message(
+ string memory _message
+ )
+ external
+ onlyFromCrossDomainAccount(address(L2MessageAddress))
+ {
+ crossDomainMessage = _message;
+ emit ReceiveL2Message(_message);
+ }
+}
\ No newline at end of file
diff --git a/ops_omgx/test/contracts/Message/L2Message.sol b/ops_omgx/test/contracts/Message/L2Message.sol
new file mode 100644
index 000000000000..e09b290a33f0
--- /dev/null
+++ b/ops_omgx/test/contracts/Message/L2Message.sol
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0;
+
+/* Library Imports */
+import "../libraries/OVM_CrossDomainEnabled.sol";
+import { L1Message } from "./L1Message.sol";
+
+contract L2Message is OVM_CrossDomainEnabled {
+
+ address L1MessageAddress;
+ string crossDomainMessage;
+
+ event ReceiveL1Message (
+ string _message
+ );
+
+ /********************
+ * Constructor *
+ ********************/
+ /**
+ * @param _l2CrossDomainMessenger L2 Messenger address being used for sending the cross-chain message.
+ */
+ constructor (
+ address _l2CrossDomainMessenger
+ )
+ OVM_CrossDomainEnabled(_l2CrossDomainMessenger)
+ {}
+
+ function init (
+ address _L1MessageAddress
+ )
+ public
+ {
+ L1MessageAddress = _L1MessageAddress;
+ }
+
+ function sendMessageL2ToL1 () public {
+ bytes memory data = abi.encodeWithSelector(
+ L1Message.receiveL2Message.selector,
+ "messageFromL2"
+ );
+
+ // Send calldata into L1
+ sendCrossDomainMessage(
+ address(L1MessageAddress),
+ 1200000,
+ data
+ );
+ }
+
+ /*************************
+ * Cross-chain Functions *
+ *************************/
+
+ /**
+ * Receive message from L1
+ * @param _message message
+ */
+ function receiveL1Message(
+ string memory _message
+ )
+ external
+ onlyFromCrossDomainAccount(address(L1MessageAddress))
+ {
+ crossDomainMessage = _message;
+ emit ReceiveL1Message(_message);
+ }
+}
\ No newline at end of file
diff --git a/ops_omgx/test/contracts/interfaces/iOVM_CrossDomainMessenger.sol b/ops_omgx/test/contracts/interfaces/iOVM_CrossDomainMessenger.sol
new file mode 100644
index 000000000000..457d9d34f9d0
--- /dev/null
+++ b/ops_omgx/test/contracts/interfaces/iOVM_CrossDomainMessenger.sol
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+pragma experimental ABIEncoderV2;
+
+/**
+ * @title iOVM_CrossDomainMessenger
+ */
+interface iOVM_CrossDomainMessenger {
+
+ /**********
+ * Events *
+ **********/
+
+ event SentMessage(bytes message);
+ event RelayedMessage(bytes32 msgHash);
+ event FailedRelayedMessage(bytes32 msgHash);
+
+
+ /*************
+ * Variables *
+ *************/
+
+ function xDomainMessageSender() external view returns (address);
+
+
+ /********************
+ * Public Functions *
+ ********************/
+
+ /**
+ * Sends a cross domain message to the target messenger.
+ * @param _target Target contract address.
+ * @param _message Message to send to the target.
+ * @param _gasLimit Gas limit for the provided message.
+ */
+ function sendMessage(
+ address _target,
+ bytes calldata _message,
+ uint32 _gasLimit
+ ) external;
+}
diff --git a/ops_omgx/test/contracts/libraries/OVM_CrossDomainEnabled.sol b/ops_omgx/test/contracts/libraries/OVM_CrossDomainEnabled.sol
new file mode 100644
index 000000000000..311395ee8712
--- /dev/null
+++ b/ops_omgx/test/contracts/libraries/OVM_CrossDomainEnabled.sol
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+
+/* Interface Imports */
+import { iOVM_CrossDomainMessenger } from "../interfaces/iOVM_CrossDomainMessenger.sol";
+
+/**
+ * @title OVM_CrossDomainEnabled
+ * @dev Helper contract for contracts performing cross-domain communications
+ *
+ * Compiler used: defined by inheriting contract
+ * Runtime target: defined by inheriting contract
+ */
+contract OVM_CrossDomainEnabled {
+
+ /*************
+ * Variables *
+ *************/
+
+ // Messenger contract used to send and recieve messages from the other domain.
+ address public messenger;
+
+
+ /***************
+ * Constructor *
+ ***************/
+
+ /**
+ * @param _messenger Address of the CrossDomainMessenger on the current layer.
+ */
+ constructor(
+ address _messenger
+ ) {
+ messenger = _messenger;
+ }
+
+
+ /**********************
+ * Function Modifiers *
+ **********************/
+
+ /**
+ * Enforces that the modified function is only callable by a specific cross-domain account.
+ * @param _sourceDomainAccount The only account on the originating domain which is
+ * authenticated to call this function.
+ */
+ modifier onlyFromCrossDomainAccount(
+ address _sourceDomainAccount
+ ) {
+ require(
+ msg.sender == address(getCrossDomainMessenger()),
+ "OVM_XCHAIN: messenger contract unauthenticated"
+ );
+
+ require(
+ getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,
+ "OVM_XCHAIN: wrong sender of cross-domain message"
+ );
+
+ _;
+ }
+
+
+ /**********************
+ * Internal Functions *
+ **********************/
+
+ /**
+ * Gets the messenger, usually from storage. This function is exposed in case a child contract
+ * needs to override.
+ * @return The address of the cross-domain messenger contract which should be used.
+ */
+ function getCrossDomainMessenger()
+ internal
+ virtual
+ returns (
+ iOVM_CrossDomainMessenger
+ )
+ {
+ return iOVM_CrossDomainMessenger(messenger);
+ }
+
+ /**
+ * Sends a message to an account on another domain
+ * @param _crossDomainTarget The intended recipient on the destination domain
+ * @param _message The data to send to the target (usually calldata to a function with
+ * `onlyFromCrossDomainAccount()`)
+ * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
+ */
+ function sendCrossDomainMessage(
+ address _crossDomainTarget,
+ uint32 _gasLimit,
+ bytes memory _message
+ )
+ internal
+ {
+ getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
+ }
+}
diff --git a/ops_omgx/test/contracts/libraries/OVM_CrossDomainEnabledFast.sol b/ops_omgx/test/contracts/libraries/OVM_CrossDomainEnabledFast.sol
new file mode 100644
index 000000000000..9667b64f56be
--- /dev/null
+++ b/ops_omgx/test/contracts/libraries/OVM_CrossDomainEnabledFast.sol
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.8.0;
+/* Interface Imports */
+import { iOVM_CrossDomainMessenger } from "../interfaces/iOVM_CrossDomainMessenger.sol";
+
+/**
+ * @title OVM_CrossDomainEnabledFast
+ * @dev Helper contract for contracts performing cross-domain communications
+ *
+ * Compiler used: defined by inheriting contract
+ * Runtime target: defined by inheriting contract
+ */
+contract OVM_CrossDomainEnabledFast {
+
+ // Messenger contract used to send and receive messages from the other domain.
+ address public senderMessenger;
+ address public relayerMessenger;
+
+ /***************
+ * Constructor *
+ ***************/
+ constructor(
+ address _senderMessenger,
+ address _relayerMessenger
+ ) {
+ senderMessenger = _senderMessenger;
+ relayerMessenger = _relayerMessenger;
+ }
+
+ /**********************
+ * Function Modifiers *
+ **********************/
+
+ /**
+ * @notice Enforces that the modified function is only callable by a specific cross-domain account.
+ * @param _sourceDomainAccount The only account on the originating domain which is authenticated to call this function.
+ */
+ modifier onlyFromCrossDomainAccount(
+ address _sourceDomainAccount
+ ) {
+ require(
+ msg.sender == address(getCrossDomainRelayerMessenger()),
+ "OVM_XCHAIN: messenger contract unauthenticated"
+ );
+
+ require(
+ getCrossDomainRelayerMessenger().xDomainMessageSender() == _sourceDomainAccount,
+ "OVM_XCHAIN: wrong sender of cross-domain message"
+ );
+
+ _;
+ }
+
+ /**********************
+ * Internal Functions *
+ **********************/
+
+ /**
+ * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.
+ * @return The address of the cross-domain messenger contract which should be used.
+ */
+ function getCrossDomainSenderMessenger()
+ internal
+ virtual
+ returns(
+ iOVM_CrossDomainMessenger
+ )
+ {
+ return iOVM_CrossDomainMessenger(senderMessenger);
+ }
+
+ /**
+ * @notice Gets the messenger, usually from storage. This function is exposed in case a child contract needs to override.
+ * @return The address of the cross-domain messenger contract which should be used.
+ */
+ function getCrossDomainRelayerMessenger()
+ internal
+ virtual
+ returns(
+ iOVM_CrossDomainMessenger
+ )
+ {
+ return iOVM_CrossDomainMessenger(relayerMessenger);
+ }
+
+ /**
+ * @notice Sends a message to an account on another domain
+ * @param _crossDomainTarget The intended recipient on the destination domain
+ * @param _data The data to send to the target (usually calldata to a function with `onlyFromCrossDomainAccount()`)
+ * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
+ */
+ function sendCrossDomainMessage(
+ address _crossDomainTarget,
+ uint32 _gasLimit,
+ bytes memory _data
+ ) internal {
+ getCrossDomainSenderMessenger().sendMessage(_crossDomainTarget, _data, _gasLimit);
+ }
+}
diff --git a/ops_omgx/test/deployment/local/addresses.json b/ops_omgx/test/deployment/local/addresses.json
new file mode 100644
index 000000000000..d671e3f22318
--- /dev/null
+++ b/ops_omgx/test/deployment/local/addresses.json
@@ -0,0 +1,4 @@
+{
+ "L1Message": "0x36DB8a0cb3eA240dA2e46B3C75aD273a98119E0B",
+ "L2Message": "0xAe2925763C13AAE594335ae6b407C3Dd2d182e8D"
+}
\ No newline at end of file
diff --git a/ops_omgx/test/deployment/rinkeby/addresses.json b/ops_omgx/test/deployment/rinkeby/addresses.json
new file mode 100644
index 000000000000..5e00118fd372
--- /dev/null
+++ b/ops_omgx/test/deployment/rinkeby/addresses.json
@@ -0,0 +1,14 @@
+{
+ "L1LiquidityPool": "0x1383fF5A0Ef67f4BE949408838478917d87FeAc7",
+ "L2LiquidityPool": "0x88b3743A9e1FdB3C8C92Cec7A6A370c1403c7C60",
+ "L1ERC20": "0x8251170C40C49F0b55B7913566AA6e31971F6c6e",
+ "L2DepositedERC20": "0x4267C3dE5d20Ec77A94EafaB1cbD3FF18E594875",
+ "L1ERC20Gateway": "0x04bFdCdfE4b2C3dCFb79dA9C0253f6feF92b6952",
+ "l1ETHGatewayAddress": "0xa611c04e5330e782E1Db9189497128d180cE93a0",
+ "l1MessengerAddress": "0x6EF23884406dcacC43E9BCA677A9E6331A44be21",
+ "L2TokenPool": "0x57b47fE191b4AbAd8187AbB182Ec9F22AE317434",
+ "AtomicSwap": "0xcB7F4a9B5344919E0Db08989b5d450F64cF2013f",
+ "L1Message": "0xD0Fb87bf4017e0A5A3bcE2eF33Bf0B95348a479E",
+ "L2Message": "0xf047bc835F3765AEfb9d9A2af396ae060Bc947c5",
+ "L2ERC721": "0xA952aECB83f31C43446B62815c77580123038875"
+}
\ No newline at end of file
diff --git a/ops_omgx/test/hardhat.config.ts b/ops_omgx/test/hardhat.config.ts
new file mode 100644
index 000000000000..a230d102fa85
--- /dev/null
+++ b/ops_omgx/test/hardhat.config.ts
@@ -0,0 +1,25 @@
+import { HardhatUserConfig } from 'hardhat/types'
+import '@nomiclabs/hardhat-ethers'
+import '@eth-optimism/hardhat-ovm'
+
+const config: HardhatUserConfig = {
+ mocha: {
+ timeout: 600000,
+ },
+ networks: {
+ omgx: {
+ url: 'https://integration.omgx.network',
+ // This sets the gas price to 0 for all transactions on L2. We do this
+ // because account balances are not automatically initiated with an ETH
+ // balance.
+ gasPrice: 0,
+ ovm: true,
+ },
+ },
+ solidity: '0.7.6',
+ ovm: {
+ solcVersion: '0.7.6',
+ },
+}
+
+export default config
diff --git a/ops_omgx/test/package.json b/ops_omgx/test/package.json
new file mode 100644
index 000000000000..416e9c9b9e6e
--- /dev/null
+++ b/ops_omgx/test/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "@omgx/ops_omgx",
+ "version": "0.0.1",
+ "description": "OMGX Example Wallet and Associated Smart Contracts",
+ "private": true,
+ "author": "OMG",
+ "license": "MIT",
+ "files": [
+ "test/**/*.ts"
+ ],
+ "scripts": {
+ "build": "./scripts/build.sh",
+ "build:contracts": "hardhat compile",
+ "build:contracts:ovm": "hardhat compile --network omgx",
+ "test": "./scripts/build.sh && hardhat --network omgx test",
+ "postinstall": "patch-package"
+ },
+ "devDependencies": {
+ "@eth-optimism/hardhat-ovm": "^0.0.2",
+ "@eth-optimism/core-utils": "^0.4.2",
+ "@ethersproject/providers": "^5.0.24",
+ "@nomiclabs/hardhat-ethers": "^2.0.2",
+ "@types/jest": "^26.0.22",
+ "@types/mocha": "^8.2.2",
+ "chai": "^4.3.3",
+ "chai-as-promised": "^7.1.1",
+ "directory-tree": "^2.2.7",
+ "ethereum-waffle": "^3.3.0",
+ "ethers": "^5.0.32",
+ "hardhat": "^2.1.2",
+ "mocha": "^8.3.1",
+ "rimraf": "^3.0.2",
+ "shx": "^0.3.3",
+ "ts-node": "^9.1.1",
+ "typescript": "^4.2.4"
+ },
+ "dependencies": {
+ "@eth-optimism/contracts": "^0.3.4",
+ "@openzeppelin/contracts": "3.4.1",
+ "chalk": "^4.1.1",
+ "dotenv": "^8.2.0",
+ "glob": "^7.1.6",
+ "patch-package": "^6.4.7"
+ }
+}
diff --git a/ops_omgx/test/scripts/build.sh b/ops_omgx/test/scripts/build.sh
new file mode 100755
index 000000000000..11214cb0dd94
--- /dev/null
+++ b/ops_omgx/test/scripts/build.sh
@@ -0,0 +1,3 @@
+yarn build:contracts &
+yarn build:contracts:ovm &
+wait
diff --git a/ops_omgx/test/test/a_setup.spec.ts b/ops_omgx/test/test/a_setup.spec.ts
new file mode 100644
index 000000000000..75c4d2feca6d
--- /dev/null
+++ b/ops_omgx/test/test/a_setup.spec.ts
@@ -0,0 +1,95 @@
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+import { Contract, ContractFactory, utils } from 'ethers'
+import chalk from 'chalk';
+
+import L1MessageJson from '../artifacts/contracts/Message/L1Message.sol/L1Message.json'
+import L2MessageJson from '../artifacts-ovm/contracts/Message/L2Message.sol/L2Message.json'
+
+
+import { OptimismEnv } from './shared/env'
+
+import { promises as fs } from 'fs'
+
+describe('System setup', async () => {
+
+ let Factory__L1Message: ContractFactory
+ let Factory__L2Message: ContractFactory
+
+ let L1Message: Contract
+ let L2Message: Contract
+
+ let env: OptimismEnv
+
+ /************* BOB owns all the pools, and ALICE mints a new token ***********/
+ before(async () => {
+
+ env = await OptimismEnv.new()
+
+ Factory__L1Message = new ContractFactory(
+ L1MessageJson.abi,
+ L1MessageJson.bytecode,
+ env.bobl1Wallet
+ )
+
+ Factory__L2Message = new ContractFactory(
+ L2MessageJson.abi,
+ L2MessageJson.bytecode,
+ env.bobl2Wallet
+ )
+ })
+
+ it('should deploy contracts', async () => {
+
+ L1Message = await Factory__L1Message.deploy(
+ env.watcher.l1.messengerAddress,
+ env.fastWatcher.l1.messengerAddress
+ )
+ await L1Message.deployTransaction.wait()
+ console.log(`🌕 ${chalk.red('L1 Message deployed to:')} ${chalk.green(L1Message.address)}`)
+
+ L2Message = await Factory__L2Message.deploy(
+ env.watcher.l2.messengerAddress,
+ {gasPrice: 0}
+ )
+ await L2Message.deployTransaction.wait()
+ console.log(`🌕 ${chalk.red('L2 Message deployed to:')} ${chalk.green(L2Message.address)}`)
+
+ // Initialize L1 message
+ const L1MessageTX = await L1Message.init(
+ L2Message.address
+ )
+ await L1MessageTX.wait()
+ console.log(`âï¸ ${chalk.blue('L1 Message initialized:')} ${chalk.green(L1MessageTX.hash)}`)
+
+ // Initialize L2 message
+ const L2MessageTX = await L2Message.init(
+ L1Message.address,
+ {gasPrice: 0}
+ )
+ await L2MessageTX.wait()
+ console.log(`âï¸ ${chalk.blue('L2 Message initialized:')} ${chalk.green(L2MessageTX.hash)}`)
+ })
+
+ it('should write addresses to file', async () => {
+ //keep track of where things are for future use by the front end
+ console.log(`${chalk.yellow('\n\n********************************')}`)
+
+ const addresses = {
+ L1Message: L1Message.address,
+ L2Message: L2Message.address
+ }
+
+ console.log(chalk.green(JSON.stringify(addresses, null, 2)))
+
+ try{
+ await fs.writeFile('./deployment/local/addresses.json', JSON.stringify(addresses, null, 2))
+ console.log(`\n🚨 ${chalk.red('Successfully wrote addresses to file\n')}`)
+ } catch (err) {
+ console.log(`\n📬 ${chalk.red(`Error writing addresses to file: ${err}\n`)}`)
+ }
+
+ console.log(`${chalk.yellow('********************************')}`)
+ })
+})
\ No newline at end of file
diff --git a/ops_omgx/test/test/b_message.spec.ts b/ops_omgx/test/test/b_message.spec.ts
new file mode 100644
index 000000000000..12ebdc3899b4
--- /dev/null
+++ b/ops_omgx/test/test/b_message.spec.ts
@@ -0,0 +1,57 @@
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+import { Contract, ContractFactory, utils } from 'ethers'
+import chalk from 'chalk';
+
+import { Direction } from './shared/watcher-utils'
+
+import L1MessageJson from '../artifacts/contracts/Message/L1Message.sol/L1Message.json'
+import L2MessageJson from '../artifacts-ovm/contracts/Message/L2Message.sol/L2Message.json'
+
+import { OptimismEnv } from './shared/env'
+
+import * as fs from 'fs'
+
+describe('Messenge Relayer Test', async () => {
+
+ let L1Message: Contract
+ let L2Message: Contract
+
+ let env: OptimismEnv
+
+ before(async () => {
+
+ const addressData = fs.readFileSync('./deployment/local/addresses.json', 'utf8')
+ const addressArray = JSON.parse(addressData)
+
+ env = await OptimismEnv.new()
+
+ L1Message = new Contract(
+ addressArray.L1Message,
+ L1MessageJson.abi,
+ env.bobl1Wallet
+ )
+
+ L2Message = new Contract(
+ addressArray.L2Message,
+ L2MessageJson.abi,
+ env.bobl2Wallet
+ )
+
+ })
+
+ it('should send message from L2 to L1', async () => {
+ await env.waitForXFastDomainTransaction(
+ L2Message.sendMessageL2ToL1({gasPrice: 0}),
+ Direction.L2ToL1
+ )
+ })
+
+ it('should send message from L1 to L2', async () => {
+ await env.waitForXDomainTransaction(
+ L1Message.sendMessageL1ToL2(),
+ Direction.L1ToL2
+ )
+ })
+})
\ No newline at end of file
diff --git a/ops_omgx/test/test/shared/env.ts b/ops_omgx/test/test/shared/env.ts
new file mode 100644
index 000000000000..890523cadd02
--- /dev/null
+++ b/ops_omgx/test/test/shared/env.ts
@@ -0,0 +1,152 @@
+import { getContractInterface, getContractFactory } from '@eth-optimism/contracts'
+import { Contract, utils, Wallet } from 'ethers'
+import { Watcher } from './watcher'
+
+import {
+ getAddressManager,
+
+ l1Provider,
+ l2Provider,
+
+ bobl1Wallet,
+ bobl2Wallet,
+
+ getL2ETHGateway,
+ getL1ETHGateway,
+} from './utils'
+
+import {
+ initWatcher,
+ initFastWatcher,
+ CrossDomainMessagePair,
+ Direction,
+ waitForXDomainTransaction,
+} from './watcher-utils'
+
+
+import { TransactionResponse } from '@ethersproject/providers'
+
+/// Helper class for instantiating a test environment with a funded account
+export class OptimismEnv {
+ // L1 Contracts
+ addressManager: Contract
+ L1ETHGateway: Contract
+ l1Messenger: Contract
+ l1MessengerAddress: String
+ ctc: Contract
+
+ l1Provider
+ l2Provider
+
+ // L2 Contracts
+ L2ETHGateway: Contract
+ l2Messenger: Contract
+
+ // The L1 <> L2 State watcher
+ watcher: Watcher
+ fastWatcher: Watcher
+
+ // The wallets
+ bobl1Wallet: Wallet
+ bobl2Wallet: Wallet
+
+ alicel1Wallet: Wallet
+ alicel2Wallet: Wallet
+
+ katel1Wallet: Wallet
+ katel2Wallet: Wallet
+
+ constructor(args: any) {
+ this.addressManager = args.addressManager
+ this.L1ETHGateway = args.L1ETHGateway
+ this.l1Messenger = args.l1Messenger
+ this.l1MessengerAddress = args.l1MessengerAddress
+ this.L2ETHGateway = args.L2ETHGateway
+ this.l2Messenger = args.l2Messenger
+ this.watcher = args.watcher
+ this.fastWatcher = args.fastWatcher
+ this.bobl1Wallet = args.bobl1Wallet
+ this.bobl2Wallet = args.bobl2Wallet
+ this.l1Provider = args.l1Provider
+ this.l2Provider = args.l2Provider
+ this.ctc = args.ctc
+ }
+
+ static async new(): Promise {
+
+ const addressManager = getAddressManager(bobl1Wallet)
+ const watcher = await initWatcher(l1Provider, l2Provider, addressManager)
+ const fastWatcher = await initFastWatcher(l1Provider, l2Provider, addressManager)
+
+ const L1ETHGateway = await getL1ETHGateway(bobl1Wallet, addressManager)
+ const L2ETHGateway = getL2ETHGateway(bobl2Wallet)
+
+ const l1Messenger = getContractFactory('iOVM_L1CrossDomainMessenger')
+ .connect(bobl1Wallet)
+ .attach(watcher.l1.messengerAddress)
+
+ const l1MessengerAddress = l1Messenger.address;
+
+ const l2Messenger = getContractFactory('iOVM_L2CrossDomainMessenger')
+ .connect(bobl2Wallet)
+ .attach(watcher.l2.messengerAddress)
+
+ const ctcAddress = await addressManager.getAddress(
+ 'OVM_CanonicalTransactionChain'
+ )
+ const ctc = getContractFactory('OVM_CanonicalTransactionChain')
+ .connect(bobl1Wallet)
+ .attach(ctcAddress)
+
+ return new OptimismEnv({
+ addressManager,
+ L1ETHGateway,
+ ctc,
+ l1Messenger,
+ l1MessengerAddress,
+ L2ETHGateway,
+ l2Messenger,
+
+ watcher,
+ fastWatcher,
+
+ bobl1Wallet,
+ bobl2Wallet,
+
+ l1Provider,
+ l2Provider
+ })
+ }
+
+ async waitForXDomainTransaction(
+ tx: Promise | TransactionResponse,
+ direction: Direction,
+ ): Promise {
+ return waitForXDomainTransaction(this.watcher, tx, direction)
+ }
+
+ async waitForXFastDomainTransaction(
+ tx: Promise | TransactionResponse,
+ direction: Direction
+ ): Promise {
+ return waitForXDomainTransaction(this.fastWatcher, tx, direction)
+ }
+
+ async waitForRevertXDomainTransaction(
+ tx: Promise | TransactionResponse,
+ direction: Direction
+ ) {
+ const {remoteReceipt} = await waitForXDomainTransaction(this.watcher, tx, direction)
+ const [xDomainMsgHash] = await this.watcher.getMessageHashesFromL1Tx(remoteReceipt.transactionHash)
+ await this.watcher.getL2TransactionReceipt(xDomainMsgHash)
+ }
+
+ async waitForRevertXFastDomainTransaction(
+ tx: Promise | TransactionResponse,
+ direction: Direction
+ ) {
+ const {remoteReceipt} = await waitForXDomainTransaction(this.fastWatcher, tx, direction)
+ const [xDomainMsgHash] = await this.watcher.getMessageHashesFromL1Tx(remoteReceipt.transactionHash)
+ await this.watcher.getL2TransactionReceipt(xDomainMsgHash)
+ }
+}
diff --git a/ops_omgx/test/test/shared/utils.ts b/ops_omgx/test/test/shared/utils.ts
new file mode 100644
index 000000000000..ce95793ee676
--- /dev/null
+++ b/ops_omgx/test/test/shared/utils.ts
@@ -0,0 +1,59 @@
+import { injectL2Context } from '@eth-optimism/core-utils'
+import { getContractInterface, getContractFactory } from '@eth-optimism/contracts'
+import {
+ Contract,
+ Wallet,
+ constants,
+ providers,
+ BigNumber,
+} from 'ethers'
+require('dotenv').config()
+
+export const GWEI = BigNumber.from(0)
+
+// The hardhat instance
+export const l1Provider = new providers.JsonRpcProvider(process.env.L1_NODE_WEB3_URL)
+export const l2Provider = new providers.JsonRpcProvider(process.env.L2_NODE_WEB3_URL)
+
+// An account for testing which is funded on L1
+export const bobl1Wallet = new Wallet(process.env.TEST_PRIVATE_KEY_1,l1Provider)
+export const bobl2Wallet = bobl1Wallet.connect(l2Provider)
+
+// Predeploys
+export const PROXY_SEQUENCER_ENTRYPOINT_ADDRESS = '0x4200000000000000000000000000000000000004'
+export const OVM_ETH_ADDRESS = '0x4200000000000000000000000000000000000006'
+export const Proxy__OVM_L2CrossDomainMessenger = '0x4200000000000000000000000000000000000007'
+export const addressManagerAddress = process.env.ETH1_ADDRESS_RESOLVER_ADDRESS
+
+export const getAddressManager = (provider: any) => {
+ return getContractFactory('Lib_AddressManager')
+ .connect(provider)
+ .attach(addressManagerAddress) as any
+}
+
+// Gets the gateway using the proxy if available
+export const getL1ETHGateway = async (wallet: Wallet, AddressManager: Contract) => {
+
+ const l1GatewayInterface = getContractInterface('OVM_L1ETHGateway')
+ const ProxyGatewayAddress = await AddressManager.getAddress('Proxy__OVM_L1ETHGateway')
+
+ const L1ETHGateway = new Contract(
+ ProxyGatewayAddress,
+ l1GatewayInterface as any,
+ wallet
+ )
+
+ return L1ETHGateway
+}
+
+export const getL2ETHGateway = (wallet: Wallet) => {
+ const OVM_ETH = new Contract(
+ OVM_ETH_ADDRESS,
+ getContractInterface('OVM_ETH') as any,
+ wallet
+ )
+ return OVM_ETH
+}
+
+
+export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))
diff --git a/ops_omgx/test/test/shared/watcher-utils.ts b/ops_omgx/test/test/shared/watcher-utils.ts
new file mode 100644
index 000000000000..7d6f047df3a4
--- /dev/null
+++ b/ops_omgx/test/test/shared/watcher-utils.ts
@@ -0,0 +1,100 @@
+import {
+ JsonRpcProvider,
+ TransactionReceipt,
+ TransactionResponse,
+} from '@ethersproject/providers'
+import { Watcher } from './watcher'
+import { Contract, Transaction } from 'ethers'
+
+export const initWatcher = async (
+ l1Provider: JsonRpcProvider,
+ l2Provider: JsonRpcProvider,
+ AddressManager: Contract
+) => {
+
+ const l1MessengerAddress = await AddressManager.getAddress('Proxy__OVM_L1CrossDomainMessenger')
+ console.log("l1MessengerAddress:",l1MessengerAddress)
+
+ return new Watcher({
+ l1: {
+ provider: l1Provider,
+ messengerAddress: l1MessengerAddress
+ },
+ l2: {
+ provider: l2Provider,
+ messengerAddress: "0x4200000000000000000000000000000000000007"
+ },
+ })
+}
+
+
+export const initFastWatcher = async (
+ l1Provider: JsonRpcProvider,
+ l2Provider: JsonRpcProvider,
+ AddressManager: Contract,
+) => {
+
+ const l1MessengerAddress = await AddressManager.getAddress('Proxy__OVM_L1CrossDomainMessengerFast')
+ console.log("l1FastMessengerAddress:",l1MessengerAddress)
+
+ return new Watcher({
+ l1: {
+ provider: l1Provider,
+ messengerAddress: l1MessengerAddress,
+ },
+ l2: {
+ provider: l2Provider,
+ messengerAddress: "0x4200000000000000000000000000000000000007",
+ },
+ })
+}
+
+export interface CrossDomainMessagePair {
+ tx: Transaction
+ receipt: TransactionReceipt
+ remoteReceipt: TransactionReceipt
+}
+
+export enum Direction {
+ L1ToL2,
+ L2ToL1,
+}
+
+export const waitForXDomainTransaction = async (
+ watcher: Watcher,
+ tx: Promise | TransactionResponse,
+ direction: Direction,
+): Promise => {
+
+ // await it if needed
+ tx = await tx
+
+ // get the receipt and the full transaction
+ const receipt = await tx.wait()
+
+ let remoteReceipt: TransactionReceipt
+
+ console.log(' Preparing to wait for Message Hashes')
+
+ if (direction === Direction.L1ToL2) {
+ // DEPOSIT
+ console.log(' Looking for L1 to L2')
+ const [xDomainMsgHash] = await watcher.getMessageHashesFromL1Tx(tx.hash)
+ console.log(' Got L1->L2 message hash', xDomainMsgHash)
+ remoteReceipt = await watcher.getL2TransactionReceipt(xDomainMsgHash)
+ console.log(' Completed Deposit - L2 tx hash:', remoteReceipt.transactionHash)
+ } else {
+ // WITHDRAWAL
+ console.log(' Looking for L2 to L1')
+ const [xDomainMsgHash] = await watcher.getMessageHashesFromL2Tx(tx.hash)
+ console.log(' Got L2->L1 message hash', xDomainMsgHash)
+ remoteReceipt = await watcher.getL1TransactionReceipt(xDomainMsgHash)
+ console.log(' Completed Withdrawal - L1 tx hash:', remoteReceipt.transactionHash)
+ }
+
+ return {
+ tx,
+ receipt,
+ remoteReceipt,
+ }
+}
diff --git a/ops_omgx/test/test/shared/watcher.ts b/ops_omgx/test/test/shared/watcher.ts
new file mode 100644
index 000000000000..27b2a318b69f
--- /dev/null
+++ b/ops_omgx/test/test/shared/watcher.ts
@@ -0,0 +1,142 @@
+/* External Imports */
+import { ethers } from 'ethers'
+import { Provider, TransactionReceipt } from '@ethersproject/abstract-provider'
+
+export interface Layer {
+ provider: Provider
+ messengerAddress: string
+}
+
+export interface WatcherOptions {
+ l1: Layer
+ l2: Layer
+}
+
+export class Watcher {
+
+ public NUM_BLOCKS_TO_FETCH: number = 10000
+
+ public l1: Layer
+ public l2: Layer
+
+ constructor(opts: WatcherOptions) {
+ this.l1 = opts.l1
+ this.l2 = opts.l2
+ }
+
+ public async getMessageHashesFromL1Tx(l1TxHash: string): Promise {
+ return this.getMessageHashesFromTx(this.l1, l1TxHash)
+ }
+
+ public async getMessageHashesFromL2Tx(l2TxHash: string): Promise {
+ return this.getMessageHashesFromTx(this.l2, l2TxHash)
+ }
+
+ public async getL1TransactionReceipt(
+ l2ToL1MsgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ console.log(' Calling getL1TransactionReceipt')
+ return this.getTransactionReceipt(this.l1, l2ToL1MsgHash, pollForPending)
+ }
+
+ public async getL2TransactionReceipt(
+ l1ToL2MsgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+ console.log(' Calling getL2TransactionReceipt')
+ return this.getTransactionReceipt(this.l2, l1ToL2MsgHash, pollForPending)
+ }
+
+ public async getMessageHashesFromTx(
+ layer: Layer,
+ txHash: string
+ ): Promise {
+
+ const receipt = await layer.provider.getTransactionReceipt(txHash)
+
+ if (!receipt) {
+ return []
+ }
+
+ const msgHashes = []
+
+ for (const log of receipt.logs) {
+ if (
+ log.address === layer.messengerAddress &&
+ log.topics[0] === ethers.utils.id('SentMessage(bytes)')
+ ) {
+ const [message] = ethers.utils.defaultAbiCoder.decode(
+ ['bytes'],
+ log.data
+ )
+ msgHashes.push(ethers.utils.solidityKeccak256(['bytes'], [message]))
+ }
+ }
+ return msgHashes
+ }
+
+ public async getTransactionReceipt(
+ layer: Layer,
+ msgHash: string,
+ pollForPending: boolean = true
+ ): Promise {
+
+ console.log(" Watcher::getTransactionReceipt")
+
+ const blockNumber = await layer.provider.getBlockNumber()
+ const startingBlock = Math.max(blockNumber - this.NUM_BLOCKS_TO_FETCH, 0)
+
+
+ // console.log("Layer:", layer)
+
+ // console.log("Address:", layer.messengerAddress)
+ // console.log("topic:", ethers.utils.id(`RelayedMessage(bytes32)`))
+ // console.log("fromBlock:", startingBlock)
+
+ const filter = {
+ address: layer.messengerAddress,
+ topics: [ethers.utils.id(`RelayedMessage(bytes32)`)],
+ fromBlock: startingBlock,
+ }
+
+ const logs = await layer.provider.getLogs(filter)
+ // console.log("Looking for:", msgHash)
+ // console.log("Current logs:", logs)
+
+ const matches = logs.filter((log: any) => log.data === msgHash)
+
+ // Message was relayed in the past
+ if (matches.length > 0) {
+ if (matches.length > 1) {
+ throw Error(
+ ' Found multiple transactions relaying the same message hash.'
+ )
+ }
+ return layer.provider.getTransactionReceipt(matches[0].transactionHash)
+ }
+
+ if (!pollForPending) {
+ return Promise.resolve(undefined)
+ }
+
+ // Message has yet to be relayed, poll until it is found
+ return new Promise(async (resolve, reject) => {
+ console.log(" Watcher polling::layer.provider.getTransactionReceipt pre filter")
+ //listener that triggers on filter event
+ layer.provider.on(filter, async (log: any) => {
+ console.log(" Watcher polling::layer.provider.getTransactionReceipt post filter")
+ //console.log(log)
+ if (log.data === msgHash) {
+ try {
+ const txReceipt = await layer.provider.getTransactionReceipt(log.transactionHash)
+ layer.provider.off(filter)
+ resolve(txReceipt)
+ } catch (e) {
+ reject(e)
+ }
+ }
+ })
+ })
+ }
+}
diff --git a/ops_omgx/test/tsconfig.json b/ops_omgx/test/tsconfig.json
new file mode 100644
index 000000000000..65c3bc2f5230
--- /dev/null
+++ b/ops_omgx/test/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./dist",
+ "resolveJsonModule": true
+ },
+ "include": ["./test"],
+ "files": ["./hardhat.config.ts"]
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index cc516cd0f7e7..01d8be0e909a 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,40 @@
{
"name": "optimism",
"version": "1.0.0",
+ "author": "Optimism PBC",
"license": "MIT",
- "workspaces": [
- "packages/*",
- "l2geth",
- "integration-tests",
- "specs",
- "examples/*"
- ],
+ "workspaces": {
+ "packages": [
+ "packages/*",
+ "packages/omgx/*",
+ "l2geth",
+ "integration-tests",
+ "specs",
+ "go/gas-oracle"
+ ],
+ "nohoist": [
+ "examples/*"
+ ]
+ },
"private": true,
"devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.26.0",
+ "@typescript-eslint/parser": "^4.26.0",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.27.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-ban": "^1.5.2",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-jsdoc": "^35.1.2",
+ "eslint-plugin-prefer-arrow": "^1.2.3",
+ "eslint-plugin-prettier": "^3.4.0",
+ "eslint-plugin-react": "^7.24.0",
+ "eslint-plugin-unicorn": "^32.0.1",
+ "husky": "^6.0.0",
"lerna": "^4.0.0",
- "patch-package": "^6.4.7"
+ "patch-package": "^6.4.7",
+ "prettier": "^2.3.1",
+ "typescript": "^4.2.3"
},
"scripts": {
"clean": "yarn lerna run clean",
@@ -23,6 +45,8 @@
"lint:check": "yarn lerna run lint:check",
"lint:fix": "yarn lerna run lint:fix",
"postinstall": "patch-package",
+ "ready": "yarn lint && yarn test",
+ "prepare": "husky install",
"release": "yarn build && yarn changeset publish"
},
"dependencies": {
diff --git a/packages/batch-submitter/.env.example b/packages/batch-submitter/.env.example
index 54576ac4f2fe..ce288c97267a 100644
--- a/packages/batch-submitter/.env.example
+++ b/packages/batch-submitter/.env.example
@@ -4,9 +4,13 @@ NODE_ENV=development
ETH_NETWORK_NAME=
# Logging & monitoring
DEBUG=info*,error*,warn*,debug*
+RUN_METRICS_SERVER=
+METRICS_PORT=
+METRICS_HOSTNAME=
# Leave the SENTRY_DSN variable unset during local development
SENTRY_DSN=
SENTRY_TRACE_RATE=
+USE_SENTRY=
L1_NODE_WEB3_URL=http://localhost:9545
L2_NODE_WEB3_URL=http://localhost:8545
@@ -27,6 +31,10 @@ SAFE_MINIMUM_ETHER_BALANCE=0
CLEAR_PENDING_TXS=false
ADDRESS_MANAGER_ADDRESS=
+USE_HARDHAT=
+DEBUG_IMPERSONATE_SEQUENCER_ADDRESS=
+DEBUG_IMPERSONATE_PROPOSER_ADDRESS=
+
# Optional gas settings
MAX_GAS_PRICE_IN_GWEI=200
GAS_RETRY_INCREMENT=5
diff --git a/packages/batch-submitter/.eslintrc.js b/packages/batch-submitter/.eslintrc.js
new file mode 100644
index 000000000000..bfd2057be80b
--- /dev/null
+++ b/packages/batch-submitter/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: '../../.eslintrc.js',
+}
diff --git a/packages/batch-submitter/.lintstagedrc.yml b/packages/batch-submitter/.lintstagedrc.yml
new file mode 100644
index 000000000000..a3035a2299b2
--- /dev/null
+++ b/packages/batch-submitter/.lintstagedrc.yml
@@ -0,0 +1,2 @@
+"*.{ts,js}":
+ - eslint
diff --git a/packages/batch-submitter/.prettierrc.js b/packages/batch-submitter/.prettierrc.js
new file mode 100644
index 000000000000..6b3fa8e2ce23
--- /dev/null
+++ b/packages/batch-submitter/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ ...require('../../.prettierrc.js'),
+};
\ No newline at end of file
diff --git a/packages/batch-submitter/CHANGELOG.md b/packages/batch-submitter/CHANGELOG.md
index c29aece5dcf7..335bcc1b864a 100644
--- a/packages/batch-submitter/CHANGELOG.md
+++ b/packages/batch-submitter/CHANGELOG.md
@@ -1,5 +1,130 @@
# Changelog
+## 0.3.7
+
+### Patch Changes
+
+- 8a1e63dd: Prevent batch submitter from submitting batches if low on ETH
+- Updated dependencies [0313794b]
+- Updated dependencies [049200f4]
+- Updated dependencies [21e47e1f]
+ - @eth-optimism/contracts@0.4.2
+ - @eth-optimism/core-utils@0.5.0
+
+## 0.3.6
+
+### Patch Changes
+
+- f87a2d00: Use dashes instead of colons in contract names
+- 52d02b14: Add failure metrics to batch submitter
+- 31f517a2: Improved logging of batch submission timeout logs
+- 5c89c45f: Move the metric prefix string to a label #1047
+- Updated dependencies [25f09abd]
+- Updated dependencies [dd8edc7b]
+- Updated dependencies [c87e4c74]
+- Updated dependencies [db0dbfb2]
+- Updated dependencies [7f5936a8]
+- Updated dependencies [f87a2d00]
+- Updated dependencies [85da4979]
+- Updated dependencies [57ca21a2]
+- Updated dependencies [5fc728da]
+- Updated dependencies [2e72fd90]
+- Updated dependencies [c43b33ec]
+- Updated dependencies [26bc63ad]
+- Updated dependencies [a0d9e565]
+- Updated dependencies [2bd49730]
+- Updated dependencies [38355a3b]
+- Updated dependencies [3c2c32e1]
+- Updated dependencies [d9644c34]
+- Updated dependencies [48ece14c]
+- Updated dependencies [e04de624]
+- Updated dependencies [014dea71]
+- Updated dependencies [fa29b03e]
+- Updated dependencies [6b46c8ba]
+- Updated dependencies [e045f582]
+- Updated dependencies [5c89c45f]
+- Updated dependencies [df5ff890]
+- Updated dependencies [e29fab10]
+- Updated dependencies [c2a04893]
+- Updated dependencies [baacda34]
+ - @eth-optimism/contracts@0.4.0
+ - @eth-optimism/core-utils@0.4.6
+ - @eth-optimism/common-ts@0.1.4
+
+## 0.3.5
+
+### Patch Changes
+
+- 7cce55a9: Add status to generic error log to disambiguate errors
+
+## 0.3.4
+
+### Patch Changes
+
+- baa3b761: Improve Sentry support, initializing as needed and ensuring ERROR logs route to Sentry
+- cc742715: Fix typo in USE_HARDHAT config
+- 98b7839f: Change monotonicity band-aid code to log warnings not errors
+- c520100d: Fix a bug in fixMonotonicity auto healer
+- 85362d44: Log additional data in monotonicity violation
+- Updated dependencies [baa3b761]
+ - @eth-optimism/common-ts@0.1.3
+
+## 0.3.3
+
+### Patch Changes
+
+- 750a5021: Remove dead imports from core-utils
+- Updated dependencies [a64f8161]
+- Updated dependencies [4e03f8a9]
+- Updated dependencies [8e2bfd07]
+- Updated dependencies [750a5021]
+- Updated dependencies [c2b6e14b]
+- Updated dependencies [245136f1]
+ - @eth-optimism/core-utils@0.4.5
+ - @eth-optimism/contracts@0.3.5
+
+## 0.3.2
+
+### Patch Changes
+
+- 4340bb1: Fix: correctly read Batch Submitter env var defaults
+
+## 0.3.1
+
+### Patch Changes
+
+- c79dc8b: Add impersonate account debug config.
+- 0c16805: add metrics server to common-ts and batch submitter
+- fa4898a: Explicitly log error messages so that they do not show as empty objects
+- 96a586e: Updates the configuration to use bcfg in a backwards compatible way
+- c79dc8b: Make BLOCK_OFFSET configurable.
+- Updated dependencies [96a586e]
+- Updated dependencies [0c16805]
+- Updated dependencies [775118a]
+ - @eth-optimism/core-utils@0.4.3
+ - @eth-optimism/common-ts@0.1.2
+ - @eth-optimism/contracts@0.3.1
+
+## 0.3.0
+
+### Minor Changes
+
+- b799caa: Updates to use RLP encoded transactions in batches for the `v0.3.0` release
+
+### Patch Changes
+
+- 751e2be: Add the support for different sequencer & proposer keys in the batch submitter.
+- Updated dependencies [b799caa]
+- Updated dependencies [6132e7a]
+- Updated dependencies [b799caa]
+- Updated dependencies [b799caa]
+- Updated dependencies [b799caa]
+- Updated dependencies [20747fd]
+- Updated dependencies [b799caa]
+- Updated dependencies [b799caa]
+ - @eth-optimism/contracts@0.3.0
+ - @eth-optimism/core-utils@0.4.2
+
## 0.2.5
### Patch Changes
diff --git a/packages/batch-submitter/LICENSE b/packages/batch-submitter/LICENSE
new file mode 100644
index 000000000000..6a7da5218bb2
--- /dev/null
+++ b/packages/batch-submitter/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright 2020-2021 Optimism
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/batch-submitter/README.md b/packages/batch-submitter/README.md
index 900b3b70f65d..0868486a64ae 100644
--- a/packages/batch-submitter/README.md
+++ b/packages/batch-submitter/README.md
@@ -38,3 +38,7 @@ You may test a submission locally against a local Hardhat fork.
3. Also check `L2_NODE_WEB3_URL` is correctly set and has transactions to submit.
3. Run `yarn build` to build your changes.
4. Start Batch Submitter with `yarn start`. It will automatically start submitting pending transactions from L2.
+
+## Observability in production
+
+When deploying Batch Submitter to production / a live ETH network, populate the environment variables `NODE_ENV` (`development`, `production`, or `test`) and `ETH_NETWORK_NAME` (`mainnet`, `kovan`, `goerli`). This enables Batch Submitter to capture more context in logs and metrics, and initializes [Sentry](https://docs.sentry.io/platforms/node/) to track errors.
diff --git a/packages/batch-submitter/exec/run-batch-submitter.js b/packages/batch-submitter/exec/run-batch-submitter.js
index 1f0af7c5af03..4241cf3e5aee 100755
--- a/packages/batch-submitter/exec/run-batch-submitter.js
+++ b/packages/batch-submitter/exec/run-batch-submitter.js
@@ -1,5 +1,5 @@
#!/usr/bin/env node
-const batchSubmitter = require("../dist/src/exec/run-batch-submitter")
+const batchSubmitter = require('../dist/src/exec/run-batch-submitter')
batchSubmitter.run()
diff --git a/packages/batch-submitter/hardhat.config.ts b/packages/batch-submitter/hardhat.config.ts
index bb9ac2acb565..312900b1bd03 100644
--- a/packages/batch-submitter/hardhat.config.ts
+++ b/packages/batch-submitter/hardhat.config.ts
@@ -6,6 +6,8 @@ import {
RUN_OVM_TEST_GAS,
} from './test/helpers/constants'
+import '@nomiclabs/hardhat-ethers'
+
const config: HardhatUserConfig = {
networks: {
hardhat: {
diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json
index 3cabbeec7d34..b69adf790cf1 100644
--- a/packages/batch-submitter/package.json
+++ b/packages/batch-submitter/package.json
@@ -1,6 +1,6 @@
{
"name": "@eth-optimism/batch-submitter",
- "version": "0.2.5",
+ "version": "0.3.7",
"private": true,
"description": "[Optimism] Batch submission for sequencer & aggregators",
"main": "dist/index",
@@ -13,8 +13,9 @@
"build": "tsc -p ./tsconfig.build.json",
"clean": "rimraf cache/ dist/ ./tsconfig.build.tsbuildinfo",
"lint": "yarn lint:fix && yarn lint:check",
- "lint:fix": "prettier --config .prettierrc.json --write \"hardhat.config.ts\" \"{src,exec,test}/**/*.ts\"",
- "lint:check": "tslint --format stylish --project .",
+ "pre-commit": "lint-staged",
+ "lint:fix": "yarn lint:check --fix",
+ "lint:check": "eslint .",
"test": "hardhat test --show-stack-traces"
},
"keywords": [
@@ -25,18 +26,20 @@
],
"homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/batch-submitter#readme",
"license": "MIT",
- "author": "Optimism",
+ "author": "Optimism PBC",
"repository": {
"type": "git",
"url": "https://github.com/ethereum-optimism/optimism-monorepo.git"
},
"dependencies": {
- "@eth-optimism/common-ts": "^0.1.1",
- "@eth-optimism/contracts": "^0.2.10",
- "@eth-optimism/core-utils": "^0.4.1",
+ "@eth-optimism/common-ts": "^0.1.4",
+ "@eth-optimism/contracts": "^0.4.2",
+ "@eth-optimism/core-utils": "^0.5.0",
"@eth-optimism/ynatm": "^0.2.2",
"@ethersproject/abstract-provider": "^5.0.5",
"@ethersproject/providers": "^5.0.14",
+ "@sentry/node": "^6.2.5",
+ "bcfg": "^0.1.6",
"bluebird": "^3.7.2",
"dotenv": "^8.2.0",
"ethers": "5.0.0",
@@ -44,7 +47,7 @@
"prom-client": "^13.1.0"
},
"devDependencies": {
- "@eth-optimism/smock": "^1.1.3",
+ "@eth-optimism/smock": "^1.1.7",
"@nomiclabs/hardhat-ethers": "^2.0.2",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@types/bluebird": "^3.5.34",
@@ -55,19 +58,28 @@
"@types/rimraf": "^3.0.0",
"@types/sinon": "^9.0.10",
"@types/sinon-chai": "^3.2.5",
+ "@typescript-eslint/eslint-plugin": "^4.26.0",
+ "@typescript-eslint/parser": "^4.26.0",
"chai": "^4.2.0",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.27.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-ban": "^1.5.2",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-jsdoc": "^35.1.2",
+ "eslint-plugin-prefer-arrow": "^1.2.3",
+ "eslint-plugin-react": "^7.24.0",
+ "eslint-plugin-unicorn": "^32.0.1",
"ethereum-waffle": "3.0.0",
"ganache-core": "^2.13.2",
"hardhat": "^2.2.1",
"mocha": "^6.1.4",
"prettier": "^2.2.1",
+ "lint-staged": "11.0.0",
"rimraf": "^2.6.3",
"sinon": "^9.2.4",
"sinon-chai": "^3.5.0",
- "tslint": "^6.1.3",
- "tslint-config-prettier": "^1.18.0",
- "tslint-no-focused-test": "^0.5.0",
- "tslint-plugin-prettier": "^2.3.0",
"typescript": "^4.2.3"
},
"resolutions": {
diff --git a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts
index 24097af75e0c..0aa4820075c7 100644
--- a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts
+++ b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts
@@ -1,13 +1,13 @@
/* External Imports */
import { Contract, Signer, utils, providers } from 'ethers'
import { TransactionReceipt } from '@ethersproject/abstract-provider'
-import { Gauge, Histogram } from 'prom-client'
+import { Gauge, Histogram, Counter } from 'prom-client'
import * as ynatm from '@eth-optimism/ynatm'
-import { RollupInfo } from '@eth-optimism/core-utils'
+import { RollupInfo, sleep } from '@eth-optimism/core-utils'
import { Logger, Metrics } from '@eth-optimism/common-ts'
import { getContractFactory } from 'old-contracts'
-export interface Range {
+export interface BlockRange {
start: number
end: number
}
@@ -24,6 +24,9 @@ interface BatchSubmitterMetrics {
numTxPerBatch: Histogram
submissionTimestamp: Histogram
submissionGasUsed: Histogram
+ batchesSubmitted: Counter
+ failedSubmissions: Counter
+ malformedBatches: Counter
}
export abstract class BatchSubmitter {
@@ -50,6 +53,7 @@ export abstract class BatchSubmitter {
readonly maxGasPriceInGwei: number,
readonly gasRetryIncrement: number,
readonly gasThresholdInGwei: number,
+ readonly blockOffset: number,
readonly logger: Logger,
readonly defaultMetrics: Metrics
) {
@@ -61,7 +65,7 @@ export abstract class BatchSubmitter {
endBlock: number
): Promise
public abstract _onSync(): Promise
- public abstract _getBatchStartAndEnd(): Promise
+ public abstract _getBatchStartAndEnd(): Promise
public abstract _updateChainInfo(): Promise
public async submitNextBatch(): Promise {
@@ -69,7 +73,11 @@ export abstract class BatchSubmitter {
this.l2ChainId = await this._getL2ChainId()
}
await this._updateChainInfo()
- await this._checkBalance()
+
+ if (!(await this._hasEnoughETHToCoverGasCosts())) {
+ await sleep(this.resubmissionTimeout)
+ return
+ }
this.logger.info('Readying to submit next batch...', {
l2ChainId: this.l2ChainId,
@@ -90,7 +98,7 @@ export abstract class BatchSubmitter {
return this._submitBatch(range.start, range.end)
}
- protected async _checkBalance(): Promise {
+ protected async _hasEnoughETHToCoverGasCosts(): Promise {
const address = await this.signer.getAddress()
const balance = await this.signer.getBalance()
const ether = utils.formatEther(balance)
@@ -100,6 +108,7 @@ export abstract class BatchSubmitter {
address,
ether,
})
+
this.metrics.batchSubmitterETHBalance.set(num)
if (num < this.minBalanceEther) {
@@ -107,7 +116,10 @@ export abstract class BatchSubmitter {
current: num,
safeBalance: this.minBalanceEther,
})
+ return false
}
+
+ return true
}
protected async _getRollupInfo(): Promise {
@@ -139,15 +151,16 @@ export abstract class BatchSubmitter {
protected _shouldSubmitBatch(batchSizeInBytes: number): boolean {
const currentTimestamp = Date.now()
- const isTimeoutReached =
- this.lastBatchSubmissionTimestamp + this.maxBatchSubmissionTime <=
- currentTimestamp
if (batchSizeInBytes < this.minTxSize) {
- if (!isTimeoutReached) {
+ const timeSinceLastSubmission =
+ currentTimestamp - this.lastBatchSubmissionTimestamp
+ if (timeSinceLastSubmission < this.maxBatchSubmissionTime) {
this.logger.info(
'Skipping batch submission. Batch too small & max submission timeout not reached.',
{
batchSizeInBytes,
+ timeSinceLastSubmission,
+ maxBatchSubmissionTime: this.maxBatchSubmissionTime,
minTxSize: this.minTxSize,
lastBatchSubmissionTimestamp: this.lastBatchSubmissionTimestamp,
currentTimestamp,
@@ -157,6 +170,8 @@ export abstract class BatchSubmitter {
}
this.logger.info('Timeout reached, proceeding with batch submission.', {
batchSizeInBytes,
+ timeSinceLastSubmission,
+ maxBatchSubmissionTime: this.maxBatchSubmissionTime,
lastBatchSubmissionTimestamp: this.lastBatchSubmissionTimestamp,
currentTimestamp,
})
@@ -231,15 +246,38 @@ export abstract class BatchSubmitter {
gasRetryIncrement: this.gasRetryIncrement,
}
- const receipt = await BatchSubmitter.getReceiptWithResubmission(
- txFunc,
- resubmissionConfig,
- this.logger
- )
+ let receipt: TransactionReceipt
+ try {
+ receipt = await BatchSubmitter.getReceiptWithResubmission(
+ txFunc,
+ resubmissionConfig,
+ this.logger
+ )
+ } catch (err) {
+ this.metrics.failedSubmissions.inc()
+ if (err.reason) {
+ this.logger.error(`Transaction invalid: ${err.reason}, aborting`, {
+ message: err.toString(),
+ stack: err.stack,
+ code: err.code,
+ })
+ return
+ }
+
+ this.logger.error('Encountered error at submission, aborting', {
+ message: err.toString(),
+ stack: err.stack,
+ code: err.code,
+ })
+ return
+ }
this.logger.info('Received transaction receipt', { receipt })
this.logger.info(successMessage)
- this.metrics.submissionGasUsed.observe(receipt.gasUsed.toNumber())
+ this.metrics.batchesSubmitted.inc()
+ this.metrics.submissionGasUsed.observe(
+ receipt ? receipt.gasUsed.toNumber() : 0
+ )
this.metrics.submissionTimestamp.observe(Date.now())
return receipt
}
@@ -273,6 +311,21 @@ export abstract class BatchSubmitter {
help: 'Gas used to submit each batch',
registers: [metrics.registry],
}),
+ batchesSubmitted: new metrics.client.Counter({
+ name: 'batches_submitted',
+ help: 'Count of batches submitted',
+ registers: [metrics.registry],
+ }),
+ failedSubmissions: new metrics.client.Counter({
+ name: 'failed_submissions',
+ help: 'Count of failed batch submissions',
+ registers: [metrics.registry],
+ }),
+ malformedBatches: new metrics.client.Counter({
+ name: 'malformed_batches',
+ help: 'Count of malformed batches',
+ registers: [metrics.registry],
+ }),
}
}
}
diff --git a/packages/batch-submitter/src/batch-submitter/index.ts b/packages/batch-submitter/src/batch-submitter/index.ts
index 3e66fa8b8c3e..0b96dc9a09d3 100644
--- a/packages/batch-submitter/src/batch-submitter/index.ts
+++ b/packages/batch-submitter/src/batch-submitter/index.ts
@@ -4,7 +4,3 @@ export * from './state-batch-submitter'
export const TX_BATCH_SUBMITTER_LOG_TAG = 'oe:batch_submitter:tx_chain'
export const STATE_BATCH_SUBMITTER_LOG_TAG = 'oe:batch_submitter:state_chain'
-
-// BLOCK_OFFSET is the number of L2 blocks we need to skip for the
-// batch submitter.
-export const BLOCK_OFFSET = 1 // TODO: Update testnet / mainnet to make this zero.
diff --git a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts
index c1b3fbdaa9d9..046231d99a9b 100644
--- a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts
+++ b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts
@@ -12,7 +12,7 @@ import {
import { Logger, Metrics } from '@eth-optimism/common-ts'
/* Internal Imports */
-import { Range, BatchSubmitter, BLOCK_OFFSET } from '.'
+import { BlockRange, BatchSubmitter } from '.'
export class StateBatchSubmitter extends BatchSubmitter {
// TODO: Change this so that we calculate start = scc.totalElements() and end = ctc.totalElements()!
@@ -40,6 +40,7 @@ export class StateBatchSubmitter extends BatchSubmitter {
maxGasPriceInGwei: number,
gasRetryIncrement: number,
gasThresholdInGwei: number,
+ blockOffset: number,
logger: Logger,
metrics: Metrics,
fraudSubmissionAddress: string
@@ -60,6 +61,7 @@ export class StateBatchSubmitter extends BatchSubmitter {
maxGasPriceInGwei,
gasRetryIncrement,
gasThresholdInGwei,
+ blockOffset,
logger,
metrics
)
@@ -114,18 +116,18 @@ export class StateBatchSubmitter extends BatchSubmitter {
return
}
- public async _getBatchStartAndEnd(): Promise {
+ public async _getBatchStartAndEnd(): Promise {
this.logger.info('Getting batch start and end for state batch submitter...')
- // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis
const startBlock: number =
- (await this.chainContract.getTotalElements()).toNumber() + BLOCK_OFFSET
+ (await this.chainContract.getTotalElements()).toNumber() +
+ this.blockOffset
this.logger.info('Retrieved start block number from SCC', {
startBlock,
})
// We will submit state roots for txs which have been in the tx chain for a while.
const totalElements: number =
- (await this.ctcContract.getTotalElements()).toNumber() + BLOCK_OFFSET
+ (await this.ctcContract.getTotalElements()).toNumber() + this.blockOffset
this.logger.info('Retrieved total elements from CTC', {
totalElements,
})
@@ -171,20 +173,23 @@ export class StateBatchSubmitter extends BatchSubmitter {
return
}
- const offsetStartsAtIndex = startBlock - BLOCK_OFFSET // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis
+ const offsetStartsAtIndex = startBlock - this.blockOffset
this.logger.debug('Submitting batch.', { tx })
const nonce = await this.signer.getTransactionCount()
const contractFunction = async (gasPrice): Promise => {
+ this.logger.info('Submitting appendStateBatch transaction', {
+ gasPrice,
+ nonce,
+ contractAddr: this.chainContract.address,
+ })
const contractTx = await this.chainContract.appendStateBatch(
batch,
offsetStartsAtIndex,
{ nonce, gasPrice }
)
this.logger.info('Submitted appendStateBatch transaction', {
- nonce,
txHash: contractTx.hash,
- contractAddr: this.chainContract.address,
from: contractTx.from,
})
this.logger.debug('appendStateBatch transaction data', {
diff --git a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts
index d33b9e4be694..611524cbdab8 100644
--- a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts
+++ b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts
@@ -21,7 +21,7 @@ import {
AppendSequencerBatchParams,
} from '../transaction-chain-contract'
-import { Range, BatchSubmitter, BLOCK_OFFSET } from '.'
+import { BlockRange, BatchSubmitter } from '.'
export interface AutoFixBatchOptions {
fixDoublePlayedDeposits: boolean
@@ -51,6 +51,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
maxGasPriceInGwei: number,
gasRetryIncrement: number,
gasThresholdInGwei: number,
+ blockOffset: number,
logger: Logger,
metrics: Metrics,
disableQueueBatchAppend: boolean,
@@ -76,6 +77,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
maxGasPriceInGwei,
gasRetryIncrement,
gasThresholdInGwei,
+ blockOffset,
logger,
metrics
)
@@ -125,7 +127,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
}
public async _onSync(): Promise {
- const pendingQueueElements = await this.chainContract.getNumPendingQueueElements()
+ const pendingQueueElements =
+ await this.chainContract.getNumPendingQueueElements()
this.logger.debug('Got number of pending queue elements', {
pendingQueueElements,
})
@@ -141,14 +144,17 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
const contractFunction = async (
gasPrice
): Promise => {
+ this.logger.info('Submitting appendQueueBatch transaction', {
+ gasPrice,
+ nonce,
+ contractAddr: this.chainContract.address,
+ })
const tx = await this.chainContract.appendQueueBatch(99999999, {
nonce,
gasPrice,
})
this.logger.info('Submitted appendQueueBatch transaction', {
- nonce,
txHash: tx.hash,
- contractAddr: this.chainContract.address,
from: tx.from,
})
this.logger.debug('appendQueueBatch transaction data', {
@@ -168,13 +174,13 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
return
}
- public async _getBatchStartAndEnd(): Promise {
+ public async _getBatchStartAndEnd(): Promise {
this.logger.info(
'Getting batch start and end for transaction batch submitter...'
)
- // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis
const startBlock =
- (await this.chainContract.getTotalElements()).toNumber() + BLOCK_OFFSET
+ (await this.chainContract.getTotalElements()).toNumber() +
+ this.blockOffset
this.logger.info('Retrieved start block number from CTC', {
startBlock,
})
@@ -223,10 +229,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
return
}
- const [
- batchParams,
- wasBatchTruncated,
- ] = await this._generateSequencerBatchParams(startBlock, endBlock)
+ const [batchParams, wasBatchTruncated] =
+ await this._generateSequencerBatchParams(startBlock, endBlock)
const batchSizeInBytes = encodeAppendSequencerBatch(batchParams).length / 2
this.logger.debug('Sequencer batch generated', {
batchSizeInBytes,
@@ -248,14 +252,17 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
const nonce = await this.signer.getTransactionCount()
const contractFunction = async (gasPrice): Promise => {
+ this.logger.info('Submitting appendSequencerBatch transaction', {
+ gasPrice,
+ nonce,
+ contractAddr: this.chainContract.address,
+ })
const tx = await this.chainContract.appendSequencerBatch(batchParams, {
nonce,
gasPrice,
})
this.logger.info('Submitted appendSequencerBatch transaction', {
- nonce,
txHash: tx.hash,
- contractAddr: this.chainContract.address,
from: tx.from,
})
this.logger.debug('appendSequencerBatch transaction data', {
@@ -293,8 +300,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
// Fix our batches if we are configured to. TODO: Remove this.
batch = await this._fixBatch(batch)
if (!(await this._validateBatch(batch))) {
- this.logger.error('Batch is malformed! Cannot submit next batch!')
- throw new Error('Batch is malformed! Cannot submit next batch!')
+ this.metrics.malformedBatches.inc()
+ return
}
let sequencerBatchParams = await this._getSequencerBatchParams(
startBlock,
@@ -348,15 +355,21 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
// Verify all of the batch elements are monotonic
let lastTimestamp: number
let lastBlockNumber: number
- for (const ele of batch) {
+ for (const [idx, ele] of batch.entries()) {
if (ele.timestamp < lastTimestamp) {
- this.logger.error('Timestamp monotonicity violated! Element', { ele })
+ this.logger.error('Timestamp monotonicity violated! Element', {
+ idx,
+ ele,
+ })
+ this._enableAutoFixBatchOptions(1)
return false
}
if (ele.blockNumber < lastBlockNumber) {
this.logger.error('Block Number monotonicity violated! Element', {
+ idx,
ele,
})
+ this._enableAutoFixBatchOptions(1)
return false
}
lastTimestamp = ele.timestamp
@@ -378,18 +391,16 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
}
let isEqual = true
- const [
- queueEleHash,
- timestamp,
- blockNumber,
- ] = await this.chainContract.getQueueElement(queueIndex)
+ const [queueEleHash, timestamp, blockNumber] =
+ await this.chainContract.getQueueElement(queueIndex)
// TODO: Verify queue element hash equality. The queue element hash can be computed with:
// keccak256( abi.encode( msg.sender, _target, _gasLimit, _data))
-
+ this._enableAutoFixBatchOptions(0)
// Check timestamp & blockNumber equality
if (timestamp !== queueElement.timestamp) {
isEqual = false
+ this._enableAutoFixBatchOptions(2)
logEqualityError(
'Timestamp',
queueIndex,
@@ -399,6 +410,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
}
if (blockNumber !== queueElement.blockNumber) {
isEqual = false
+ this._enableAutoFixBatchOptions(1)
logEqualityError(
'Block Number',
queueIndex,
@@ -406,6 +418,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
queueElement.blockNumber
)
}
+
return isEqual
}
@@ -446,22 +459,21 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
for (const ele of b) {
// Look for skipped deposits
while (true) {
- const pendingQueueElements = await this.chainContract.getNumPendingQueueElements()
- const nextRemoteQueueElements = await this.chainContract.getNextQueueIndex()
+ const pendingQueueElements =
+ await this.chainContract.getNumPendingQueueElements()
+ const nextRemoteQueueElements =
+ await this.chainContract.getNextQueueIndex()
const totalQueueElements =
pendingQueueElements + nextRemoteQueueElements
// No more queue elements so we clearly haven't skipped anything
if (nextQueueIndex >= totalQueueElements) {
break
}
- const [
- queueEleHash,
- timestamp,
- blockNumber,
- ] = await this.chainContract.getQueueElement(nextQueueIndex)
+ const [queueEleHash, timestamp, blockNumber] =
+ await this.chainContract.getQueueElement(nextQueueIndex)
if (timestamp < ele.timestamp || blockNumber < ele.blockNumber) {
- this.logger.error('Fixing skipped deposit', {
+ this.logger.warn('Fixing skipped deposit', {
badTimestamp: ele.timestamp,
skippedQueueTimestamp: timestamp,
badBlockNumber: ele.blockNumber,
@@ -482,7 +494,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
break
}
}
- fixedBatch.push(ele)
+ // fixedBatch.push(ele)
if (!ele.isSequencerTx) {
nextQueueIndex++
}
@@ -494,10 +506,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
const fixMonotonicity = async (b: Batch): Promise => {
this.logger.debug('Fixing monotonicity...')
// The earliest allowed timestamp/blockNumber is the last timestamp submitted on chain.
- const {
- lastTimestamp,
- lastBlockNumber,
- } = await this._getLastTimestampAndBlockNumber()
+ const { lastTimestamp, lastBlockNumber } =
+ await this._getLastTimestampAndBlockNumber()
let earliestTimestamp = lastTimestamp
let earliestBlockNumber = lastBlockNumber
this.logger.debug('Determined earliest timestamp and blockNumber', {
@@ -513,16 +523,15 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
// updateLatestTimestampAndBlockNumber is a helper which updates
// the latest timestamp and block number based on the pending queue elements.
const updateLatestTimestampAndBlockNumber = async () => {
- const pendingQueueElements = await this.chainContract.getNumPendingQueueElements()
- const nextRemoteQueueElements = await this.chainContract.getNextQueueIndex()
+ const pendingQueueElements =
+ await this.chainContract.getNumPendingQueueElements()
+ const nextRemoteQueueElements =
+ await this.chainContract.getNextQueueIndex()
const totalQueueElements =
pendingQueueElements + nextRemoteQueueElements
if (nextQueueIndex < totalQueueElements) {
- const [
- queueEleHash,
- queueTimestamp,
- queueBlockNumber,
- ] = await this.chainContract.getQueueElement(nextQueueIndex)
+ const [queueEleHash, queueTimestamp, queueBlockNumber] =
+ await this.chainContract.getQueueElement(nextQueueIndex)
latestTimestamp = queueTimestamp
latestBlockNumber = queueBlockNumber
} else {
@@ -555,38 +564,31 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
ele.timestamp < earliestTimestamp ||
ele.blockNumber < earliestBlockNumber
) {
- this.logger.error('Fixing timestamp/blockNumber too small', {
+ this.logger.warn('Fixing timestamp/blockNumber too small', {
oldTimestamp: ele.timestamp,
newTimestamp: earliestTimestamp,
oldBlockNumber: ele.blockNumber,
newBlockNumber: earliestBlockNumber,
})
- fixedBatch.push({
- ...ele,
- timestamp: earliestTimestamp,
- blockNumber: earliestBlockNumber,
- })
- continue
+ ele.timestamp = earliestTimestamp
+ ele.blockNumber = earliestBlockNumber
}
// Fix the element if its timestammp/blockNumber is too large
if (
ele.timestamp > latestTimestamp ||
ele.blockNumber > latestBlockNumber
) {
- this.logger.error('Fixing timestamp/blockNumber too large.', {
+ this.logger.warn('Fixing timestamp/blockNumber too large.', {
oldTimestamp: ele.timestamp,
newTimestamp: latestTimestamp,
oldBlockNumber: ele.blockNumber,
newBlockNumber: latestBlockNumber,
})
- fixedBatch.push({
- ...ele,
- timestamp: latestTimestamp,
- blockNumber: latestBlockNumber,
- })
- continue
+ ele.timestamp = latestTimestamp
+ ele.blockNumber = latestBlockNumber
}
- // No fixes needed!
+ earliestTimestamp = ele.timestamp
+ earliestBlockNumber = ele.blockNumber
fixedBatch.push(ele)
}
return fixedBatch
@@ -617,7 +619,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
)
const addr = await manager.getAddress(
- 'OVM_ChainStorageContainer:CTC:batches'
+ 'OVM_ChainStorageContainer-CTC-batches'
)
const container = new Contract(
addr,
@@ -647,11 +649,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
queueIndex: number,
queueElement: BatchElement
): Promise {
- const [
- queueEleHash,
- timestamp,
- blockNumber,
- ] = await this.chainContract.getQueueElement(queueIndex)
+ const [queueEleHash, timestamp, blockNumber] =
+ await this.chainContract.getQueueElement(queueIndex)
if (
timestamp > queueElement.timestamp &&
@@ -753,8 +752,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
}
return {
- // TODO: Remove BLOCK_OFFSET by adding a tx to Geth's genesis
- shouldStartAtElement: shouldStartAtIndex - BLOCK_OFFSET,
+ shouldStartAtElement: shouldStartAtIndex - this.blockOffset,
totalElementsToAppend,
contexts,
transactions,
@@ -791,4 +789,30 @@ export class TransactionBatchSubmitter extends BatchSubmitter {
private _isSequencerTx(block: L2Block): boolean {
return block.transactions[0].queueOrigin === QueueOrigin.Sequencer
}
+
+ private _enableAutoFixBatchOptions(type: number) {
+ if (type === 0) {
+ this.autoFixBatchOptions = {
+ fixDoublePlayedDeposits: false,
+ fixMonotonicity: false,
+ fixSkippedDeposits: false,
+ }
+ }
+ if (type === 1) {
+ this.logger.warn("Enabled autoFixBatchOptions - fixMonotonicity")
+ this.autoFixBatchOptions = {
+ fixDoublePlayedDeposits: false,
+ fixMonotonicity: true,
+ fixSkippedDeposits: false,
+ }
+ }
+ if (type === 2) {
+ this.logger.warn("Enabled autoFixBatchOptions - fixSkippedDeposits")
+ this.autoFixBatchOptions = {
+ fixDoublePlayedDeposits: false,
+ fixMonotonicity: false,
+ fixSkippedDeposits: true,
+ }
+ }
+ }
}
diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts
index 9e4108af5ac1..3eda27d655dc 100644
--- a/packages/batch-submitter/src/exec/run-batch-submitter.ts
+++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts
@@ -1,11 +1,12 @@
/* External Imports */
-import { injectL2Context } from '@eth-optimism/core-utils'
-import { Logger, Metrics } from '@eth-optimism/common-ts'
+import { injectL2Context, Bcfg } from '@eth-optimism/core-utils'
+import * as Sentry from '@sentry/node'
+import { Logger, Metrics, createMetricsServer } from '@eth-optimism/common-ts'
import { exit } from 'process'
import { Signer, Wallet } from 'ethers'
import { JsonRpcProvider, TransactionReceipt } from '@ethersproject/providers'
-import { config } from 'dotenv'
-config()
+import * as dotenv from 'dotenv'
+import Config from 'bcfg'
/* Internal Imports */
import {
@@ -16,89 +17,41 @@ import {
TX_BATCH_SUBMITTER_LOG_TAG,
} from '..'
-const environment = process.env.NODE_ENV
-const network = process.env.ETH_NETWORK_NAME
-const release = `batch-submitter@${process.env.npm_package_version}`
-
-/* Logger */
-const name = 'oe:batch_submitter:init'
-let logger
-
-if (network) {
- // Initialize Sentry for Batch Submitter deployed to a network
- logger = new Logger({
- name,
- sentryOptions: {
- release,
- dsn: process.env.SENTRY_DSN,
- tracesSampleRate: parseInt(process.env.SENTRY_TRACE_RATE, 10) || 0.05,
- environment: network, // separate our Sentry errors by network instead of node environment
- },
- })
-} else {
- // Skip initializing Sentry
- logger = new Logger({ name })
-}
-
-/* Metrics */
-const metrics = new Metrics({
- prefix: name,
- labels: { environment, release, network },
-})
-
interface RequiredEnvVars {
// The HTTP provider URL for L1.
- L1_NODE_WEB3_URL: 'L1_NODE_WEB3_URL'
+ L1_NODE_WEB3_URL: string
// The HTTP provider URL for L2.
- L2_NODE_WEB3_URL: 'L2_NODE_WEB3_URL'
+ L2_NODE_WEB3_URL: string
// The layer one address manager address
- ADDRESS_MANAGER_ADDRESS: 'ADDRESS_MANAGER_ADDRESS'
+ ADDRESS_MANAGER_ADDRESS: string
// The minimum size in bytes of any L1 transactions generated by the batch submitter.
- MIN_L1_TX_SIZE: 'MIN_L1_TX_SIZE'
+ MIN_L1_TX_SIZE: number
// The maximum size in bytes of any L1 transactions generated by the batch submitter.
- MAX_L1_TX_SIZE: 'MAX_L1_TX_SIZE'
+ MAX_L1_TX_SIZE: number
// The maximum number of L2 transactions that can ever be in a batch.
- MAX_TX_BATCH_COUNT: 'MAX_TX_BATCH_COUNT'
+ MAX_TX_BATCH_COUNT: number
// The maximum number of L2 state roots that can ever be in a batch.
- MAX_STATE_BATCH_COUNT: 'MAX_STATE_BATCH_COUNT'
+ MAX_STATE_BATCH_COUNT: number
// The maximum amount of time (seconds) that we will wait before submitting an under-sized batch.
- MAX_BATCH_SUBMISSION_TIME: 'MAX_BATCH_SUBMISSION_TIME'
+ MAX_BATCH_SUBMISSION_TIME: number
// The delay in milliseconds between querying L2 for more transactions / to create a new batch.
- POLL_INTERVAL: 'POLL_INTERVAL'
+ POLL_INTERVAL: number
// The number of confirmations which we will wait after appending new batches.
- NUM_CONFIRMATIONS: 'NUM_CONFIRMATIONS'
+ NUM_CONFIRMATIONS: number
// The number of seconds to wait before resubmitting a transaction.
- RESUBMISSION_TIMEOUT: 'RESUBMISSION_TIMEOUT'
+ RESUBMISSION_TIMEOUT: number
// The number of confirmations that we should wait before submitting state roots for CTC elements.
- FINALITY_CONFIRMATIONS: 'FINALITY_CONFIRMATIONS'
+ FINALITY_CONFIRMATIONS: number
// Whether or not to run the tx batch submitter.
- RUN_TX_BATCH_SUBMITTER: 'true' | 'false' | 'RUN_TX_BATCH_SUBMITTER'
+ RUN_TX_BATCH_SUBMITTER: boolean
// Whether or not to run the state batch submitter.
- RUN_STATE_BATCH_SUBMITTER: 'true' | 'false' | 'RUN_STATE_BATCH_SUBMITTER'
+ RUN_STATE_BATCH_SUBMITTER: boolean
// The safe minimum amount of ether the batch submitter key should
// hold before it starts to log errors.
- SAFE_MINIMUM_ETHER_BALANCE: 'SAFE_MINIMUM_ETHER_BALANCE'
+ SAFE_MINIMUM_ETHER_BALANCE: number
// A boolean to clear the pending transactions in the mempool
// on start up.
- CLEAR_PENDING_TXS: 'true' | 'false' | 'CLEAR_PENDING_TXS'
-}
-const requiredEnvVars: RequiredEnvVars = {
- L1_NODE_WEB3_URL: 'L1_NODE_WEB3_URL',
- L2_NODE_WEB3_URL: 'L2_NODE_WEB3_URL',
- ADDRESS_MANAGER_ADDRESS: 'ADDRESS_MANAGER_ADDRESS',
- MIN_L1_TX_SIZE: 'MIN_L1_TX_SIZE',
- MAX_L1_TX_SIZE: 'MAX_L1_TX_SIZE',
- MAX_TX_BATCH_COUNT: 'MAX_TX_BATCH_COUNT',
- MAX_STATE_BATCH_COUNT: 'MAX_STATE_BATCH_COUNT',
- MAX_BATCH_SUBMISSION_TIME: 'MAX_BATCH_SUBMISSION_TIME',
- POLL_INTERVAL: 'POLL_INTERVAL',
- NUM_CONFIRMATIONS: 'NUM_CONFIRMATIONS',
- RESUBMISSION_TIMEOUT: 'RESUBMISSION_TIMEOUT',
- FINALITY_CONFIRMATIONS: 'FINALITY_CONFIRMATIONS',
- RUN_TX_BATCH_SUBMITTER: 'RUN_TX_BATCH_SUBMITTER',
- RUN_STATE_BATCH_SUBMITTER: 'RUN_STATE_BATCH_SUBMITTER',
- SAFE_MINIMUM_ETHER_BALANCE: 'SAFE_MINIMUM_ETHER_BALANCE',
- CLEAR_PENDING_TXS: 'CLEAR_PENDING_TXS',
+ CLEAR_PENDING_TXS: boolean
}
/* Optional Env Vars
@@ -111,118 +64,309 @@ const requiredEnvVars: RequiredEnvVars = {
* PROPOSER_MNEMONIC
* SEQUENCER_HD_PATH
* PROPOSER_HD_PATH
+ * BLOCK_OFFSET
+ * USE_HARDHAT
+ * DEBUG_IMPERSONATE_SEQUENCER_ADDRESS
+ * DEBUG_IMPERSONATE_PROPOSER_ADDRESS
+ * RUN_METRICS_SERVER
*/
-const env = process.env
-const FRAUD_SUBMISSION_ADDRESS = env.FRAUD_SUBMISSION_ADDRESS || 'no fraud'
-const DISABLE_QUEUE_BATCH_APPEND = !!env.DISABLE_QUEUE_BATCH_APPEND
-const MIN_GAS_PRICE_IN_GWEI = parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0
-const MAX_GAS_PRICE_IN_GWEI = parseInt(env.MAX_GAS_PRICE_IN_GWEI, 10) || 70
-const GAS_RETRY_INCREMENT = parseInt(env.GAS_RETRY_INCREMENT, 10) || 5
-const GAS_THRESHOLD_IN_GWEI = parseInt(env.GAS_THRESHOLD_IN_GWEI, 10) || 100
-
-// Private keys & mnemonics
-const SEQUENCER_PRIVATE_KEY = env.SEQUENCER_PRIVATE_KEY
-const PROPOSER_PRIVATE_KEY =
- env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY // Kept for backwards compatibility
-const SEQUENCER_MNEMONIC = env.SEQUENCER_MNEMONIC || env.MNEMONIC
-const PROPOSER_MNEMONIC = env.PROPOSER_MNEMONIC || env.MNEMONIC
-const SEQUENCER_HD_PATH = env.SEQUENCER_HD_PATH || env.HD_PATH
-const PROPOSER_HD_PATH = env.PROPOSER_HD_PATH || env.HD_PATH
-// Auto fix batch options -- TODO: Remove this very hacky config
-const AUTO_FIX_BATCH_OPTIONS_CONF = env.AUTO_FIX_BATCH_OPTIONS_CONF
-const autoFixBatchOptions: AutoFixBatchOptions = {
- fixDoublePlayedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF
- ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixDoublePlayedDeposits')
- : false,
- fixMonotonicity: AUTO_FIX_BATCH_OPTIONS_CONF
- ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixMonotonicity')
- : false,
- fixSkippedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF
- ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixSkippedDeposits')
- : false,
-}
export const run = async () => {
- logger.info('Starting batch submitter...')
+ dotenv.config()
- for (const [i, val] of Object.entries(requiredEnvVars)) {
- if (!process.env[val]) {
- logger.warn('Missing environment variable', {
- varName: val,
- })
- exit(1)
- }
- requiredEnvVars[val] = process.env[val]
- }
+ const config: Bcfg = new Config('batch-submitter')
+ config.load({
+ env: true,
+ argv: true,
+ })
- const clearPendingTxs = requiredEnvVars.CLEAR_PENDING_TXS === 'true'
+ // Parse config
+ const env = process.env
+ const environment = config.str('node-env', env.NODE_ENV)
+ const network = config.str('eth-network-name', env.ETH_NETWORK_NAME)
+ const service = `batch-submitter`
+ const release = `batch-submitter@${env.npm_package_version}`
+ const sentryDsn = config.str('sentry-dsn', env.SENTRY_DSN)
+ const sentryTraceRate = config.ufloat(
+ 'sentry-trace-rate',
+ parseFloat(env.SENTRY_TRACE_RATE) || 0.05
+ )
- const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL)
- const l2Provider = injectL2Context(
- new JsonRpcProvider(requiredEnvVars.L2_NODE_WEB3_URL)
+ // Default is 1 because Geth normally has 1 more block than L1
+ const BLOCK_OFFSET = config.uint(
+ 'block-offset',
+ parseInt(env.BLOCK_OFFSET, 10) || 1
)
- let sequencerSigner: Signer
- let proposerSigner: Signer
- if (SEQUENCER_PRIVATE_KEY) {
- sequencerSigner = new Wallet(SEQUENCER_PRIVATE_KEY, l1Provider)
- } else if (SEQUENCER_MNEMONIC) {
- sequencerSigner = Wallet.fromMnemonic(
- SEQUENCER_MNEMONIC,
- SEQUENCER_HD_PATH
- ).connect(l1Provider)
+ /* Logger */
+ const name = 'oe:batch_submitter:init'
+ let logger
+
+ if (config.bool('use-sentry', env.USE_SENTRY === 'true')) {
+ const sentryOptions = {
+ release,
+ dsn: sentryDsn,
+ tracesSampleRate: sentryTraceRate,
+ environment: network,
+ }
+ Sentry.init(sentryOptions)
+ // Initialize Sentry for Batch Submitter deployed to a network
+ logger = new Logger({
+ name,
+ sentryOptions,
+ })
} else {
+ // Skip initializing Sentry
+ logger = new Logger({ name })
+ }
+
+ const useHardhat = config.bool('use-hardhat', !!env.USE_HARDHAT)
+ const DEBUG_IMPERSONATE_SEQUENCER_ADDRESS = config.str(
+ 'debug-impersonate-sequencer-address',
+ env.DEBUG_IMPERSONATE_SEQUENCER_ADDRESS
+ )
+ const DEBUG_IMPERSONATE_PROPOSER_ADDRESS = config.str(
+ 'debug-impersonate-proposer-address',
+ env.DEBUG_IMPERSONATE_PROPOSER_ADDRESS
+ )
+
+ const getSequencerSigner = async (): Promise => {
+ const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL)
+
+ if (useHardhat) {
+ if (!DEBUG_IMPERSONATE_SEQUENCER_ADDRESS) {
+ throw new Error('Must pass DEBUG_IMPERSONATE_SEQUENCER_ADDRESS')
+ }
+ await l1Provider.send('hardhat_impersonateAccount', [
+ DEBUG_IMPERSONATE_SEQUENCER_ADDRESS,
+ ])
+ return l1Provider.getSigner(DEBUG_IMPERSONATE_SEQUENCER_ADDRESS)
+ }
+
+ if (SEQUENCER_PRIVATE_KEY) {
+ return new Wallet(SEQUENCER_PRIVATE_KEY, l1Provider)
+ } else if (SEQUENCER_MNEMONIC) {
+ return Wallet.fromMnemonic(SEQUENCER_MNEMONIC, SEQUENCER_HD_PATH).connect(
+ l1Provider
+ )
+ }
throw new Error(
'Must pass one of SEQUENCER_PRIVATE_KEY, MNEMONIC, or SEQUENCER_MNEMONIC'
)
}
- if (PROPOSER_PRIVATE_KEY) {
- proposerSigner = new Wallet(PROPOSER_PRIVATE_KEY, l1Provider)
- } else if (PROPOSER_MNEMONIC) {
- proposerSigner = Wallet.fromMnemonic(
- PROPOSER_MNEMONIC,
- PROPOSER_HD_PATH
- ).connect(l1Provider)
- } else {
+
+ const getProposerSigner = async (): Promise => {
+ const l1Provider = new JsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL)
+
+ if (useHardhat) {
+ if (!DEBUG_IMPERSONATE_PROPOSER_ADDRESS) {
+ throw new Error('Must pass DEBUG_IMPERSONATE_PROPOSER_ADDRESS')
+ }
+ await l1Provider.send('hardhat_impersonateAccount', [
+ DEBUG_IMPERSONATE_PROPOSER_ADDRESS,
+ ])
+ return l1Provider.getSigner(DEBUG_IMPERSONATE_PROPOSER_ADDRESS)
+ }
+
+ if (PROPOSER_PRIVATE_KEY) {
+ return new Wallet(PROPOSER_PRIVATE_KEY, l1Provider)
+ } else if (PROPOSER_MNEMONIC) {
+ return Wallet.fromMnemonic(PROPOSER_MNEMONIC, PROPOSER_HD_PATH).connect(
+ l1Provider
+ )
+ }
throw new Error(
'Must pass one of PROPOSER_PRIVATE_KEY, MNEMONIC, or PROPOSER_MNEMONIC'
)
}
+ /* Metrics */
+ const metrics = new Metrics({
+ labels: { environment, release, network, service },
+ })
+
+ const FRAUD_SUBMISSION_ADDRESS = config.str(
+ 'fraud-submisison-address',
+ env.FRAUD_SUBMISSION_ADDRESS || 'no fraud'
+ )
+ const DISABLE_QUEUE_BATCH_APPEND = config.bool(
+ 'disable-queue-batch-append',
+ !!env.DISABLE_QUEUE_BATCH_APPEND
+ )
+ const MIN_GAS_PRICE_IN_GWEI = config.uint(
+ 'min-gas-price-in-gwei',
+ parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0
+ )
+ const MAX_GAS_PRICE_IN_GWEI = config.uint(
+ 'max-gas-price-in-gwei',
+ parseInt(env.MAX_GAS_PRICE_IN_GWEI, 10) || 70
+ )
+ const GAS_RETRY_INCREMENT = config.uint(
+ 'gas-retry-increment',
+ parseInt(env.GAS_RETRY_INCREMENT, 10) || 5
+ )
+ const GAS_THRESHOLD_IN_GWEI = config.uint(
+ 'gas-threshold-in-gwei',
+ parseInt(env.GAS_THRESHOLD_IN_GWEI, 10) || 100
+ )
+
+ // Private keys & mnemonics
+ const SEQUENCER_PRIVATE_KEY = config.str(
+ 'sequencer-private-key',
+ env.SEQUENCER_PRIVATE_KEY
+ )
+ // Kept for backwards compatibility
+ const PROPOSER_PRIVATE_KEY = config.str(
+ 'proposer-private-key',
+ env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY
+ )
+ const SEQUENCER_MNEMONIC = config.str(
+ 'sequencer-mnemonic',
+ env.SEQUENCER_MNEMONIC || env.MNEMONIC
+ )
+ const PROPOSER_MNEMONIC = config.str(
+ 'proposer-mnemonic',
+ env.PROPOSER_MNEMONIC || env.MNEMONIC
+ )
+ const SEQUENCER_HD_PATH = config.str(
+ 'sequencer-hd-path',
+ env.SEQUENCER_HD_PATH || env.HD_PATH
+ )
+ const PROPOSER_HD_PATH = config.str(
+ 'proposer-hd-path',
+ env.PROPOSER_HD_PATH || env.HD_PATH
+ )
+
+ // Auto fix batch options -- TODO: Remove this very hacky config
+ const AUTO_FIX_BATCH_OPTIONS_CONF = config.str(
+ 'auto-fix-batch-conf',
+ env.AUTO_FIX_BATCH_OPTIONS_CONF || ''
+ )
+ const autoFixBatchOptions: AutoFixBatchOptions = {
+ fixDoublePlayedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF
+ ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixDoublePlayedDeposits')
+ : false,
+ fixMonotonicity: AUTO_FIX_BATCH_OPTIONS_CONF
+ ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixMonotonicity')
+ : false,
+ fixSkippedDeposits: AUTO_FIX_BATCH_OPTIONS_CONF
+ ? AUTO_FIX_BATCH_OPTIONS_CONF.includes('fixSkippedDeposits')
+ : false,
+ }
+
+ logger.info('Starting batch submitter...')
+
+ const requiredEnvVars: RequiredEnvVars = {
+ L1_NODE_WEB3_URL: config.str('l1-node-web3-url', env.L1_NODE_WEB3_URL),
+ L2_NODE_WEB3_URL: config.str('l2-node-web3-url', env.L2_NODE_WEB3_URL),
+ ADDRESS_MANAGER_ADDRESS: config.str(
+ 'address-manager-address',
+ env.ADDRESS_MANAGER_ADDRESS
+ ),
+ MIN_L1_TX_SIZE: config.uint(
+ 'min-l1-tx-size',
+ parseInt(env.MIN_L1_TX_SIZE, 10)
+ ),
+ MAX_L1_TX_SIZE: config.uint(
+ 'max-l1-tx-size',
+ parseInt(env.MAX_L1_TX_SIZE, 10)
+ ),
+ MAX_TX_BATCH_COUNT: config.uint(
+ 'max-tx-batch-count',
+ parseInt(env.MAX_TX_BATCH_COUNT, 10)
+ ),
+ MAX_STATE_BATCH_COUNT: config.uint(
+ 'max-state-batch-count',
+ parseInt(env.MAX_STATE_BATCH_COUNT, 10)
+ ),
+ MAX_BATCH_SUBMISSION_TIME: config.uint(
+ 'max-batch-submisison-time',
+ parseInt(env.MAX_BATCH_SUBMISSION_TIME, 10)
+ ),
+ POLL_INTERVAL: config.uint(
+ 'poll-interval',
+ parseInt(env.POLL_INTERVAL, 10)
+ ),
+ NUM_CONFIRMATIONS: config.uint(
+ 'num-confirmations',
+ parseInt(env.NUM_CONFIRMATIONS, 10)
+ ),
+ RESUBMISSION_TIMEOUT: config.uint(
+ 'resubmission-timeout',
+ parseInt(env.RESUBMISSION_TIMEOUT, 10)
+ ),
+ FINALITY_CONFIRMATIONS: config.uint(
+ 'finality-confirmations',
+ parseInt(env.FINALITY_CONFIRMATIONS, 10)
+ ),
+ RUN_TX_BATCH_SUBMITTER: config.bool(
+ 'run-tx-batch-submitter',
+ env.RUN_TX_BATCH_SUBMITTER === 'true'
+ ),
+ RUN_STATE_BATCH_SUBMITTER: config.bool(
+ 'run-state-batch-submitter',
+ env.RUN_STATE_BATCH_SUBMITTER === 'true'
+ ),
+ SAFE_MINIMUM_ETHER_BALANCE: config.ufloat(
+ 'safe-minimum-ether-balance',
+ parseFloat(env.SAFE_MINIMUM_ETHER_BALANCE)
+ ),
+ CLEAR_PENDING_TXS: config.bool(
+ 'clear-pending-txs',
+ env.CLEAR_PENDING_TXS === 'true'
+ ),
+ }
+
+ for (const [key, val] of Object.entries(requiredEnvVars)) {
+ if (val === null || val === undefined) {
+ logger.warn('Missing environment variable', {
+ key,
+ value: val,
+ })
+ exit(1)
+ }
+ }
+
+ const clearPendingTxs = requiredEnvVars.CLEAR_PENDING_TXS
+
+ const l2Provider = injectL2Context(
+ new JsonRpcProvider(requiredEnvVars.L2_NODE_WEB3_URL)
+ )
+
+ const sequencerSigner: Signer = await getSequencerSigner()
+ let proposerSigner: Signer = await getProposerSigner()
+
const sequencerAddress = await sequencerSigner.getAddress()
const proposerAddress = await proposerSigner.getAddress()
- const address = await sequencerSigner.getAddress()
+ // If the sequencer & proposer are the same, use a single wallet
+ if (sequencerAddress === proposerAddress) {
+ proposerSigner = sequencerSigner
+ }
+
logger.info('Configured batch submitter addresses', {
sequencerAddress,
proposerAddress,
addressManagerAddress: requiredEnvVars.ADDRESS_MANAGER_ADDRESS,
})
- // If the sequencer & proposer are the same, use a single wallet
- if (sequencerAddress === proposerAddress) {
- proposerSigner = sequencerSigner
- }
-
const txBatchSubmitter = new TransactionBatchSubmitter(
sequencerSigner,
l2Provider,
- parseInt(requiredEnvVars.MIN_L1_TX_SIZE, 10),
- parseInt(requiredEnvVars.MAX_L1_TX_SIZE, 10),
- parseInt(requiredEnvVars.MAX_TX_BATCH_COUNT, 10),
- parseInt(requiredEnvVars.MAX_BATCH_SUBMISSION_TIME, 10) * 1_000,
- parseInt(requiredEnvVars.NUM_CONFIRMATIONS, 10),
- parseInt(requiredEnvVars.RESUBMISSION_TIMEOUT, 10) * 1_000,
+ requiredEnvVars.MIN_L1_TX_SIZE,
+ requiredEnvVars.MAX_L1_TX_SIZE,
+ requiredEnvVars.MAX_TX_BATCH_COUNT,
+ requiredEnvVars.MAX_BATCH_SUBMISSION_TIME * 1_000,
+ requiredEnvVars.NUM_CONFIRMATIONS,
+ requiredEnvVars.RESUBMISSION_TIMEOUT * 1_000,
requiredEnvVars.ADDRESS_MANAGER_ADDRESS,
- parseFloat(requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE),
+ requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE,
MIN_GAS_PRICE_IN_GWEI,
MAX_GAS_PRICE_IN_GWEI,
GAS_RETRY_INCREMENT,
GAS_THRESHOLD_IN_GWEI,
+ BLOCK_OFFSET,
logger.child({ name: TX_BATCH_SUBMITTER_LOG_TAG }),
- new Metrics({
- prefix: TX_BATCH_SUBMITTER_LOG_TAG,
- labels: { environment, release, network },
- }),
+ metrics,
DISABLE_QUEUE_BATCH_APPEND,
autoFixBatchOptions
)
@@ -230,24 +374,22 @@ export const run = async () => {
const stateBatchSubmitter = new StateBatchSubmitter(
proposerSigner,
l2Provider,
- parseInt(requiredEnvVars.MIN_L1_TX_SIZE, 10),
- parseInt(requiredEnvVars.MAX_L1_TX_SIZE, 10),
- parseInt(requiredEnvVars.MAX_STATE_BATCH_COUNT, 10),
- parseInt(requiredEnvVars.MAX_BATCH_SUBMISSION_TIME, 10) * 1_000,
- parseInt(requiredEnvVars.NUM_CONFIRMATIONS, 10),
- parseInt(requiredEnvVars.RESUBMISSION_TIMEOUT, 10) * 1_000,
- parseInt(requiredEnvVars.FINALITY_CONFIRMATIONS, 10),
+ requiredEnvVars.MIN_L1_TX_SIZE,
+ requiredEnvVars.MAX_L1_TX_SIZE,
+ requiredEnvVars.MAX_STATE_BATCH_COUNT,
+ requiredEnvVars.MAX_BATCH_SUBMISSION_TIME * 1_000,
+ requiredEnvVars.NUM_CONFIRMATIONS,
+ requiredEnvVars.RESUBMISSION_TIMEOUT * 1_000,
+ requiredEnvVars.FINALITY_CONFIRMATIONS,
requiredEnvVars.ADDRESS_MANAGER_ADDRESS,
- parseFloat(requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE),
+ requiredEnvVars.SAFE_MINIMUM_ETHER_BALANCE,
MIN_GAS_PRICE_IN_GWEI,
MAX_GAS_PRICE_IN_GWEI,
GAS_RETRY_INCREMENT,
GAS_THRESHOLD_IN_GWEI,
+ BLOCK_OFFSET,
logger.child({ name: STATE_BATCH_SUBMITTER_LOG_TAG }),
- new Metrics({
- prefix: STATE_BATCH_SUBMITTER_LOG_TAG,
- labels: { environment, release, network },
- }),
+ metrics,
FRAUD_SUBMISSION_ADDRESS
)
@@ -281,12 +423,16 @@ export const run = async () => {
})
await sequencerSigner.provider.waitForTransaction(
response.hash,
- parseInt(requiredEnvVars.NUM_CONFIRMATIONS, 10)
+ requiredEnvVars.NUM_CONFIRMATIONS
)
}
}
} catch (err) {
- logger.error('Cannot clear transactions', { err })
+ logger.error('Cannot clear transactions', {
+ message: err.toString(),
+ stack: err.stack,
+ code: err.code,
+ })
process.exit(1)
}
}
@@ -295,21 +441,54 @@ export const run = async () => {
try {
await func()
} catch (err) {
- logger.error('Error submitting batch', { err })
+ switch (err.code) {
+ case 'SERVER_ERROR':
+ logger.error(`Encountered server error with status ${err.status}`, {
+ message: err.toString(),
+ stack: err.stack,
+ code: err.code,
+ })
+ break
+ case 'NETWORK_ERROR':
+ logger.error('Could not detect network', {
+ message: err.toString(),
+ stack: err.stack,
+ code: err.code,
+ })
+ break
+ default:
+ logger.error('Unhandled exception during batch submission', {
+ message: err.toString(),
+ stack: err.stack,
+ code: err.code,
+ })
+ break
+ }
logger.info('Retrying...')
}
// Sleep
- await new Promise((r) =>
- setTimeout(r, parseInt(requiredEnvVars.POLL_INTERVAL, 10))
- )
+ await new Promise((r) => setTimeout(r, requiredEnvVars.POLL_INTERVAL))
}
}
// Run batch submitters in two seperate infinite loops!
- if (requiredEnvVars.RUN_TX_BATCH_SUBMITTER === 'true') {
+ if (requiredEnvVars.RUN_TX_BATCH_SUBMITTER) {
loop(() => txBatchSubmitter.submitNextBatch())
}
- if (requiredEnvVars.RUN_STATE_BATCH_SUBMITTER === 'true') {
+ if (requiredEnvVars.RUN_STATE_BATCH_SUBMITTER) {
loop(() => stateBatchSubmitter.submitNextBatch())
}
+
+ if (config.bool('run-metrics-server', env.RUN_METRICS_SERVER === 'true')) {
+ // Initialize metrics server
+ await createMetricsServer({
+ logger,
+ registry: metrics.registry,
+ port: config.uint('metrics-port', parseInt(env.METRICS_PORT, 10) || 7300),
+ hostname: config.str(
+ 'metrics-hostname',
+ env.METRICS_HOSTNAME || '127.0.0.1'
+ ),
+ })
+ }
}
diff --git a/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts b/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts
index 30da81bd01ee..8a4d4d646071 100644
--- a/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts
+++ b/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts
@@ -9,7 +9,7 @@ import sinon from 'sinon'
import { Web3Provider } from '@ethersproject/providers'
import scc from '@eth-optimism/contracts/artifacts/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol/OVM_StateCommitmentChain.json'
-import { getContractInterface } from '@eth-optimism/contracts'
+import { getContractInterface, predeploys } from '@eth-optimism/contracts'
import { smockit, MockContract } from '@eth-optimism/smock'
/* Internal Imports */
@@ -33,12 +33,10 @@ import {
QueueOrigin,
Batch,
Signature,
- TxType,
remove0x,
} from '@eth-optimism/core-utils'
import { Logger, Metrics } from '@eth-optimism/common-ts'
-const DECOMPRESSION_ADDRESS = '0x4200000000000000000000000000000000000008'
const DUMMY_ADDRESS = '0x' + '00'.repeat(20)
const EXAMPLE_STATE_ROOT =
'0x16b7f83f409c7195b1f4fde5652f1b54a4477eacb6db7927691becafba5f8801'
@@ -98,7 +96,7 @@ describe('BatchSubmitter', () => {
)
await AddressManager.setAddress(
'OVM_DecompressionPrecompileAddress',
- DECOMPRESSION_ADDRESS
+ predeploys.OVM_SequencerEntrypoint
)
Mock__OVM_ExecutionManager = await smockit(
@@ -154,10 +152,11 @@ describe('BatchSubmitter', () => {
let OVM_StateCommitmentChain: Contract
let l2Provider: MockchainProvider
beforeEach(async () => {
- const unwrapped_OVM_CanonicalTransactionChain = await Factory__OVM_CanonicalTransactionChain.deploy(
- AddressManager.address,
- FORCE_INCLUSION_PERIOD_SECONDS
- )
+ const unwrapped_OVM_CanonicalTransactionChain =
+ await Factory__OVM_CanonicalTransactionChain.deploy(
+ AddressManager.address,
+ FORCE_INCLUSION_PERIOD_SECONDS
+ )
await unwrapped_OVM_CanonicalTransactionChain.init()
await AddressManager.setAddress(
@@ -171,11 +170,12 @@ describe('BatchSubmitter', () => {
sequencer
)
- const unwrapped_OVM_StateCommitmentChain = await Factory__OVM_StateCommitmentChain.deploy(
- AddressManager.address,
- 0, // fraudProofWindowSeconds
- 0 // sequencerPublishWindowSeconds
- )
+ const unwrapped_OVM_StateCommitmentChain =
+ await Factory__OVM_StateCommitmentChain.deploy(
+ AddressManager.address,
+ 0, // fraudProofWindowSeconds
+ 0 // sequencerPublishWindowSeconds
+ )
await unwrapped_OVM_StateCommitmentChain.init()
@@ -216,6 +216,7 @@ describe('BatchSubmitter', () => {
MAX_GAS_PRICE_IN_GWEI,
GAS_RETRY_INCREMENT,
GAS_THRESHOLD_IN_GWEI,
+ 1,
new Logger({ name: TX_BATCH_SUBMITTER_LOG_TAG }),
testMetrics,
false
@@ -252,7 +253,7 @@ describe('BatchSubmitter', () => {
{
rawTransaction: '0x1234',
l1BlockNumber: nextQueueElement.blockNumber - 1,
- txType: TxType.EIP155,
+ txType: 0,
queueOrigin: QueueOrigin.Sequencer,
l1TxOrigin: null,
} as any,
@@ -301,7 +302,7 @@ describe('BatchSubmitter', () => {
{
rawTransaction: '0x1234',
l1BlockNumber: nextQueueElement.blockNumber - 1,
- txType: TxType.EthSign,
+ txType: 1,
queueOrigin: QueueOrigin.Sequencer,
l1TxOrigin: null,
} as any,
@@ -405,7 +406,7 @@ describe('BatchSubmitter', () => {
{
rawTransaction: '0x1234',
l1BlockNumber: nextQueueElement.blockNumber - 1,
- txType: TxType.EIP155,
+ txType: 0,
queueOrigin: QueueOrigin.Sequencer,
l1TxOrigin: null,
} as any,
@@ -432,6 +433,7 @@ describe('BatchSubmitter', () => {
MAX_GAS_PRICE_IN_GWEI,
GAS_RETRY_INCREMENT,
GAS_THRESHOLD_IN_GWEI,
+ 1,
new Logger({ name: STATE_BATCH_SUBMITTER_LOG_TAG }),
testMetrics,
'0x' + '01'.repeat(20) // placeholder for fraudSubmissionAddress
@@ -482,7 +484,7 @@ describe('Batch Submitter with Ganache', () => {
gasPrices.push(gasPrice)
const tx = signer.sendTransaction({
- to: DECOMPRESSION_ADDRESS,
+ to: predeploys.OVM_SequencerEntrypoint,
value: 88,
nonce: 0,
gasPrice,
diff --git a/packages/batch-submitter/test/helpers/constants.ts b/packages/batch-submitter/test/helpers/constants.ts
index 0e8266db1b66..fa572ebfc0c1 100644
--- a/packages/batch-submitter/test/helpers/constants.ts
+++ b/packages/batch-submitter/test/helpers/constants.ts
@@ -6,7 +6,7 @@ export const FORCE_INCLUSION_PERIOD_SECONDS = 600
export const DEFAULT_ACCOUNTS = defaultAccounts
export const DEFAULT_ACCOUNTS_HARDHAT = defaultAccounts.map((account) => {
return {
- balance: ethers.BigNumber.from(account.balance).toHexString(),
+ balance: account.balance,
privateKey: account.secretKey,
}
})
diff --git a/packages/batch-submitter/tsconfig.json b/packages/batch-submitter/tsconfig.json
index 17100a25bcda..578447f2ea57 100644
--- a/packages/batch-submitter/tsconfig.json
+++ b/packages/batch-submitter/tsconfig.json
@@ -1,6 +1,6 @@
{
- "extends": "../../tsconfig.json",
- "compilerOptions": {
- "resolveJsonModule": true
- }
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "resolveJsonModule": true
+ }
}
diff --git a/packages/batch-submitter/tslint.json b/packages/batch-submitter/tslint.json
deleted file mode 100644
index 6587c444f045..000000000000
--- a/packages/batch-submitter/tslint.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "extends": "../../tslint.base.json"
-}
diff --git a/packages/common-ts/.eslintrc.js b/packages/common-ts/.eslintrc.js
new file mode 100644
index 000000000000..bfd2057be80b
--- /dev/null
+++ b/packages/common-ts/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: '../../.eslintrc.js',
+}
diff --git a/packages/common-ts/.lintstagedrc.yml b/packages/common-ts/.lintstagedrc.yml
new file mode 100644
index 000000000000..a3035a2299b2
--- /dev/null
+++ b/packages/common-ts/.lintstagedrc.yml
@@ -0,0 +1,2 @@
+"*.{ts,js}":
+ - eslint
diff --git a/packages/common-ts/.prettierrc.js b/packages/common-ts/.prettierrc.js
new file mode 100644
index 000000000000..6b3fa8e2ce23
--- /dev/null
+++ b/packages/common-ts/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ ...require('../../.prettierrc.js'),
+};
\ No newline at end of file
diff --git a/packages/common-ts/.prettierrc.json b/packages/common-ts/.prettierrc.json
deleted file mode 120000
index e69c69c2f4ce..000000000000
--- a/packages/common-ts/.prettierrc.json
+++ /dev/null
@@ -1 +0,0 @@
-../../.prettierrc.json
\ No newline at end of file
diff --git a/packages/common-ts/CHANGELOG.md b/packages/common-ts/CHANGELOG.md
index 57ea3a780565..8bcba4ec14a7 100644
--- a/packages/common-ts/CHANGELOG.md
+++ b/packages/common-ts/CHANGELOG.md
@@ -1,5 +1,23 @@
# @eth-optimism/common-ts
+## 0.1.4
+
+### Patch Changes
+
+- 5c89c45f: Move the metric prefix string to a label #1047
+
+## 0.1.3
+
+### Patch Changes
+
+- baa3b761: Improve Sentry support, initializing as needed and ensuring ERROR logs route to Sentry
+
+## 0.1.2
+
+### Patch Changes
+
+- 0c16805: add metrics server to common-ts and batch submitter
+
## 0.1.1
### Patch Changes
diff --git a/packages/common-ts/LICENSE b/packages/common-ts/LICENSE
new file mode 100644
index 000000000000..6a7da5218bb2
--- /dev/null
+++ b/packages/common-ts/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright 2020-2021 Optimism
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json
index 17c73f740c2a..a6b2df1e9d39 100644
--- a/packages/common-ts/package.json
+++ b/packages/common-ts/package.json
@@ -1,33 +1,52 @@
{
"name": "@eth-optimism/common-ts",
- "version": "0.1.1",
+ "version": "0.1.4",
"main": "dist/index",
"files": [
"dist/*"
],
"types": "dist/index",
+ "author": "Optimism PBC",
"license": "MIT",
"scripts": {
"all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint",
"build": "tsc -p tsconfig.build.json",
"clean": "rimraf dist/ ./tsconfig.build.tsbuildinfo",
+ "lint:check": "eslint .",
+ "lint:fix": "yarn lint:check --fix",
"lint": "yarn lint:fix && yarn lint:check",
- "lint:fix": "prettier --config .prettierrc.json --write '{src,test}/**/*.ts'",
- "lint:check": "tslint --format stylish --project ."
+ "pre-commit": "lint-staged",
+ "test": "ts-mocha test/*.spec.ts"
},
"devDependencies": {
+ "@types/chai": "^4.2.18",
+ "@types/express": "^4.17.11",
+ "@types/mocha": "^8.2.2",
"@types/pino": "^6.3.6",
"@types/pino-multi-stream": "^5.1.1",
"@types/prettier": "^2.2.3",
+ "@typescript-eslint/eslint-plugin": "^4.26.0",
+ "@typescript-eslint/parser": "^4.26.0",
+ "chai": "^4.3.4",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.27.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-ban": "^1.5.2",
+ "eslint-plugin-import": "^2.23.4",
+ "eslint-plugin-jsdoc": "^35.1.2",
+ "eslint-plugin-prefer-arrow": "^1.2.3",
+ "eslint-plugin-react": "^7.24.0",
+ "eslint-plugin-unicorn": "^32.0.1",
+ "mocha": "^8.4.0",
"prettier": "^2.2.1",
- "tslint": "^6.1.3",
- "tslint-config-prettier": "^1.18.0",
- "tslint-no-focused-test": "^0.5.0",
- "tslint-plugin-prettier": "^2.3.0",
+ "supertest": "^6.1.3",
+ "ts-mocha": "^8.0.0",
"typescript": "^4.2.3"
},
"dependencies": {
"@sentry/node": "^6.2.5",
+ "express": "^4.17.1",
"pino": "^6.11.3",
"pino-multi-stream": "^5.3.0",
"pino-sentry": "^0.7.0",
diff --git a/packages/common-ts/src/base-service.ts b/packages/common-ts/src/base-service.ts
index df21cf200601..dd64c3fdd33e 100644
--- a/packages/common-ts/src/base-service.ts
+++ b/packages/common-ts/src/base-service.ts
@@ -9,6 +9,11 @@ type OptionSettings = {
}
}
+type BaseServiceOptions = T & {
+ logger?: Logger
+ metrics?: Metrics
+}
+
/**
* Base for other "Service" objects. Handles your standard initialization process, can dynamically
* start and stop.
@@ -18,14 +23,21 @@ export class BaseService {
protected options: T
protected logger: Logger
protected metrics: Metrics
- protected initialized: boolean = false
- protected running: boolean = false
-
- constructor(name: string, options: T, optionSettings: OptionSettings) {
+ protected initialized = false
+ protected running = false
+
+ constructor(
+ name: string,
+ options: BaseServiceOptions,
+ optionSettings: OptionSettings
+ ) {
validateOptions(options, optionSettings)
this.name = name
this.options = mergeDefaultOptions(options, optionSettings)
- this.logger = new Logger({ name })
+ this.logger = options.logger || new Logger({ name })
+ if (options.metrics) {
+ this.metrics = options.metrics
+ }
}
/**
@@ -97,10 +109,10 @@ export class BaseService {
/**
* Combines user provided and default options.
*/
-function mergeDefaultOptions