diff --git a/.env b/.env index 0877cfe..a7abad3 100644 --- a/.env +++ b/.env @@ -2,7 +2,7 @@ # --------------------------------------------------------------------------------------------------- # RNODE_IMAGE=rchain/rnode -RNODE_IMAGE=rchain/rnode:v0.9.25.2 +RNODE_IMAGE=rchain/rnode:v0.10.2 # My network # --------------------------------------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore index 760a0d2..d28a462 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ node_modules dist/ +dist-types/ .cache/ .gen -rnode-grpc-* diff --git a/README.md b/README.md index dbbb746..d5ff127 100644 --- a/README.md +++ b/README.md @@ -1,88 +1,62 @@ -# RNode JS client examples +# RNode Web API client examples See also recording of code walk-thru sessions: - [2020\-07\-28 RChain Education](https://youtu.be/5JEtt53EacI?t=1043) - [2020\-08\-25 RChain Education](https://www.youtube.com/watch?v=2EUd2vOiJX8) -## Web (HTTP) - -In the browser connection to RNode can be done with **RNode Web API**. It's also possible to use gRPC with the proxy. +In the browser connection to RNode can be done with **RNode Web API**. Web API has only defined schema in Scala source, for the new info please check [RChain issue 2974](https://github.com/rchain/rchain/issues/2974). +For gRPC connection from nodejs please check [**@tgrospic/rnode-grpc-js**](https://github.com/tgrospic/rnode-grpc-js). +
-Quick info to run Web example with two nodes +Quick info to run the example with two nodes ```sh # Run nodes and web page example -npm install && docker-compose up -d && npm run start:web +npm install && docker-compose up -d && npm start -# Logs from all nodes +# Logs from both nodes docker-compose logs -f ```
-Web example is published from `gh-pages` branch on this url [https://tgrospic.github.io/rnode-client-js](https://tgrospic.github.io/rnode-client-js). +Web example is published from `gh-pages` branch to this url [https://tgrospic.github.io/rnode-client-js](https://tgrospic.github.io/rnode-client-js). -## Nodejs (gRPC) +**Changes on the web page are only saved in memory so it will be lost after refreshing the page.** -This repo contains examples how to use [**@tgrospic/rnode-grpc-js**](https://github.com/tgrospic/rnode-grpc-js) helper library to generate **RNode gRPC API** for **Nodejs**. - -## Example of RNode connection to Metamask (with hardware wallet) +## Wallet example with connection to RNode and Metamask (with hardware wallet) RNode has support for Ethereum type of signatures so Metamask can be used for signing deploys e.g. making transfers of REVs. In Web example, button to add selected Metamask account should be visible next to REV import textbox. -Helper functions are in [eth-wrapper.js](src/eth/eth-wrapper.js) which contains the code for communication with Metamask, getting selected ETH address and sending deploys for signing. -In [eth-sign.js](src/eth/eth-sign.js) are functions to verify deploy signature and to extract public key. -This is all that is needed for communication with Metamask and also for connected hardware wallets (Ledger). How to use these functions and send deploys to RNode is in [rnode-web.js](src/rnode-web.js). +Helper functions are in [@tgrospic/rnode-http-js] which contains the code for communication with Metamask, getting selected ETH address and sending deploys for signing. -Changes on the web page are only saved in memory so it will be lost after refreshing the page. RChain networks available for selection are in [rchain-networks.js](src/rchain-networks.js) file. +[@tgrospic/rnode-http-js]: https://github.com/tgrospic/rnode-http-js + ## Install Install project dependencies (in `./node_modules` folder). ```sh -# This is enough for HTTP connection to RNode and to run Web example npm install ``` -### Install (gRPC only) - -Generate JS bindings (default in `./rnode-grpc-gen`). - -```sh -# Defined as script command in package.json -npm run rnode-generate - -# Or call executable script directly from npm bin folder -# - which is in the PATH when npm scripts are executed -node_modules/.bin/rnode-grpc -``` - -## Run **Web example** ([`src/web`](src/web)) +## Run This will start local Nodejs dev server in watch mode [http://localhost:1234](http://localhost:1234). Test page contains a list of nodes to select, check balance, send transfers and deploys. ```sh -# Run web example -npm run start:web -``` - -## Run **Nodejs example** ([`src/nodejs/client.js`](src/nodejs/client.js)) - -In `src/nodejs/client.js` script is an example of how to connect to RNode from Nodejs. - -```sh -# Run nodejs example / sample requests to RChain testnet -npm run start:nodejs +npm start ``` ## Run RNode with Docker In the project is [Docker compose](docker-compose.yml) configuration to run local RChain network. +Private key for the validator is in [.env](.env) file. This key is also set in [data/genesis/wallets.txt](data/genesis/wallets.txt) witj initial REV balance to play with. ```sh # Starts validator and read-only RNode in daemon mode @@ -101,15 +75,5 @@ With [GitHub pages action](.github/workflows/github-pages.yml) any commit to _ma ```sh # Compile static web site (to ./dist folder) -npm run build:web +npm run build ``` - -## TypeScript definitions (gRPC API) - -`rnode-grpc-js` library also generates a TypeScript definition file that can be referenced in your code and can provide IntelliSense support in VSCode. - -```typescript -/// -``` - -![](docs/intellisense-vscode.png) diff --git a/docker-compose.yml b/docker-compose.yml index c2278a6..8aa71d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,31 +18,17 @@ services: --wallets-file /data/genesis/wallets.txt --bonds-file /data/genesis/bonds.txt --tls-certificate-path /data/node.certificate.pem --tls-key-path /data/node.key.pem --approve-duration 10seconds --approve-interval 10seconds + --dev-mode ports: - $MY_NET_IP:40401:40401 - $MY_NET_IP:40402:40402 - $MY_NET_IP:40403:40403 - $MY_NET_IP:40405:40405 - # Ports exposed externally + # Ports used in RNode address (exposed externally) - $MY_NET_IP:40400:40400 - $MY_NET_IP:40404:40404 volumes: - ./data:/data - read: - << : *default-rnode - container_name: read - command: run -b $VALIDATOR_BOOT_ADDRESS --allow-private-addresses --host read --no-upnp - --protocol-port 40410 --discovery-port 40414 - --approve-duration 10seconds --approve-interval 10seconds - --fork-choice-check-if-stale-interval 30seconds --fork-choice-stale-threshold 30seconds - ports: - - $MY_NET_IP:40411:40401 - - $MY_NET_IP:40413:40403 - - $MY_NET_IP:40415:40405 - # Ports exposed externally - - $MY_NET_IP:40410:40410 - - $MY_NET_IP:40414:40414 - networks: rchain-net: diff --git a/docs/intellisense-vscode.png b/docs/intellisense-vscode.png deleted file mode 100644 index bd113a1..0000000 Binary files a/docs/intellisense-vscode.png and /dev/null differ diff --git a/package-lock.json b/package-lock.json index c85873d..0f0efdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,25 +14,30 @@ } }, "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", - "dev": true + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } }, "@babel/core": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz", - "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.4", + "@babel/generator": "^7.11.6", "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.4", + "@babel/parser": "^7.11.5", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -43,213 +48,49 @@ "source-map": "^0.5.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "minimist": "^1.2.5" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.11.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-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.10.4" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -273,57 +114,52 @@ } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.10.tgz", - "integrity": "sha512-3Kcr2LGpL7CTRDTTYm1bzeor9qZbxbvU2AxsLA6mUG9gYarSfIKMK0UlU+azLWI+s0+BH768bwyaziWB2NOJlQ==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", + "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.10", - "@babel/helper-module-imports": "^7.12.5", - "@babel/types": "^7.12.10" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.11.5" } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-member-expression-to-functions": "^7.10.5", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "regexpu-core": "^4.7.1" + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { @@ -338,12 +174,12 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-function-name": { @@ -358,12 +194,12 @@ } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.10.4" } }, "@babel/helper-hoist-variables": { @@ -376,47 +212,45 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.11.0" } }, "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/types": "^7.11.0", "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.10.4" } }, "@babel/helper-plugin-utils": { @@ -425,45 +259,56 @@ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-member-expression-to-functions": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.11.0" } }, "@babel/helper-split-export-declaration": { @@ -481,16 +326,10 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, - "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", - "dev": true - }, "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -508,125 +347,6 @@ "@babel/template": "^7.10.4", "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } } }, "@babel/highlight": { @@ -641,36 +361,36 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/helper-remap-async-to-generator": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-create-class-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -678,9 +398,9 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -688,9 +408,9 @@ } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -698,9 +418,9 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -708,9 +428,9 @@ } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -718,9 +438,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -728,20 +448,20 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/plugin-transform-parameters": "^7.10.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -749,33 +469,33 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-create-class-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -789,9 +509,9 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -816,9 +536,9 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", - "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", + "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -834,9 +554,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -897,56 +617,56 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-remap-async-to-generator": "^7.10.4" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -954,52 +674,52 @@ "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-replace-supers": "^7.10.4", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", @@ -1007,28 +727,28 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.10.tgz", - "integrity": "sha512-0ti12wLTLeUIzu9U7kjqIn4MyOL7+Wibc7avsHhj4o1l5C0ATs8p2IMHrVYjm9t9wzhfEO6S3kxax0Rpdo8LTg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz", + "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.12.1" + "@babel/plugin-syntax-flow": "^7.10.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -1036,294 +756,237 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-module-transforms": "^7.10.5", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-simple-access": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-module-transforms": "^7.10.5", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.10.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/helper-replace-supers": "^7.10.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", "dev": true, "requires": { + "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.10.tgz", - "integrity": "sha512-MM7/BC8QdHXM7Qc1wdnuk73R4gbuOpfrSUgfV/nODGc86sPY1tgmY2M9E9uAnf2e4DOIp8aKGWqgZfQxnTNGuw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", "dev": true, "requires": { "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.12.10", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.12.1" + "@babel/plugin-syntax-jsx": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-runtime": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", - "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", "dev": true, "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.10.tgz", - "integrity": "sha512-Gz9hnBT/tGeTE2DBNDkD7BiWRELZt+8lSysHuDwmYXUIvtwZl0zI+D6mZgXZX0u8YBlLS4tmai9ONNY9tjRgRA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -1333,51 +996,46 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.10", - "core-js-compat": "^3.8.0", + "@babel/types": "^7.11.5", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "@babel/preset-modules": { @@ -1397,42 +1055,43 @@ "version": "7.11.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", + "@babel/generator": "^7.11.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1440,14 +1099,6 @@ "to-fast-properties": "^2.0.0" } }, - "@grpc/grpc-js": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.6.18.tgz", - "integrity": "sha512-uAzv/tM8qpbf1vpx1xPMfcUMzbfdqJtdCYAqY/LsLeQQlnTb4vApylojr+wlCyr7bZeg3AFfHvtihnNOQQt/nA==", - "requires": { - "semver": "^6.2.0" - } - }, "@iarna/toml": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", @@ -1503,23 +1154,6 @@ "grapheme-breaker": "^0.3.2", "ora": "^2.1.0", "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "@parcel/utils": { @@ -1535,97 +1169,38 @@ "dev": true, "requires": { "@parcel/utils": "^1.11.0", - "chokidar": "^2.1.5" - } - }, - "@parcel/workers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz", - "integrity": "sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==", - "dev": true, - "requires": { - "@parcel/utils": "^1.11.0", - "physical-cpu-count": "^2.0.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true + "chokidar": "^2.1.5" + } }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "@parcel/workers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz", + "integrity": "sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==", "dev": true, "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@parcel/utils": "^1.11.0", + "physical-cpu-count": "^2.0.0" } }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true - }, - "@tgrospic/rnode-grpc-js": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@tgrospic/rnode-grpc-js/-/rnode-grpc-js-0.8.5.tgz", - "integrity": "sha512-XY6QH7rKb2Jx04RZbMUfmLGF14Y8hvj2UbxBLlNqnsJPg0+diJQiPDT1zLDroNcwEh9Fe+cNpfdGNqAiakwTaw==", + "@tgrospic/rnode-http-js": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@tgrospic/rnode-http-js/-/rnode-http-js-0.1.7.tgz", + "integrity": "sha512-le/2OCFT9/ySQ8DLWqUHb1m3YVAYGE/UYVy9PUAEmKgAsms5lOL0fNuM8Z3E2EMlYQEWit4AP/JFZp370tkXvw==", "requires": { - "@babel/runtime": "^7.9.6", - "base-58": "0.0.1", "blakejs": "^1.1.0", - "core-js": "^3.6.5", - "elliptic": "^6.5.2", - "fs-extra": "^8.1.0", + "bs58": "^4.0.1", + "elliptic": "^6.5.3", + "ethereumjs-util": "^7.0.7", + "google-protobuf": "^3.14.0", "js-sha3": "^0.8.0", - "ramda": "^0.26.1", - "request": "^2.88.2" + "ramda": "^0.27.1" + }, + "dependencies": { + "google-protobuf": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.17.2.tgz", + "integrity": "sha512-LlFVMhSkNy6C1MakEjiwbLxq5w+V+Go+mvt2EUoysrp8gXl903ic2W/3BwzM4/WnDMJP+u7UO2efUSl/0CJMzA==" + } } }, "@types/bn.js": { @@ -1636,6 +1211,15 @@ "@types/node": "*" } }, + "@types/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA==", + "dev": true, + "requires": { + "base-x": "^3.0.6" + } + }, "@types/elliptic": { "version": "6.4.12", "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", @@ -1645,16 +1229,31 @@ "@types/bn.js": "*" } }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "@types/ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-5N0RJldhKCKwDksdnuNHbEJuwO5pjEdtwdHj/kZLxaS84s5R1NLgYfAuDF/VZ4whYABJJvv+o0O8TXLm+F/Byw==", + "dev": true, + "requires": { + "ethereumjs-util": "*" + } + }, + "@types/google-protobuf": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.7.3.tgz", + "integrity": "sha512-FRwj40euE2bYkG+0X5w2nEA8yAzgJRcEa7RBd0Gsdkb9/tPM2pctVVAvnOUTbcXo2VmIHPo0Ae94Gl9vRHfKzg==", + "dev": true + }, + "@types/hyperscript": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/hyperscript/-/hyperscript-0.0.4.tgz", + "integrity": "sha512-oZIYTxzfTYM6KNXwN3PPS5dow3KmjDcMDRF6iSxqidJSyw4kwo6yJlxrY/KrCc+0J14x0CflmZRApbcdLvwDiw==", "dev": true }, "@types/node": { - "version": "14.0.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.9.tgz", - "integrity": "sha512-0sCTiXKXELOBxvZLN4krQ0FPOAA7ij+6WwvD0k/PHd9/KAkr4dXel5J9fh6F4x1FwAQILqAWkmpeuS6mjf1iKA==" + "version": "14.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.1.tgz", + "integrity": "sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==" }, "@types/pbkdf2": { "version": "3.1.0", @@ -1670,6 +1269,15 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, + "@types/ramda": { + "version": "0.27.19", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.19.tgz", + "integrity": "sha512-BAeH07a6pRfFyoTuwhWJeNNHucbMlwh+imkO2BKOTZ6wpAElOAPyhBdyP1hx4W4sCPDnV/5UetcjZ/RT5lcMTA==", + "dev": true, + "requires": { + "ts-toolbelt": "^6.3.3" + } + }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -1684,16 +1292,10 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, "acorn-globals": { @@ -1707,9 +1309,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } @@ -1721,9 +1323,10 @@ "dev": true }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1738,15 +1341,16 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -1781,54 +1385,6 @@ } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": 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==", - "dev": 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==", - "dev": 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==", - "dev": 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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1872,6 +1428,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -1918,7 +1475,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "assign-symbols": { "version": "1.0.0", @@ -1941,7 +1499,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "atob": { "version": "2.1.2", @@ -1952,12 +1511,14 @@ "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=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", @@ -1978,12 +1539,6 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -2026,7 +1581,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base": { "version": "0.11.2", @@ -2083,11 +1639,6 @@ } } }, - "base-58": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/base-58/-/base-58-0.0.1.tgz", - "integrity": "sha1-hdPnAlEHVmGTM4j4MdHri49jFOM=" - }, "base-x": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", @@ -2097,15 +1648,16 @@ } }, "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -2145,6 +1697,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2239,21 +1792,13 @@ } }, "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "^5.0.0", + "bn.js": "^4.1.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==", - "dev": true - } } }, "browserify-sign": { @@ -2299,16 +1844,15 @@ } }, "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001165", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", - "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" } }, "bs58": { @@ -2380,16 +1924,6 @@ "unset-value": "^1.0.0" } }, - "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" - } - }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2433,20 +1967,22 @@ } }, "caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "version": "1.0.30001137", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001137.tgz", + "integrity": "sha512-54xKQZTqZrKVHmVz0+UvdZR6kQc7pJDgfhsMYDG19ID1BWoNnDMFm5Q3uSBSU401pBvKYMsHAt9qhEDcxmk8aw==", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2473,12 +2009,6 @@ "upath": "^1.1.1" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2543,12 +2073,6 @@ "q": "^1.1.2" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -2560,19 +2084,20 @@ } }, "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "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==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -2580,28 +2105,24 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2627,7 +2148,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -2679,12 +2201,6 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2715,17 +2231,18 @@ "dev": true }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "dev": true, "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -2740,7 +2257,8 @@ "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cosmiconfig": { "version": "5.2.1", @@ -2793,19 +2311,13 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "crypto-browserify": { @@ -2857,6 +2369,12 @@ "postcss-modules-values": "1.3.0" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -2901,6 +2419,21 @@ "supports-color": "^3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -2948,20 +2481,12 @@ "requires": { "mdn-data": "2.0.4", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", "dev": true }, "cssesc": { @@ -3048,34 +2573,28 @@ "dev": true }, "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "requires": { - "css-tree": "^1.1.2" + "css-tree": "1.0.0-alpha.39" }, "dependencies": { "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", "dev": true, "requires": { - "mdn-data": "2.0.14", + "mdn-data": "2.0.6", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", "dev": true } } @@ -3099,6 +2618,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -3115,22 +2635,30 @@ } }, "deasync": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.21.tgz", - "integrity": "sha512-kUmM8Y+PZpMpQ+B4AuOW9k2Pfx/mSupJtxOsLzmnHY2WqZUYRFccFn2RhzPAqt3Xb+sorK/badW2D4zNzqZz5w==", + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.20.tgz", + "integrity": "sha512-E1GI7jMI57hL30OX6Ht/hfQU8DO4AuB9m72WFm4c38GNbUD4Q03//XZaOIHZiY+H1xUaomcot5yk2q/qIZQkGQ==", "dev": true, "requires": { "bindings": "^1.5.0", "node-addon-api": "^1.7.1" + }, + "dependencies": { + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true + } } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decode-uri-component": { @@ -3139,12 +2667,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "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==", - "dev": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -3172,6 +2694,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -3220,12 +2743,7 @@ "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=", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "depd": { @@ -3250,12 +2768,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -3278,15 +2790,15 @@ }, "dependencies": { "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true } } @@ -3397,6 +2909,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -3409,9 +2922,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.622", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.622.tgz", - "integrity": "sha512-AJT0Fm1W0uZlMVVkkJrcCVvczDuF8tPm3bwzQf5WO8AaASB2hwTRP7B8pU5rqjireH+ib6am8+hH5/QkXzzYKw==", + "version": "1.3.573", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.573.tgz", + "integrity": "sha512-oypaNmexr8w0m2GX67fGLQ0Xgsd7uXz7GcwaHZ9eW3ZdQ8uA2+V/wXmLdMTk3gcacbqQGAN7CXWG3fOkfKYftw==", "dev": true }, "elliptic": { @@ -3460,32 +2973,35 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "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==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -3493,9 +3009,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", "dev": true }, "escape-html": { @@ -3507,7 +3023,8 @@ "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=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.9.1", @@ -3520,15 +3037,6 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } } }, "esprima": { @@ -3578,17 +3086,23 @@ } }, "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==", + "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": "^4.11.0", + "bn.js": "^5.1.2", "create-hash": "^1.1.2", - "elliptic": "^6.5.2", "ethereum-cryptography": "^0.1.3", "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "rlp": "^2.2.4" + }, + "dependencies": { + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + } } }, "ethjs-util": { @@ -3668,7 +3182,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "3.0.2", @@ -3759,7 +3274,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "falafel": { "version": "2.2.4", @@ -3782,9 +3298,10 @@ } }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "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==", + "dev": true }, "fast-glob": { "version": "2.2.7", @@ -3803,7 +3320,8 @@ "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -3867,18 +3385,25 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "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==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, + "fp-ts": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.8.3.tgz", + "integrity": "sha512-oGD3BTSzFCPs9alaI/2gh0SCNKyhPXkpeIBvkXNvnoczHfDAUd2HHtotCdLO0hOTTTTx8VKA0mhhR7LUNo+cKg==" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -3894,25 +3419,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "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==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3933,40 +3439,14 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true }, "get-port": { "version": "3.2.0", @@ -3984,6 +3464,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -4043,7 +3524,8 @@ "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==" + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "grapheme-breaker": { "version": "0.3.2", @@ -4055,31 +3537,19 @@ "unicode-trie": "^0.3.1" } }, - "grpc-tools": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.9.1.tgz", - "integrity": "sha512-t2JFMPLjxcgwVSJwFEauFaoEiO56kijxSwehQDgZNR/hrStJCH0pHGsjqJNuCOvmI9Z31pYOfgj4zeInTQWh5A==", - "dev": true, - "requires": { - "node-pre-gyp": "^0.15.0" - } - }, - "grpc-web": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/grpc-web/-/grpc-web-1.2.1.tgz", - "integrity": "sha512-ibBaJPzfMVuLPgaST9w0kZl60s+SnkPBQp6QKdpEr85tpc1gXW2QDqSne9xiyiym0logDfdUSm4aX5h9YBA2mw==" - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -4087,6 +3557,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -4098,22 +3569,26 @@ "dev": true, "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=", + "dev": true + } } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": 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-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "has-value": { @@ -4186,7 +3661,8 @@ "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true }, "hsl-regex": { "version": "1.0.0", @@ -4200,6 +3676,11 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, + "htm": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/htm/-/htm-3.0.4.tgz", + "integrity": "sha512-VRdvxX3tmrXuT/Ovt59NMp/ORMFi4bceFMDjos1PV4E0mV+5votuID8R60egR9A4U8nLt238R/snlJGz3UYiTQ==" + }, "html-comment-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", @@ -4222,27 +3703,25 @@ "dev": true }, "htmlnano": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.8.tgz", - "integrity": "sha512-q5gbo4SIDAE5sfJ5V0UD6uu+n1dcO/Mpr0B6SlDlJBoV7xKPne4uG4UwrT8vUWjdjIPJl95TY8EDuEbBW2TG0A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.6.tgz", + "integrity": "sha512-HUY/99maFsWX2LRoGJpZ/8QRLCkyY0UU1El3wgLLFAHQlD3mCxCJJNcWJk5SBqaU49MLhIWVDW6cGBeuemvaPQ==", "dev": true, "requires": { "cssnano": "^4.1.10", - "posthtml": "^0.13.4", - "posthtml-render": "^1.3.0", + "normalize-html-whitespace": "^1.0.0", + "posthtml": "^0.13.1", + "posthtml-render": "^1.2.2", "purgecss": "^2.3.0", - "relateurl": "^0.2.7", - "srcset": "^3.0.0", "svgo": "^1.3.2", "terser": "^4.8.0", - "timsort": "^0.3.0", "uncss": "^0.17.3" }, "dependencies": { "posthtml": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.13.4.tgz", - "integrity": "sha512-i2oTo/+dwXGC6zaAQSF6WZEQSbEqu10hsvg01DWzGAfZmy31Iiy9ktPh9nnXDfZiYytjxTIvxoK4TI0uk4QWpw==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.13.3.tgz", + "integrity": "sha512-5NL2bBc4ihAyoYnY0EAQrFQbJNE1UdvgC1wjYts0hph7jYeU2fa5ki3/9U45ce9V6M1vLMEgUX2NXe/bYL+bCQ==", "dev": true, "requires": { "posthtml-parser": "^0.5.0", @@ -4250,20 +3729,14 @@ } }, "posthtml-parser": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.5.3.tgz", - "integrity": "sha512-uHosRn0y+1wbnlYKrqMjBPoo/kK5LPYImLtiETszNFYfFwAD3cQdD1R2E13Mh5icBxkHj+yKtlIHozCsmVWD/Q==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.5.0.tgz", + "integrity": "sha512-BsZFAqOeX9lkJJPKG2JmGgtm6t++WibU7FeS40FNNGZ1KS2szRSRQ8Wr2JLvikDgAecrQ/9V4sjugTAin2+KVw==", "dev": true, "requires": { "htmlparser2": "^3.9.2" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "terser": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", @@ -4308,6 +3781,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -4336,20 +3810,11 @@ "dev": true }, "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -4388,11 +3853,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } }, "is-absolute-url": { "version": "2.1.0", @@ -4423,7 +3891,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-binary-path": { "version": "1.0.1", @@ -4441,9 +3910,10 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "dev": true }, "is-color-stop": { "version": "1.1.0", @@ -4482,7 +3952,8 @@ "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==" + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true }, "is-descriptor": { "version": "0.1.6", @@ -4521,15 +3992,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -4554,9 +4016,9 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", "dev": true }, "is-number": { @@ -4595,11 +4057,12 @@ } }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "is-resolvable": { @@ -4621,6 +4084,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, "requires": { "has-symbols": "^1.0.1" } @@ -4628,7 +4092,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-url": { "version": "1.2.4", @@ -4657,7 +4122,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", @@ -4668,7 +4134,8 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "js-sha3": { "version": "0.8.0", @@ -4682,9 +4149,9 @@ "dev": true }, "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==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4702,7 +4169,8 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true }, "jsdom": { "version": "14.1.0", @@ -4739,9 +4207,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "escodegen": { @@ -4763,13 +4231,6 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -4790,44 +4251,41 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "^1.2.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" + "minimist": "^1.2.0" } }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -4842,13 +4300,6 @@ "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" - }, - "dependencies": { - "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==" - } } }, "kind-of": { @@ -4882,6 +4333,21 @@ } } }, + "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 + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4896,6 +4362,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -4942,11 +4409,14 @@ "chalk": "^2.0.1" } }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } }, "magic-string": { "version": "0.22.5", @@ -4974,13 +4444,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true } } }, @@ -5018,7 +4481,8 @@ "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true }, "merge-source-map": { "version": "1.0.4", @@ -5027,6 +4491,14 @@ "dev": true, "requires": { "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "merge2": { @@ -5075,12 +4547,14 @@ "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, "requires": { "mime-db": "1.44.0" } @@ -5105,6 +4579,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5115,30 +4590,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "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==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mithril": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mithril/-/mithril-2.0.4.tgz", - "integrity": "sha512-mgw+DMZlhMS4PpprF6dl7ZoeZq5GGcAuWnrg5e12MvaGauc4jzWsDZtVGRCktsiQczOEUr2K5teKbE5k44RlOg==" - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -5169,6 +4620,11 @@ "minimist": "^1.2.5" } }, + "monocle-ts": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/monocle-ts/-/monocle-ts-2.3.3.tgz", + "integrity": "sha512-pcQyauWO2vapxyZgbhTd73Dv8TmTELx1rL81bvrtPO2sUYTi1MIHmw3j/iMyeNaJwTmnGNAjqJpYV8Gq1Eu68g==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5208,38 +4664,16 @@ "dev": true, "optional": true }, - "needle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", - "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true + "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-forge": { "version": "0.7.6", @@ -5323,73 +4757,28 @@ } } }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "dev": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "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.4.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", "dev": true }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } + "normalize-html-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz", + "integrity": "sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==", + "dev": true }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "normalize-path": { @@ -5404,36 +4793,11 @@ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", @@ -5446,18 +4810,6 @@ "string.prototype.padend": "^3.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -5467,12 +4819,6 @@ "boolbase": "~1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -5482,7 +4828,8 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5522,14 +4869,16 @@ } }, "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==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object-visit": { "version": "1.0.1", @@ -5540,159 +4889,71 @@ "isobject": "^3.0.0" } }, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "dev": true, "requires": { - "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" }, "dependencies": { "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==", + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", "dev": true, "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-callable": "^1.2.0", "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", + "object.assign": "^4.1.0", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "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==", - "dev": true, - "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.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.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=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5755,23 +5016,6 @@ "log-symbols": "^2.2.0", "strip-ansi": "^4.0.0", "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "os-browserify": { @@ -5780,28 +5024,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -5873,35 +5095,6 @@ "terser": "^3.7.3", "v8-compile-cache": "^2.0.0", "ws": "^5.1.1" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "parse-asn1": { @@ -5921,6 +5114,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -5965,25 +5159,28 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { "pify": "^3.0.0" } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "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", @@ -5995,7 +5192,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "physical-cpu-count": { "version": "2.0.0", @@ -6006,12 +5204,14 @@ "pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==" + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "pn": { "version": "1.1.0", @@ -6026,9 +5226,9 @@ "dev": true }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", + "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -6036,12 +5236,6 @@ "supports-color": "^6.1.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -6054,9 +5248,9 @@ } }, "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", + "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", "dev": true, "requires": { "postcss": "^7.0.27", @@ -6250,12 +5444,6 @@ "source-map": "^0.6.1", "supports-color": "^5.4.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -6279,12 +5467,6 @@ "source-map": "^0.6.1", "supports-color": "^5.4.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -6308,12 +5490,6 @@ "source-map": "^0.6.1", "supports-color": "^5.4.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -6337,12 +5513,6 @@ "source-map": "^0.6.1", "supports-color": "^5.4.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -6541,11 +5711,16 @@ } }, "posthtml-render": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", - "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.2.3.tgz", + "integrity": "sha512-rGGayND//VwTlsYKNqdILsA7U/XP0WJa6SMcdAEoqc2WRM5QExplGg/h9qbTuHz7mc2PvaXU+6iNxItvr5aHMg==", "dev": true }, + "preact": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.5.7.tgz", + "integrity": "sha512-4oEpz75t/0UNcwmcsjk+BIcDdk68oao+7kxcpc1hQPNs2Oo3ZL9xFz8UBf350mxk/VEdD41L5b4l2dE3Ug3RYg==" + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6564,35 +5739,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "protobufjs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", - "integrity": "sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "@types/node": { - "version": "13.13.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz", - "integrity": "sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==", - "dev": true - } - } - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -6603,7 +5749,8 @@ "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, "public-encrypt": { "version": "4.0.3", @@ -6622,7 +5769,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "purgecss": { "version": "2.3.0", @@ -6653,12 +5801,6 @@ "supports-color": "^6.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -6679,7 +5821,8 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystring": { "version": "0.2.0", @@ -6705,9 +5848,9 @@ } }, "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" }, "randombytes": { "version": "2.1.0", @@ -6733,22 +5876,11 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -6809,9 +5941,9 @@ } }, "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, "regenerate-unicode-properties": { @@ -6826,7 +5958,8 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true }, "regenerator-transform": { "version": "0.14.5", @@ -6884,12 +6017,6 @@ } } }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -6912,6 +6039,7 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -6959,6 +6087,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -7046,7 +6175,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sax": { "version": "1.2.4", @@ -7076,19 +6206,13 @@ "elliptic": "^6.5.2", "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" - }, - "dependencies": { - "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==" - } } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "send": { "version": "0.17.1", @@ -7154,12 +6278,6 @@ "send": "0.17.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -7213,6 +6331,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -7220,12 +6339,14 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shell-quote": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true }, "signal-exit": { "version": "3.0.3", @@ -7298,6 +6419,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "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 } } }, @@ -7373,9 +6500,9 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-resolve": { @@ -7399,14 +6526,6 @@ "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==", - "dev": true - } } }, "source-map-url": { @@ -7419,6 +6538,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -7427,12 +6547,14 @@ "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7441,7 +6563,8 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true }, "split-string": { "version": "3.1.0", @@ -7458,16 +6581,11 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "srcset": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-3.0.0.tgz", - "integrity": "sha512-D59vF08Qzu/C4GAOXVgMTLfgryt5fyWo93FZyhEWANo0PokFz/iWdDe13mX3O5TRf6l8vMTqckAfR4zPiaH0yQ==", - "dev": true - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -7513,13 +6631,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, @@ -7703,21 +6814,11 @@ } } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "string.prototype.padend": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" @@ -7727,35 +6828,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - }, "string.prototype.trimstart": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -7770,18 +6853,19 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-hex-prefix": { "version": "1.0.0", @@ -7791,12 +6875,6 @@ "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=", - "dev": true - }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", @@ -7825,6 +6903,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -7856,21 +6935,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": 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" - } - }, "terser": { "version": "3.17.0", "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", @@ -7880,14 +6944,6 @@ "commander": "^2.19.0", "source-map": "~0.6.1", "source-map-support": "~0.5.10" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "through2": { @@ -7933,9 +6989,9 @@ } }, "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -8017,6 +7073,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -8031,6 +7088,12 @@ "punycode": "^2.1.0" } }, + "ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "dev": true + }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", @@ -8047,6 +7110,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -8054,7 +7118,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true }, "type-check": { "version": "0.3.2", @@ -8072,9 +7137,9 @@ "dev": true }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", "dev": true }, "uncss": { @@ -8175,11 +7240,6 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, "unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", @@ -8233,9 +7293,10 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -8307,18 +7368,20 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -8334,6 +7397,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -8417,17 +7481,9 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "isexe": "^2.0.0" } }, "word-wrap": { @@ -8468,12 +7524,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } } diff --git a/package.json b/package.json index 9d306dc..bff064a 100644 --- a/package.json +++ b/package.json @@ -1,62 +1,46 @@ { "name": "@tgrospic/rnode-client-js", "version": "0.8.0", - "description": "RNode sample client: nodejs & web", + "description": "RNode sample client for Web", "author": "Tomislav Grospic", "license": "MIT", - "main": "src/index.js", + "types": "dist-types", "scripts": { - "start:nodejs": "node src/nodejs/client", - "start:web": "parcel src/web/index.html", - "build:web": "npm-run-all clean build", - "build": "parcel build --public-url ./ src/web/index.html", - "rnode-generate": "rnode-grpc --rnode-version v0.9.25", - "rnode-generate-dev": "rnode-grpc --rnode-version dev --gen-dir rnode-grpc-dev", - "clean": "rimraf dist .cache", - "clean:all": "rimraf dist .cache rnode-grpc-gen node_modules", - "gh-pages": "npm run build-web && git checkout gh-pages && rm web.* style.* && cp dist/* . && git add ." + "start": "run-p start:parcel start:ts", + "start:parcel": "parcel src/index.html", + "start:ts": "npm run build:ts -- -w", + "build": "npm-run-all clean build:parcel build:ts", + "build:parcel": "parcel build --public-url ./ src/index.html", + "build:ts": "tsc", + "clean": "rimraf dist dist-types .cache", + "clean:all": "rimraf dist dist-types .cache node_modules", + "gh-pages": "npm run build && git checkout gh-pages && rm web.* style.* && cp dist/* . && rm -r dist dist-types .cache node_modules && git add ." }, "dependencies": { - "@babel/runtime": "^7.11.2", - "@grpc/grpc-js": "^0.6.5", - "@tgrospic/rnode-grpc-js": "^0.8.5", + "@tgrospic/rnode-http-js": "^0.1.7", "blakejs": "^1.1.0", + "bs58": "^4.0.1", "elliptic": "^6.5.3", - "ethereumjs-util": "^6.2.1", + "ethereumjs-util": "^7.0.7", + "fp-ts": "^2.8.3", "google-protobuf": "^3.13.0", - "grpc-web": "^1.2.1", - "mithril": "^2.0.4", - "npm-run-all": "^4.1.5", - "ramda": "^0.26.1" + "htm": "^3.0.4", + "js-sha3": "^0.8.0", + "monocle-ts": "^2.3.3", + "preact": "^10.5.3", + "ramda": "^0.27.1" }, "devDependencies": { - "@babel/core": "^7.11.4", - "@babel/plugin-transform-runtime": "^7.11.0", + "@types/bs58": "^4.0.1", "@types/elliptic": "^6.4.10", - "grpc-tools": "^1.9.1", + "@types/ethereumjs-util": "^6.1.0", + "@types/google-protobuf": "^3.7.3", + "@types/hyperscript": "0.0.4", + "@types/ramda": "^0.27.19", "less": "^3.12.2", + "npm-run-all": "^4.1.5", "parcel": "^1.12.4", - "protobufjs": "^6.10.1", "rimraf": "^3.0.0", - "typescript": "^3.9.7" - }, - "babel": { - "presets": [ - [ - "@babel/preset-env", - { - "useBuiltIns": "usage", - "corejs": 3, - "shippedProposals": true - } - ] - ], - "plugins": [ - "@babel/transform-runtime", - {} - ] - }, - "engines": { - "node": ">=8.0.0" + "typescript": "^4.0.3" } } diff --git a/src/controls/address-ctrl.tsx b/src/controls/address-ctrl.tsx new file mode 100644 index 0000000..3254205 --- /dev/null +++ b/src/controls/address-ctrl.tsx @@ -0,0 +1,130 @@ +import * as R from 'ramda' +import { newRevAccount, createRevAccount, RevAccount } from '@tgrospic/rnode-http-js' +import { ethereumAddress, ethDetected } from '@tgrospic/rnode-http-js' +import { h, labelStyle, Cell } from './common' + +export interface AddressSt extends RevAccount { + text: string +} + +export interface AddressActions { + readonly wallet: RevAccount[] + readonly onAddAccount: (acc: RevAccount) => void +} + +export const addressCtrl = (st: Cell, {wallet, onAddAccount}: AddressActions) => { + const updateAddress = (text: string) => { + // Account from private key, public key, ETH or REV address + const revAccount = createRevAccount(text) || {} + + // Update state and display + st.set({text, ...revAccount}) + } + + const addAccount = () => { + const account = {name, privKey, pubKey, ethAddr, revAddr} + onAddAccount(account) + clear() + } + + const clear = () => { + st.set({text: ''}) + } + + const fillMetamaskAccountEv = async () => { + const ethAddr = await ethereumAddress() + updateAddress(ethAddr) + } + + const addrKeyPressEv = (ev: any) => { + const text = ev.target.value + updateAddress(text) + } + + const nameKeyPressEv = (ev: any) => { + const nameVal = ev.target.value + st.update(s => ({...s, name: nameVal})) + } + + const newRevAddrEv = () => { + const {privKey} = newRevAccount() + updateAddress(privKey as string) + } + + const updateEv = (revAddr: string) => () => { + const acc = wallet.find(R.propEq('revAddr', revAddr)) as RevAccount + st.set(acc) + } + + // Control state + const {text, privKey, pubKey, ethAddr, revAddr, name} = st.view({}) + + const description = + + Any address used on this page must be first added as an account and assign a name. All accounts are then shown in dropdown menus to select as send or receive address. +
+ Entered information is not stored anywhere except on the page. After exit or refresh the page, all information is lost. +
+ + const labelSource = 'REV address / ETH address / Public key / Private key' + const metamaskTitle = 'Copy ETH address from selected Metamask account' + const newAccountTitle = 'Generate new private key (public key, ETH, REV)' + const saveTitle = 'Save account with assigned name' + const closeTitle = 'Cancel edit of account' + const namePlaceholder = 'Friendly name for account' + const addDisabled = !name || !name.trim() + const isEdit = !!revAddr + + return
+

REV wallet (import REV address, ETH address, public/private key, Metamask)

+ {description} + + {/* Input textbox */} +
{labelSource}
+ + + {/* New accounts */} + {ethDetected && + + } + + + {/* Edit wallet item */} + {isEdit && +
+ + {privKey && } + {pubKey && } + {ethAddr && } + +
Private key{privKey}
Public key {pubKey}
ETH {ethAddr}
REV {revAddr}
+ {/* Action buttons */} + + + +
+ } + + {/* Wallet display */} + {wallet && !!wallet.length && + + + + + {wallet.map(({name, privKey = '', pubKey = '', ethAddr = '', revAddr}) => { + const rev = revAddr.slice(0, 10) + const eth = ethAddr.slice(0, 10) + const pub = pubKey.slice(0, 10) + const priv = privKey.slice(0, 5) + return + + + + + + + })} +
AccountREVETHPUBLICPRIVATE
{rev}{eth}{pub}{priv ? : ''}
+ } +
+} diff --git a/src/controls/balance-ctrl.tsx b/src/controls/balance-ctrl.tsx new file mode 100644 index 0000000..7ac18e8 --- /dev/null +++ b/src/controls/balance-ctrl.tsx @@ -0,0 +1,69 @@ +import * as R from 'ramda' +import { RevAccount } from '@tgrospic/rnode-http-js' +import { h, labelStyle, showRevDecimal, showNetworkError, Cell } from './common' + +export interface BalanceSt { + readonly dataBal: string + readonly dataError: string + readonly account: RevAccount +} + +export interface BalanceActions { + readonly wallet: RevAccount[] + readonly onCheckBalance: (revAddress: string) => Promise<[number, string]> +} + +const initSelected = (st: BalanceSt, wallet: RevAccount[]) => { + const {account} = st + + // Pre-select first account if not selected + const selAccount = R.isNil(account) && !R.isNil(wallet) + ? R.head(wallet) as RevAccount : account + + return {...st, account: selAccount} +} + +export const balanceCtrl = (st: Cell, {wallet = [], onCheckBalance}: BalanceActions) => { + const checkBalanceEv = (account: RevAccount) => async () => { + st.update(s => ({...s, dataBal: '...', dataError: ''})) + + const [bal, dataError] = await onCheckBalance(account.revAddr) + .catch(ex => ['', ex.message]) + + const dataBal = typeof bal === 'number' + ? bal === 0 ? `${bal}` : `${bal} (${showRevDecimal(`${bal}`)} REV)` : '' + st.update(s => ({...s, dataBal, dataError})) + } + + const accountChangeEv = (ev: any) => { + const account = R.find(R.propEq('revAddr', ev.target.value), wallet) as RevAccount + st.set({account}) + } + + const labelAddr = 'REV address' + const isWalletEmpty = R.isNil(wallet) || R.isEmpty(wallet) + + // Control state + const {account, dataBal, dataError} = initSelected(st.view({}), wallet) + + return
+

Check REV balance

+ {isWalletEmpty ? REV wallet is empty, add accounts to check balance. : + <> +
Sends exploratory deploy to selected read-only RNode.
+ {/* REV address dropdown */} +
{labelAddr}
+ + {/* Action button / results */} +
+ + {dataBal} + {showNetworkError(dataError)} + + } +
+} diff --git a/src/controls/common.ts b/src/controls/common.ts new file mode 100644 index 0000000..7e42f24 --- /dev/null +++ b/src/controls/common.ts @@ -0,0 +1,152 @@ +import * as R from 'ramda' + +import { VNode, render } from 'preact' +export { h } from 'preact' +import { html as html_ } from 'htm/preact' +export const html = html_ + +import * as Opt from 'fp-ts/lib/Option' +import { Lens, Optional } from 'monocle-ts' + +export type ConsoleLog = {log: typeof console.log} +export type ConsoleWarn = {warn: typeof console.warn} + +export type CtrlView = (st: Cell, actions: E) => VNode + +// Wraps Virtual DOM renderer to render state +export const makeRenderer = (element: Element, view: CtrlView) => (state: Partial, actions: Eff) => { + const stateCell = mkCell() + const renderCtrl = () => render(view(stateCell, actions), element) + stateCell.setListener(renderCtrl) + stateCell.set(state) +} + +// Common styles + +const labelBaseStyle = { 'font-size': '.8rem', padding: '2px 0 0 0', transition: 'all 1s' } + +const styleShowHide = (isVis: Boolean) => ({ opacity: isVis ? .65 : 0, height: isVis ? 'auto' : 0 }) + +export const labelStyle = (isVis: Boolean) => ({ style: {...labelBaseStyle, ...styleShowHide(isVis) } }) + +export const showRevDecimal = (amount: string) => { + const d = 8 // decimal places + const amountNr = parseInt(amount) + const amountStr = isNaN(amountNr) ? '' : `${amountNr}` + const length = amountStr.length + const trimZeroes = (s: string) => s.replace(/[\.]?[0]*$/ig, '') + if (length === 0) return '' + if (length <= d) { + const padded = amountStr.padStart(d, '0') + return trimZeroes(`0.${padded}`) + } else if (length > d) { + const prefix = amountStr.slice(0, -d) + const suffix = amountStr.slice(-d) + return trimZeroes(`${prefix}.${suffix}`) + } else return '' +} + +export const labelRev = (amount: string) => + amount && html`${amount} REV` + +export const blockEventKey = (regex: RegExp) => (ev: KeyboardEvent) => { + console.log({ev: ev}) + if (ev.key.match(regex)) { + ev.preventDefault() + } +} + +export const showNetworkError = (errMessage: string) => + errMessage == 'Failed to fetch' + ? `${errMessage}: select a running RNode from the above selector.` + : errMessage + +const idLens = () => new Lens(a => a, a => _ => a) + +export interface Cell { + readonly view: (def?: Partial) => State + readonly set: (v: Partial) => void + readonly update: (f: (a: State) => State) => void + readonly ol: (compLens: Lens) => Cell + readonly o:

(prop: P) => Cell + // readonly oo: (compLens: Optional) => Cell +} + +interface CellWithListener extends Cell { + setListener: (f: any) => void +} + +// State cell +export const mkCell = () => { + let _stRef: State, _listener: (f: any) => void + + const stCell = function (lens: Optional): Cell { + return >{ + view: (def?: Partial) => { + const res = lens.getOption(_stRef) + return Opt.option.reduce(res, def, (_, a) => R.isNil(a) ? def : a) + }, + set: (v: State1) => { + _stRef = lens.set(v)(_stRef) + // Trigger event (render) + _listener(_stRef) + }, + update: (f: (a: State1) => State1) => { + const s = lens.getOption(_stRef) + _stRef = lens.modify(f)(_stRef) + // Trigger event (render) + _listener(_stRef) + }, + // Compose lenses / make sub cells + ol: (compLens: Lens) => { + const subLens = lens.composeLens(compLens) + return stCell(subLens) + }, + o:

(prop: P) => { + const compLens = Lens.fromProp()(prop) + // const compLens = Optional.fromNullableProp()(prop) + // const compLens = Optional.fromPath()([prop]) + const subLens = lens.composeLens(compLens) + return stCell(subLens) + }, + // oo: (compLens: Optional) => { + // const subLens = lens.compose(compLens) + // return stCell(subLens) + // }, + } + } + return { + ...stCell(idLens().asOptional()), + // Set event (on-change) listener + setListener: f => { _listener = f }, + } as CellWithListener +} + +export type PageLogArgs = {document: Document} & ConsoleLog + +export const pageLog = ({log, document}: PageLogArgs) => { + // Page logger + const logEL = document.querySelector('#log') + const logWrap = (...args: any[]) => { + const lines = Array.from(args).map(x => { + const f = (_: any, v: any) => v && v.buffer instanceof ArrayBuffer + ? Array.from(v).toString() : v + return JSON.stringify(x, f, 2).replace(/\\n/g, '
') + }) + const el = document.createElement('pre') + el.innerHTML = lines.join(' ') + logEL?.prepend(el) + log(...args) + } + return logWrap +} + +// Prevents default redirect for link
+export const handleHashHref = (ev: Event) => { + const target = ev.target as Element + const isHrefHash = target + && target.nodeName === 'A' + && target.attributes.getNamedItem('href')?.value === '#' + + if (isHrefHash) ev.preventDefault() +} diff --git a/src/controls/custom-deploy-ctrl.tsx b/src/controls/custom-deploy-ctrl.tsx new file mode 100644 index 0000000..d078de6 --- /dev/null +++ b/src/controls/custom-deploy-ctrl.tsx @@ -0,0 +1,171 @@ +import * as R from 'ramda' +import { RevAccount } from '@tgrospic/rnode-http-js' +import { NodeUrls } from '../rchain-networks' +import { h, labelStyle, showRevDecimal, labelRev, showNetworkError, Cell, blockEventKey } from './common' + +const sampleReturnCode = `new return(\`rho:rchain:deployId\`) in { + return!((42, true, "Hello from blockchain!")) +}` + +const sampleInsertToRegistry = `new return(\`rho:rchain:deployId\`), + insertArbitrary(\`rho:registry:insertArbitrary\`) +in { + new uriCh, valueCh in { + insertArbitrary!("My value", *uriCh) | + for (@uri <- uriCh) { + return!(("URI", uri)) + } + } +}` + +const sampleRegistryLookup = `new return(\`rho:rchain:deployId\`), + lookup(\`rho:registry:lookup\`) +in { + new valueCh in { + // Fill in registry URI: \`rho:id:11fhnau8j3...h4459w9bpus6oi\` + lookup!( , *valueCh) | + for (@value <- valueCh) { + return!(("Value from registry", value)) + } + } +}` + +const samples = [ + ['return data', sampleReturnCode], + ['insert to registry', sampleInsertToRegistry], + ['registry lookup', sampleRegistryLookup], +] + +export interface CustomDeploySt { + selRevAddr: string + code: string + phloLimit: string + status: string + dataError: string + proposeStatus: string + proposeError: string +} + +export type SendDeployArgs = {code: string, account: RevAccount, phloLimit: string} + +export interface CustomDeployActions { + readonly wallet: RevAccount[] + readonly node: NodeUrls + onSendDeploy(d: SendDeployArgs): Promise + onPropose(node: NodeUrls): Promise + warn: typeof console.warn +} + +const initSelected = (st: CustomDeploySt, wallet: RevAccount[]) => { + const {selRevAddr, phloLimit = '250000'} = st + + // Pre-select first account if not selected + const initRevAddr = R.isNil(selRevAddr) && !R.isNil(wallet) && !!wallet.length + ? R.head(wallet)?.revAddr : selRevAddr + + return {...st, selRevAddr: initRevAddr, phloLimit} +} + +export const customDeployCtrl = (st: Cell, {wallet = [], node, onSendDeploy, onPropose, warn}: CustomDeployActions) => { + const onSendDeployEv = (code: string) => async () => { + st.update(s => ({...s, status: '...', dataError: ''})) + + const account = R.find(R.propEq('revAddr', selRevAddr), wallet) as RevAccount + const [status, dataError] = await onSendDeploy({code, account, phloLimit}) + .then(x => [x, '']) + .catch(ex => { + warn('DEPLOY ERROR', ex) + return ['', ex.message] + }) + + st.update(s => ({...s, status, dataError})) + } + + const onProposeEv = async () => { + st.update(s => ({...s, proposeStatus: '...', proposeError: ''})) + + const [proposeStatus, proposeError] = await onPropose(node) + .then(x => [x, '']) + .catch(ex => ['', ex.message]) + + st.update(s => ({...s, proposeStatus, proposeError})) + } + + const accountChangeEv = (ev: any) => { + const { revAddr } = wallet[ev.target.selectedIndex] + st.update(s => ({...s, selRevAddr: revAddr})) + } + + const updateCodeEv = (code: string) => () => { + st.update(s => ({...s, code})) + } + + // Field update by name + const valEv = (name: keyof CustomDeploySt) => (ev: any) => { + const val = ev.target.value + st.update(s => ({...s, [name]: val})) + } + + // Control state + const {selRevAddr, code, phloLimit, status, dataError, proposeStatus, proposeError} + = initSelected(st.view({}), wallet) + + const labelAddr = 'Signing account' + const labelCode = 'Rholang code' + const labelPhloLimit = 'Phlo limit (in revlettes x10^8)' + const isWalletEmpty = R.isNil(wallet) || R.isEmpty(wallet) + const showPropose = node.network === 'localnet' + const canDeploy = (code || '').trim() !== '' && !!selRevAddr + const phloLimitPreview = showRevDecimal(phloLimit) + + return

+

Custom deploy

+ {isWalletEmpty ? REV wallet is empty, add accounts to make deploys. : <> + Send deploy to selected validator RNode. + + {/* Rholang examples */} +
+ + {/* REV address dropdown */} +
{labelAddr}
+ + + {/* Rholang code (editor) */} +
{labelCode}
+ + + {/* Phlo limit */} +
{labelPhloLimit}
+ + {labelRev(phloLimitPreview)} + + {/* Action buttons / results */} +
+ + {status && {status}} + {dataError && {showNetworkError(dataError)}} + + {/* Propose */} +
+ {showPropose && } + {showPropose && proposeStatus && {proposeStatus}} + {showPropose && proposeError && {showNetworkError(proposeError)}} + } +
+} diff --git a/src/controls/main-ctrl.tsx b/src/controls/main-ctrl.tsx new file mode 100644 index 0000000..0bbed50 --- /dev/null +++ b/src/controls/main-ctrl.tsx @@ -0,0 +1,155 @@ +import * as R from 'ramda' +import { localNet, testNet, mainNet, getNodeUrls, RChainNetwork, NodeUrls, testNetBlockMerge, testNetLLBlockMerge } from '../rchain-networks' +import { ethDetected } from '@tgrospic/rnode-http-js' +import { newRevAccount, RevAccount } from '@tgrospic/rnode-http-js' +import { h, makeRenderer, handleHashHref, Cell } from './common' + +// Controls +import { selectorCtrl, SelectorSt } from './selector-ctrl' +import { addressCtrl, AddressSt } from './address-ctrl' +import { balanceCtrl, BalanceSt } from './balance-ctrl' +import { transferCtrl, TransferData, TransferSt } from './transfer-ctrl' +import { customDeployCtrl, CustomDeploySt, SendDeployArgs } from './custom-deploy-ctrl' +import { Lens } from 'monocle-ts' +import { Predicate } from 'fp-ts/lib/function' +import { AppRNodeEffects, ConsoleEff } from '../rnode-actions' + +/* + This will display the test page to select local, testnet, and mainnet validators + and make REV transfers and check balance. +*/ + +export interface AppState { + nets: RChainNetwork[] + wallet: RevAccount[] + // Control states + sel: SelectorSt + balance: BalanceSt + address: AddressSt + transfer: TransferSt + customDeploy: CustomDeploySt +} + +export type AppEffects = AppRNodeEffects & ConsoleEff + +const repoUrl = 'https://github.com/tgrospic/rnode-client-js' + +const mainCtrl = (st: Cell, effects: AppEffects) => { + const { appCheckBalance, appTransfer, appOfflineTransfer, appSendDeploy, appPropose, log, warn } = effects + + const onCheckBalance = (node: NodeUrls) => (revAddr: string) => appCheckBalance({node, revAddr}) + + const onTransfer = (node: NodeUrls, setStatus: (s: string) => any) => ({fromAccount, toAccount, amount}: TransferData) => + appTransfer({node, fromAccount, toAccount, amount, setStatus}) + + const onOfflineTransfer = (node: NodeUrls, setStatus: (s: string) => any) => ({fromAccount, toAccount, amount}: TransferData) => + appOfflineTransfer({node, fromAccount, toAccount, amount, setStatus}) + + const onSendDeploy = (node: NodeUrls, setStatus: (s: string) => any) => ({code, account, phloLimit}: SendDeployArgs) => + appSendDeploy({node, code, account, phloLimit, setStatus}) + + const onPropose = (node: NodeUrls) => () => appPropose(node) + + const appendUpdateLens = (pred: Predicate) => new Lens( + xs => R.find(pred, xs) as RevAccount, + x => xs => { + const idx = R.findIndex(pred, xs) + const apply = idx === -1 ? R.append : ((ys: any) => R.update(idx, ys)) + return apply(x)(xs) + }) + + const onSaveAccount = (account: RevAccount) => + st.o('wallet') + .ol(appendUpdateLens(R.propEq('revAddr', account.revAddr))) + .set(account) + + // State lenses for each control + const selSt = st.o('sel') + const addressSt = st.o('address') + const balanceSt = st.o('balance') + const transferSt = st.o('transfer') + const customDeploySt = st.o('customDeploy') + + const {nets, sel, wallet} = st.view() + const valNodeUrls = getNodeUrls(sel.valNode) + const readNodeUrls = getNodeUrls(sel.readNode) + + const setTransferStatus = transferSt.o('status').set + const setDeployStatus = customDeploySt.o('status').set + + // App render + return
+
+ Demo client for RNode {repoUrl} +

RNode client testing page

+
+ {/* Selector control */} +
+ {selectorCtrl(selSt, {nets})} + + {/* REV wallet control */} + {addressCtrl(addressSt, {wallet, onAddAccount: onSaveAccount})} + + {/* Check balance control */} + {balanceCtrl(balanceSt, {wallet, onCheckBalance: onCheckBalance(readNodeUrls)})} + + {/* Transfer REV control */} +
+ {transferCtrl(transferSt, { + wallet, warn, + onTransfer: onTransfer(valNodeUrls, setTransferStatus), + onOfflineTransfer: onOfflineTransfer(valNodeUrls, setTransferStatus), + })} + + {/* Custom deploy control */} +
+ {customDeployCtrl(customDeploySt, { + wallet, node: valNodeUrls, + onSendDeploy: onSendDeploy(valNodeUrls, setDeployStatus), + onPropose: onPropose(valNodeUrls), + warn, + })} +
+} + +const nets = [localNet, testNetLLBlockMerge, testNetBlockMerge, testNet, mainNet] + .map(network => { + const {title, name, hosts, readOnlys} = network + return { + title, name, + hosts: hosts.map(x => ({...x, title, name, network})), + readOnlys: readOnlys.map(x => ({...x, title, name, network})), + } + }) + +const defaultWallet: RevAccount[] = [ + { name: 'New account', ...newRevAccount() }, +] + +const initNet = nets[0] + +// Initial application state +const initialState: Partial = { + // Validators to choose + nets, + // Selected validator + sel: { valNode: initNet.hosts[0], readNode: initNet.readOnlys[0] }, + // Initial wallet + wallet: [], //defaultWallet, + + // transfer: { + // amount: '' + // } +} + +export const startApp = (element: Element, effects: AppEffects) => { + const { warn } = effects + + // App renderer / creates state cell that is passed to controls + const r = makeRenderer(element, mainCtrl) + + // Start app / the big bang! + r(initialState, effects) + + warn('ETH detected', ethDetected) +} diff --git a/src/controls/selector-ctrl.tsx b/src/controls/selector-ctrl.tsx new file mode 100644 index 0000000..5aaec7d --- /dev/null +++ b/src/controls/selector-ctrl.tsx @@ -0,0 +1,109 @@ +import * as R from 'ramda' +import { getNodeUrls, NetworkName, RChainNetwork, RNodeInfo } from '../rchain-networks' +import { h, Cell } from './common' + +export interface SelectorSt { + readonly valNode: RNodeInfo + readonly readNode: RNodeInfo +} + +export interface SelectorActions { + readonly nets: RChainNetwork[] +} + +export const selectorCtrl = (st: Cell, {nets}: SelectorActions) => { + const findValidatorByIndex = (index: number) => + R.chain(({hosts}) => hosts, nets)[index] + + const findReadOnlyByIndex = (index: number, netName?: NetworkName) => R.pipe( + (xs: RChainNetwork[]) => R.filter(x => x.name === netName, xs), + R.chain(({readOnlys}) => readOnlys) + )(nets)[index] + + const onSelIdx = (ev: any) => { + const sel = findValidatorByIndex(ev.target.selectedIndex) + const read = sel.name === valNode.name ? readNode : findReadOnlyByIndex(0, sel.name) + st.set({valNode: sel, readNode: read}) + } + + const onSelReadIdx = (ev: any) => { + const sel = findReadOnlyByIndex(ev.target.selectedIndex, valNode.name) + st.set({valNode, readNode: sel}) + } + + const getDdlText = ({name, domain, grpc, https, http}: RNodeInfo) => { + const httpInfo = !!https ? `:${https}` : !!http ? `:${http}` : ' ' + const isLocal = name === 'localnet' + return isLocal ? `${domain}${httpInfo}` : domain + } + + const isEqNode = (v1: any, v2: any) => + R.eqBy(({domain, gprc, https, http}) => ({domain, gprc, https, http}), v1, v2) + + // Control state + const {valNode, readNode} = st.view({}) + + const isLocal = valNode.name === 'localnet' + const isMainnet = valNode.name === 'mainnet' + const valUrls = getNodeUrls(valNode) + const readUrls = getNodeUrls(readNode) + const faucetUrl = valNode.network?.faucet + + return
+ {/* Validator selector */} +

RChain Network selector

+

{valNode.title} - validator node {faucetUrl && faucet}

+ + + {/* Validator info */} +
+ Direct links + status + blocks + {valUrls.logsUrl && logs} + {valUrls.filesUrl && files} + + {valUrls.grpcUrl && } + + {isLocal && } +
gRPC
{valUrls.grpcUrl}
HTTP
{valUrls.httpUrl}
Admin
{valUrls.httpAdminUrl}
+ {isMainnet &&

You are connected to MAIN RChain network. Any deploy will use REAL REVs.

} + + {/* Read-only selector */} +

{readNode.title} - read-only node

+ + + {/* Read-only info */} +
+ Direct links + status + blocks + {readUrls.logsUrl && logs} + {readUrls.filesUrl && files} + + {readUrls.grpcUrl && } + + {isLocal && } +
gRPC
{readUrls.grpcUrl}
HTTP
{readUrls.httpUrl}
Admin
{readUrls.httpAdminUrl}
+
+} diff --git a/src/controls/transfer-ctrl.tsx b/src/controls/transfer-ctrl.tsx new file mode 100644 index 0000000..5ef2be3 --- /dev/null +++ b/src/controls/transfer-ctrl.tsx @@ -0,0 +1,141 @@ +import * as R from 'ramda' +import { ethDetected } from '@tgrospic/rnode-http-js' +import { RevAccount } from '@tgrospic/rnode-http-js' +import { h, labelStyle, showRevDecimal, labelRev, showNetworkError, Cell, blockEventKey } from './common' + +export interface TransferSt { + readonly account: RevAccount + readonly toAccount: RevAccount + readonly amount: string + + readonly status: string + readonly error: string +} + +export type TransferData = { + fromAccount: RevAccount, + toAccount: RevAccount, + amount: string +} + +export interface TransferActions { + readonly wallet: RevAccount[] + readonly warn: typeof console.warn + readonly onTransfer: (t: { + fromAccount: RevAccount, + toAccount: RevAccount, + amount: string + }) => Promise + // WIP - offline transfer + readonly onOfflineTransfer: (t: { + fromAccount: RevAccount, + toAccount: RevAccount, + amount: string + }) => Promise +} + +const initSelected = (st: TransferSt, wallet: RevAccount[]) => { + const {account, toAccount} = st + + // Pre-select first account if not selected + + const selAccount = R.isNil(account) && !R.isNil(wallet) + ? R.head(wallet) as RevAccount : account + + const selToAccount = R.isNil(toAccount) && !R.isNil(wallet) + ? R.head(wallet) as RevAccount : toAccount + + return {...st, account: selAccount, toAccount: selToAccount} +} + +export const transferCtrl = (st: Cell, {wallet, onTransfer, onOfflineTransfer, warn}: TransferActions) => { + const valEv = (name: keyof TransferSt) => (ev: Event) => { + const val = (ev.target as HTMLInputElement).value + st.update(s => ({...s, [name]: val})) + // st.o(name).set(val) + } + + const send = (account: RevAccount, toAccount: RevAccount, amount: string) => async () => { + st.update(s => ({...s, status: '...', error: ''})) + await onTransfer({fromAccount: account, toAccount, amount}) + .then(x => { + st.update(s => ({...s, status: x, error: ''})) + }) + .catch(ex => { + st.update(s => ({...s, status: '', error: ex.message})) + warn('Transfer error', ex) + }) + } + + const downloadSignedDeploy = (account: RevAccount, toAccount: RevAccount, amount: string) => async () => { + st.update(s => ({...s, status: '...', error: ''})) + await onOfflineTransfer({fromAccount: account, toAccount, amount}) + .then(x => { + st.update(s => ({...s, status: x, error: ''})) + }) + .catch(ex => { + st.update(s => ({...s, status: '', error: ex.message})) + warn('Offline transfer error', ex) + }) + } + + const onSelectFrom = async (ev: any) => { + const account = R.find(R.propEq('revAddr', ev.target.value), wallet) as RevAccount + st.update(s => ({...s, account})) + } + + const onSelectTo = async (ev: any) => { + const toAccount = R.find(R.propEq('revAddr', ev.target.value), wallet) as RevAccount + st.update(s => ({...s, toAccount})) + } + + // Control state + const {account, toAccount, amount, status, error} = initSelected(st.view({}), wallet) + + const labelSource = 'Source REV address' + const labelDestination = 'Destination REV address' + const labelAmount = 'Amount (in revlettes x10^8)' + const isWalletEmpty = R.isNil(wallet) || R.isEmpty(wallet) + const canTransfer = account && toAccount && amount && (account || ethDetected) + const amountPreview = showRevDecimal(amount) + + return
+

Transfer REV tokens

+ {isWalletEmpty ? REV wallet is empty, add accounts to make transfers. : <> +
Sends transfer deploy to selected validator RNode.
+ + {/* Source REV address dropdown */} +
{labelSource}
+ + + {/* Target REV address dropdown */} +
{labelDestination}
+ + + {/* REV amount */} +
+
{labelAmount}
+ + {labelRev(amountPreview)} + + {/* Action buttons / results */} +
+ + + {status && {status}} + {error && {showNetworkError(error)}} + } +
+} diff --git a/src/eth/eth-sign.js b/src/eth/eth-sign.js deleted file mode 100644 index 22e97e3..0000000 --- a/src/eth/eth-sign.js +++ /dev/null @@ -1,44 +0,0 @@ -import { ec } from 'elliptic' -import * as ethUtil from 'ethereumjs-util' - -import { decodeAscii } from '../lib.js' -import { deployDataProtobufSerialize } from '../rnode-sign.js' - -export const recoverPublicKeyEth = (data, sigHex) => { - // Ethereum lib to recover public key from massage and signature - const hashed = ethUtil.hashPersonalMessage(ethUtil.toBuffer([...data])) - const sigBytes = ethUtil.toBuffer(sigHex) - const {v, r, s} = ethUtil.fromRpcSig(sigBytes) - // Public key without prefix - const pubkeyRecover = ethUtil.ecrecover(hashed, v, r, s) - - return ethUtil.bufferToHex([4, ...pubkeyRecover]) -} - -export const verifyDeployEth = deploySigned => { - const { - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - deployer, sig, // : Array[Byte] - } = deploySigned - - // Serialize deploy data for signing - const deploySerialized = deployDataProtobufSerialize({ - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - }) - - // Create a hash of message with prefix - // https://github.com/ethereumjs/ethereumjs-util/blob/4a8001c/src/signature.ts#L136 - const deployLen = deploySerialized.length - const msgPrefix = `\x19Ethereum Signed Message:\n${deployLen}` - const prefixBin = decodeAscii(msgPrefix) - const msg = [...prefixBin, ...deploySerialized] - const hashed = ethUtil.keccak256(msg) - - // Check deployer's signature - const crypt = new ec('secp256k1') - const key = crypt.keyFromPublic(deployer) - const sigRS = { r: sig.slice(0, 32), s: sig.slice(32, 64) } - const isValid = key.verify(hashed, sigRS) - - return isValid -} diff --git a/src/eth/eth-wrapper.js b/src/eth/eth-wrapper.js deleted file mode 100644 index 9f5f1eb..0000000 --- a/src/eth/eth-wrapper.js +++ /dev/null @@ -1,41 +0,0 @@ -// Metamask wrapper for Ethereum provider -// https://metamask.github.io/metamask-docs/guide/ethereum-provider.html#methods-new-api -// Updated by EIP-1193 (ethereum.request) -// https://eips.ethereum.org/EIPS/eip-1193 - -// Ethereum object injected by Metamask -const eth_ = window.ethereum - -export const ethDetected = !!eth_ - -// https://docs.metamask.io/guide/ethereum-provider.html#properties -if (ethDetected) eth_.autoRefreshOnNetworkChange = false - -// Send a request to Ethereum API (Metamask) -const ethRequest = (method, args) => { - if (!eth_) throw Error(`Ethereum (Metamask) not detected.`) - - return eth_.request({method, ...args}) -} - -// Request an address selected in Metamask -// - the first request will ask the user for permission -export const ethereumAddress = async () => { - const accounts = await ethRequest('eth_requestAccounts') - - if (!Array.isArray(accounts)) - throw Error(`Ethereum RPC response is not a list of accounts (${accounts}).`) - - // Returns ETH address in hex format - return accounts[0] -} - -// Ethereum personal signature -// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign -export const ethereumSign = async (bytes, ethAddr) => { - // Create args, fix arrays/buffers - const args = { params: [[...bytes], ethAddr] } - - // Returns signature in hex format - return await ethRequest('personal_sign', args) -} diff --git a/src/web/favicon.ico b/src/favicon.ico similarity index 100% rename from src/web/favicon.ico rename to src/favicon.ico diff --git a/src/web/index.html b/src/index.html similarity index 80% rename from src/web/index.html rename to src/index.html index d507b99..dc09aaa 100644 --- a/src/web/index.html +++ b/src/index.html @@ -23,8 +23,13 @@ "> --> +
+ This is testing version of the page. For production version please visit + https://tgrospic.github.io/rnode-client-js. +
+
- + diff --git a/src/web/index.js b/src/index.ts similarity index 63% rename from src/web/index.js rename to src/index.ts index 329821b..10a2317 100644 --- a/src/web/index.js +++ b/src/index.ts @@ -1,30 +1,27 @@ // Web example with REV transfer and balance check -import { pageLog, handleHashHref } from './controls/common' -import { makeRNodeWeb } from '../rnode-web' +import { makeRNodeWeb } from '@tgrospic/rnode-http-js' import { makeRNodeActions } from './rnode-actions' +import { pageLog } from './controls/common' import { startApp } from './controls/main-ctrl' // DOM global functions / dependencies const { log: logOrig, warn } = console -const { fetch } = window - -// Prevents default redirect for link -handleHashHref(document.body) +const { fetch, document } = window // Page printer mirrors the console `log` const log = pageLog({log: logOrig, document}) // Make RNode web API client / wrapped around DOM fetch -const rnodeWeb = makeRNodeWeb({fetch}) +const rnodeWeb = makeRNodeWeb({fetch, now: Date.now}) // Make application actions as a wrapper around RNode API const appNodeEff = makeRNodeActions(rnodeWeb, {log, warn}) -// Application root element -const appRoot = document.querySelector('#app') - // Attach to window load event (to refresh on duplicated tab) -window.addEventListener('load', ev => { +window.addEventListener('load', () => { + // Application root element + const appRoot = document.querySelector('#app') as Element + // Start main app / supply effects startApp(appRoot, {...appNodeEff, log, warn}) }) diff --git a/src/lib.js b/src/lib.js deleted file mode 100644 index 128924a..0000000 --- a/src/lib.js +++ /dev/null @@ -1,13 +0,0 @@ -export const encodeBase16 = bytes => - Array.from(bytes).map(x => (x & 0xff).toString(16).padStart(2, 0)).join('') - -export const decodeBase16 = hexStr => { - const removed0x = hexStr.replace(/^0x/, '') - const byte2hex = ([arr, bhi], x) => - bhi ? [[...arr, parseInt(`${bhi}${x}`, 16)]] : [arr, x] - const [resArr] = Array.from(removed0x).reduce(byte2hex, [[]]) - return Uint8Array.from(resArr) -} - -export const decodeAscii = (str = '') => - Array.from(str).map(x => `${x}`.charCodeAt(0)) diff --git a/src/nodejs/client-insert-signed.js b/src/nodejs/client-insert-signed.js deleted file mode 100644 index da9c2c6..0000000 --- a/src/nodejs/client-insert-signed.js +++ /dev/null @@ -1,155 +0,0 @@ -// Reference to TypeScript definitions for IntelliSense in VSCode -/// -const grpc = require('@grpc/grpc-js') -const { ec } = require('elliptic') -const blake = require('blakejs') -const { rnodeService, rnodeProtobuf, signDeploy, verifyDeploy } = require('@tgrospic/rnode-grpc-js') - -const protoSchema = require('../../rnode-grpc-gen/js/pbjs_generated.json') -require('../../rnode-grpc-gen/js/DeployServiceV1_pb') -require('../../rnode-grpc-gen/js/ProposeServiceV1_pb') - -const { log, warn } = console - -const rnodeUrl = 'localhost:40402' -// const rnodeUrl = 'node0.testnet.rchain-dev.tk:40401' - -const encodeBase16 = bytes => - Array.from(bytes).map(x => (x & 0xff).toString(16).padStart(2, 0)).join('') - -const secp256k1 = new ec('secp256k1') - -const rnodeExample = async args => { - // RNode client options - const options = host => ({ grpcLib: grpc, host, protoSchema }) - // RNode API methods - const { getBlocks, previewPrivateNames, doDeploy, propose } = rnodeService(options(rnodeUrl)) - - // Protobuf serializer for Par (Rholang AST). - const { Par } = rnodeProtobuf({ protoSchema }) - - /* - * To insert data to the registry, with the signature, tuple `(nonce, data)` - * must be signed by the client. - * - * - `nonce`: number increasing with each insert - * - `data` : data we wish to store in the registry - * (unforgeable name when storing a contract) - * - * Signing this tuple on the client side gives a proof to Rholang that owner - * of the private/public key has permission to insert/update data associated for this key, - * from which registry address is generated. - * - * So in Rholang we supply this information to `rho:registry:insertSigned:secp256k1`. - * - * - public key (used for checking the signature) - * - `(nonce, data)` - * - signature of `(nonce, data)` - * - * When storing a contract in the registry we first need to generate the same unforgeable name - * which Rholang will generate when deploying the contract. For this we need to call RNode with - * _timestamp_ and _public key_ used later in deploy data. - * - * Note: we also need timestamp to create deploy, so in this example - * the same number is used for both purposes. - */ - - // Private/public key used to sign a deploy. - const deployPrivateKey = secp256k1.keyFromPrivate('') - const deployPublicKey = Uint8Array.from(deployPrivateKey.getPublic('array')) - - // Timestamp used in deploy data. - const timestamp = Date.now() - - // Unforgeable name on which contract in the registry will be registered. - const { payload: { idsList: [ unforgName ] } } = await previewPrivateNames({ - timestamp, user: deployPublicKey, nameqty: 1 - }) - - // Build a tuple with Rholang AST (source for signing). - // (nonce, unforgName) - const nonce = timestamp // increase nonce with each insert/update - const dataToSign = Par.serialize({ - exprsList: [{ - eTupleBody: { - psList: [{ - // `nonce`: number increasing with each insert - exprsList: [{ gInt: nonce }] - }, { - // `data` : channel (unforgeable name) of the contract - bundlesList: [{ - body: { - unforgeablesList: [{ - gPrivateBody: { id: unforgName } - }] - }, - // Unforgeable name is write only `bundle+{*unforgName}` - writeflag: true, - readflag: false - }] - // Instead of unforgeable name we can store any process. - // exprsList: [{ gString: "My data in registry!" }] - }] - } - }] - }) - - // Private/public key used for signing registry access (it can be the same as deploy key). - const privateKey = secp256k1.keyFromPrivate('') - const publicKey = Uint8Array.from(privateKey.getPublic('array')) - // log("PRIV KEY", secp256k1.genKeyPair().getPrivate('hex')) // generate new key - - // Sign `(nonce, unforgName)` - const hashed = blake.blake2bHex(dataToSign, void 666, 32) - const sigArray = privateKey.sign(hashed, {canonical: true}).toDER('array') - const signatureHex = encodeBase16(sigArray) - const publicKeyHex = encodeBase16(publicKey) - - const contract = ` - new MyContract, rs(\`rho:registry:insertSigned:secp256k1\`), uriOut, out(\`rho:io:stdout\`) - in { - contract MyContract(ret) = { - ret!("Hello Arthur!") - } | - - rs!( - "${publicKeyHex}".hexToBytes(), - (${nonce}, bundle+{*MyContract}), - "${signatureHex}".hexToBytes(), - *uriOut - ) | - - for(@uri <- uriOut) { - out!(("Registered", uri)) - } - } - ` - // Get latest block number from RNode - const [ block ] = await getBlocks({ depth: 1 }) - const lastBlockNr = block.blockinfo.blocknumber - - const deployData = { - term: contract, - timestamp, - phloprice: 1, - phlolimit: 150e3, - validafterblocknumber: lastBlockNr, - } - - const deploy = signDeploy(deployPrivateKey, deployData) - log('SIGNED DEPLOY', deploy) - - const isValidDeploy = verifyDeploy(deploy) - log('DEPLOY IS VALID', isValidDeploy) - - const { result } = await doDeploy(deploy) - log('DEPLOY RESPONSE', result) - - if (rnodeUrl.match(/localhost/)) { - const { result: proposeRes } = await propose() - log('PROPOSE RESPONSE', proposeRes) - } - -} - -rnodeExample(process.argv) diff --git a/src/nodejs/client.js b/src/nodejs/client.js deleted file mode 100644 index f9c2986..0000000 --- a/src/nodejs/client.js +++ /dev/null @@ -1,82 +0,0 @@ -// Reference to TypeScript definitions for IntelliSense in VSCode -/// -const grpc = require('@grpc/grpc-js') -const { ec } = require('elliptic') -const { rnodeDeploy, rnodePropose, signDeploy, verifyDeploy } = require('@tgrospic/rnode-grpc-js') - -// Generated files with rnode-grpc-js tool -const protoSchema = require('../../rnode-grpc-gen/js/pbjs_generated.json') -// Import generated protobuf types (in global scope) -require('../../rnode-grpc-gen/js/DeployServiceV1_pb') -require('../../rnode-grpc-gen/js/ProposeServiceV1_pb') - -const { log, warn } = console - -const sampleRholangCode = 'new out(`rho:io:stdout`) in { out!("Nodejs deploy test") }' - -const rnodeExternalUrl = 'localhost:40401' -// const rnodeExternalUrl = 'node8.testnet.rchain-dev.tk:40401' - -const rnodeInternalUrl = 'localhost:40402' - -const rnodeExample = async () => { - // Get RNode service methods - const options = host => ({ grpcLib: grpc, host, protoSchema }) - - const { - getBlocks, - lastFinalizedBlock, - visualizeDag, - listenForDataAtName, - doDeploy, - } = rnodeDeploy(options(rnodeExternalUrl)) - - const { propose } = rnodePropose(options(rnodeInternalUrl)) - - // Examples of requests to RNode - - const lastBlockObj = await lastFinalizedBlock() - log('LAST BLOCK', lastBlockObj) - - - const blocks = await getBlocks({ depth: 1 }) - log('BLOCKS', blocks) - - - const vdagObj = await visualizeDag({ depth: 2, showjustificationlines: true }) - log('VDAG', vdagObj.map(x => x.content).join('')) - - - const listenData = await listenForDataAtName({ - depth: 10, - name: { exprsList: [{gString: 'RChain'}, {gInt: 123}] }, - }) - log('LISTEN', listenData) - - // Sample deploy - - const secp256k1 = new ec('secp256k1') - const key = secp256k1.genKeyPair() - // const key = '1bf36a3d89c27ddef7955684b97667c75454317d8964528e57b2308947b250b0' - - const deployData = { - term: sampleRholangCode, - phloprice: 1, - phlolimit: 10e3, - validafterblocknumber: 0, - } - const deploy = signDeploy(key, deployData) - log('SIGNED DEPLOY', deploy) - - const isValidDeploy = verifyDeploy(deploy) - log('DEPLOY IS VALID', isValidDeploy) - - const { result } = await doDeploy(deploy) - log('DEPLOY RESPONSE', result) - - - const { result: proposeRes } = await propose() - log('PROPOSE RESPONSE', proposeRes) -} - -rnodeExample() diff --git a/src/nodejs/repl.js b/src/nodejs/repl.js deleted file mode 100644 index a351bb7..0000000 --- a/src/nodejs/repl.js +++ /dev/null @@ -1,28 +0,0 @@ -// Reference to TypeScript definitions for IntelliSense in VSCode -/// -const grpc = require('@grpc/grpc-js') -const { rnodeRepl } = require('@tgrospic/rnode-grpc-js') - -// Generated files with rnode-grpc-js tool -const protoSchema = require('../../rnode-grpc-gen/js/pbjs_generated.json') -// Import generated protobuf types (in global scope) -require('../../rnode-grpc-gen/js/repl_pb') - -const { log } = console - -const sampleRholangCode = 'new out(`rho:io:stdout`) in { out!("Nodejs deploy test") }' - -const rnodeInternalUrl = 'localhost:40402' - -const options = { grpcLib: grpc, host: rnodeInternalUrl, protoSchema } - -const { Eval } = rnodeRepl(options) - -const main = async () => { - // Examples of eval request to RNode - - const evalResult = await Eval({ program: sampleRholangCode }) - log('EVAL', evalResult.output) -} - -main() diff --git a/src/rchain-networks.js b/src/rchain-networks.js deleted file mode 100644 index 6b8858a..0000000 --- a/src/rchain-networks.js +++ /dev/null @@ -1,89 +0,0 @@ -const defaultPorts = { grpc: 40401, http: 40403, httpAdmin: 40405 } -const defaultPortsSSL = { grpc: 40401, https: 443, httpAdmin: 40405 } - -// Local network - -export const localNet = { - title: 'Local network', - name: 'localnet', - hosts: [ - { domain: 'localhost', ...defaultPorts }, - { domain: 'localhost', grpc: 40411, http: 40413, httpAdmin: 40415 }, - { domain: 'localhost', grpc: 40421, http: 40423, httpAdmin: 40425 }, - { domain: 'localhost', grpc: 40431, http: 40433, httpAdmin: 40435 }, - { domain: 'localhost', grpc: 40441, http: 40443, httpAdmin: 40445 }, - { domain: 'localhost', grpc: 40451, http: 40453, httpAdmin: 40455 }, - ], - readOnlys: [ - { domain: 'localhost', ...defaultPorts }, - { domain: 'localhost', grpc: 40411, http: 40413, httpAdmin: 40415 }, - { domain: 'localhost', grpc: 40421, http: 40423, httpAdmin: 40425 }, - { domain: 'localhost', grpc: 40431, http: 40433, httpAdmin: 40435 }, - { domain: 'localhost', grpc: 40441, http: 40443, httpAdmin: 40445 }, - { domain: 'localhost', grpc: 40451, http: 40453, httpAdmin: 40455 }, - ] -} - -// Test network - -const range = n => [...Array(n).keys()] - -const getTestNetUrls = n => ({ - domain: `node${n}.testnet.rchain-dev.tk`, - ...defaultPortsSSL, -}) - -const testnetHosts = range(5).map(getTestNetUrls) - -export const testNet = { - title: 'RChain testing network', - name: 'testnet', - hosts: testnetHosts, - readOnlys: [ - { domain: 'observer.testnet.rchain.coop', ...defaultPortsSSL }, - // Jim's read-only node - { domain: 'rnode1.rhobot.net', ...defaultPortsSSL }, - ], -} - -// MAIN network - -const getMainNetUrls = n => ({ - domain: `node${n}.root-shard.mainnet.rchain.coop`, - ...defaultPortsSSL, -}) - -const mainnetHosts = range(20).filter(n => n != 2).map(getMainNetUrls) - -export const mainNet = { - title: 'RChain MAIN network', - name: 'mainnet', - hosts: mainnetHosts, - readOnlys: [ - // Load balancer (not gRPC) server for us, asia and eu servers - { domain: 'observer.services.mainnet.rchain.coop', https: 443 }, - { domain: 'observer-us.services.mainnet.rchain.coop', ...defaultPortsSSL }, - { domain: 'observer-asia.services.mainnet.rchain.coop', ...defaultPortsSSL }, - { domain: 'observer-eu.services.mainnet.rchain.coop', ...defaultPortsSSL }, - ], -} - -export const getNodeUrls = ({name, domain, grpc, http, https, httpAdmin, httpsAdmin}) => { - const scheme = !!https ? 'https' : !!http ? 'http' : '' - const schemeAdmin = !!httpsAdmin ? 'https' : !!httpAdmin ? 'http' : '' - const httpUrl = !!https || !!http ? `${scheme}://${domain}:${https || http}` : void 8 - const httpAdminUrl = !!httpsAdmin || !!httpAdmin ? `${schemeAdmin}://${domain}:${httpsAdmin || httpAdmin}` : void 8 - const grpcUrl = !!grpc ? `${domain}:${grpc}` : void 8 - - return { - network : name, - grpcUrl, - httpUrl, - httpAdminUrl, - statusUrl : `${httpUrl}/status`, - getBlocksUrl : `${httpUrl}/api/blocks`, - // Testnet only - logsUrl : `http://${domain}:8181/logs/name:rnode`, - filesUrl: `http://${domain}:18080`, - } -} diff --git a/src/rchain-networks.ts b/src/rchain-networks.ts new file mode 100644 index 0000000..61b06f6 --- /dev/null +++ b/src/rchain-networks.ts @@ -0,0 +1,180 @@ +import * as R from 'ramda' + +export interface RNodeInfo { + readonly domain: string + readonly grpc?: number + readonly http?: number + readonly https?: number + readonly httpAdmin?: number + readonly httpsAdmin?: number + readonly instance?: string + // Network info + readonly name?: NetworkName + readonly title?: string + readonly network?: RChainNetwork +} + +export interface RChainNetwork { + readonly title: string + readonly name: NetworkName + readonly hosts: RNodeInfo[] + readonly readOnlys: RNodeInfo[] + // Test net + readonly faucet?: string +} + +export type NetworkName = 'localnet' | 'testnet-llbm' | 'testnet-bm' | 'testnet' | 'mainnet' + +const defaultPorts: Partial = { grpc: 40401, http: 40403, httpAdmin: 40405 } +const defaultPortsSSL: Partial = { grpc: 40401, https: 443, httpAdmin: 40405 } + +// Local network + +export const localNet: RChainNetwork = { + title: 'Local network', + name: 'localnet', + hosts: [ + { domain: 'localhost', ...defaultPorts }, + { domain: 'localhost', grpc: 40411, http: 40413, httpAdmin: 40415 }, + { domain: 'localhost', grpc: 40421, http: 40423, httpAdmin: 40425 }, + { domain: 'localhost', grpc: 40431, http: 40433, httpAdmin: 40435 }, + { domain: 'localhost', grpc: 40441, http: 40443, httpAdmin: 40445 }, + { domain: 'localhost', grpc: 40451, http: 40453, httpAdmin: 40455 }, + ], + readOnlys: [ + { domain: 'localhost', ...defaultPorts }, + { domain: 'localhost', grpc: 40411, http: 40413, httpAdmin: 40415 }, + { domain: 'localhost', grpc: 40421, http: 40423, httpAdmin: 40425 }, + { domain: 'localhost', grpc: 40431, http: 40433, httpAdmin: 40435 }, + { domain: 'localhost', grpc: 40441, http: 40443, httpAdmin: 40445 }, + { domain: 'localhost', grpc: 40451, http: 40453, httpAdmin: 40455 }, + ] +} + +// Test network (leaderless block-merge) + +const getTestNetLLBMUrls = (n: number) => { + const instance = `node${n}` + return { + domain: `${instance}.llbm.testnet.rchain.coop`, + instance, + ...defaultPortsSSL, + } +} + +const testnetLLBMHosts = R.range(0, 5).map(getTestNetLLBMUrls) + +export const testNetLLBlockMerge: RChainNetwork = { + title: 'RChain testing network (leaderless block-merge)', + name: 'testnet-llbm', + hosts: testnetLLBMHosts, + readOnlys: [ + { domain: 'observer.llbm.testnet.rchain.coop', instance: 'observer', ...defaultPortsSSL }, + ], + faucet: 'https://status.llbm.testnet.rchain.coop/testnet/faucet', +} + +// Test network (block-merge) + +const getTestNetBMUrls = (n: number) => { + const instance = `node${n}` + return { + domain: `${instance}.bm.testnet.rchain.coop`, + instance, + ...defaultPortsSSL, + } +} + +const testnetBMHosts = R.range(0, 5).map(getTestNetBMUrls) + +export const testNetBlockMerge: RChainNetwork = { + title: 'RChain testing network (block-merge)', + name: 'testnet-bm', + hosts: testnetBMHosts, + readOnlys: [ + { domain: 'observer.bm.testnet.rchain.coop', instance: 'observer', ...defaultPortsSSL }, + ], + faucet: 'https://status.bm.testnet.rchain.coop/testnet/faucet', +} + +// Test network + +const getTestNetUrls = (n: number) => { + const instance = `node${n}` + return { + domain: `${instance}.testnet.rchain.coop`, + instance, + ...defaultPortsSSL, + } +} + +const testnetHosts = R.range(0, 5).map(getTestNetUrls) + +export const testNet: RChainNetwork = { + title: 'RChain testing network', + name: 'testnet', + hosts: testnetHosts, + readOnlys: [ + { domain: 'observer.testnet.rchain.coop', instance: 'observer', ...defaultPortsSSL }, + // Jim's read-only node + { domain: 'rnode1.rhobot.net', ...defaultPortsSSL }, + ], + faucet: 'https://status.rchain.coop/testnet/faucet' +} + +// MAIN network + +const getMainNetUrls = function (n: number): RNodeInfo { + return { + domain: `node${n}.root-shard.mainnet.rchain.coop`, + ...defaultPortsSSL, + } +} + +const mainnetHosts = R.range(0, 30).map(getMainNetUrls) + +export const mainNet: RChainNetwork = { + title: 'RChain MAIN network', + name: 'mainnet', + hosts: mainnetHosts, + readOnlys: [ + // Load balancer (not gRPC) server for us, asia and eu servers + { domain: 'observer.services.mainnet.rchain.coop', https: 443 }, + { domain: 'observer-us.services.mainnet.rchain.coop', ...defaultPortsSSL }, + { domain: 'observer-asia.services.mainnet.rchain.coop', ...defaultPortsSSL }, + { domain: 'observer-eu.services.mainnet.rchain.coop', ...defaultPortsSSL }, + ], +} + +export interface NodeUrls { + readonly network: NetworkName + readonly grpcUrl: string + readonly httpUrl: string + readonly httpAdminUrl: string + readonly statusUrl: string + readonly getBlocksUrl: string + // Testnet only + readonly logsUrl?: string + readonly filesUrl?: string +} + +export const getNodeUrls = function ({name, domain, grpc, http, https, httpAdmin, httpsAdmin, instance}: RNodeInfo): NodeUrls { + const scheme = !!https ? 'https' : !!http ? 'http' : '' + const schemeAdmin = !!httpsAdmin ? 'https' : !!httpAdmin ? 'http' : '' + const httpUrl = !!https || !!http ? `${scheme}://${domain}:${https || http}` : '' + const httpAdminUrl = !!httpsAdmin || !!httpAdmin ? `${schemeAdmin}://${domain}:${httpsAdmin || httpAdmin}` : '' + const grpcUrl = !!grpc ? `${domain}:${grpc}` : '' + + return { + network : name as NetworkName, + grpcUrl, + httpUrl, + httpAdminUrl, + statusUrl : `${httpUrl}/status`, + getBlocksUrl : `${httpUrl}/api/blocks`, + // Testnet only + logsUrl : instance && `http://${domain}:8181/logs/name:${instance}`, + // TODO: what0s wrong with files? + // filesUrl: `http://${domain}:18080`, + } +} diff --git a/src/rho/bond.js b/src/rho/bond.ts similarity index 92% rename from src/rho/bond.js rename to src/rho/bond.ts index 3157544..e25ffab 100644 --- a/src/rho/bond.js +++ b/src/rho/bond.ts @@ -1,5 +1,5 @@ // Rholang code to bond a validator -export const posBond_rho = amount => ` +export const posBond_rho = (amount: string) => ` new retCh, PoSCh, rl(\`rho:registry:lookup\`), stdout(\`rho:io:stdout\`) in { stdout!("About to lookup pos contract...") | diff --git a/src/rho/check-balance.js b/src/rho/check-balance.ts similarity index 90% rename from src/rho/check-balance.js rename to src/rho/check-balance.ts index 4e8ccb0..e0a6124 100644 --- a/src/rho/check-balance.js +++ b/src/rho/check-balance.ts @@ -1,6 +1,6 @@ // Rholang code to check REVs balance // - intended for use with RNode exploratory deploy -export const checkBalance_rho = addr => ` +export const checkBalance_rho = (addr: string) => ` new return, rl(\`rho:registry:lookup\`), RevVaultCh, vaultCh in { rl!(\`rho:rchain:revVault\`, *RevVaultCh) | for (@(_, RevVault) <- RevVaultCh) { diff --git a/src/rho/transfer-funds.js b/src/rho/transfer-funds.js deleted file mode 100644 index 2a6dd33..0000000 --- a/src/rho/transfer-funds.js +++ /dev/null @@ -1,39 +0,0 @@ -// Rholang code to transfer REVs -// https://github.com/rchain/rchain/blob/3eca061/rholang/examples/vault_demo/3.transfer_funds.rho -export const transferFunds_rho = (revAddrFrom, revAddrTo, amount) => ` - new rl(\`rho:registry:lookup\`), RevVaultCh in { - rl!(\`rho:rchain:revVault\`, *RevVaultCh) | - for (@(_, RevVault) <- RevVaultCh) { - new vaultCh, vaultTo, revVaultkeyCh, - deployerId(\`rho:rchain:deployerId\`), - deployId(\`rho:rchain:deployId\`) - in { - match ("${revAddrFrom}", "${revAddrTo}", ${amount}) { - (revAddrFrom, revAddrTo, amount) => { - @RevVault!("findOrCreate", revAddrFrom, *vaultCh) | - @RevVault!("findOrCreate", revAddrTo, *vaultTo) | - @RevVault!("deployerAuthKey", *deployerId, *revVaultkeyCh) | - for (@vault <- vaultCh; key <- revVaultkeyCh; _ <- vaultTo) { - match vault { - (true, vault) => { - new resultCh in { - @vault!("transfer", revAddrTo, amount, *key, *resultCh) | - for (@result <- resultCh) { - match result { - (true , _ ) => deployId!((true, "Transfer successful (not yet finalized).")) - (false, err) => deployId!((false, err)) - } - } - } - } - err => { - deployId!((false, "REV vault cannot be found or created.")) - } - } - } - } - } - } - } - } -` diff --git a/src/rho/transfer-funds.ts b/src/rho/transfer-funds.ts new file mode 100644 index 0000000..43edcf0 --- /dev/null +++ b/src/rho/transfer-funds.ts @@ -0,0 +1,39 @@ +// Rholang code to transfer REVs +// https://github.com/rchain/rchain/blob/3eca061/rholang/examples/vault_demo/3.transfer_funds.rho +export const transferFunds_rho = (revAddrFrom: string, revAddrTo: string, amount: string) => ` +new rl(\`rho:registry:lookup\`), RevVaultCh in { +rl!(\`rho:rchain:revVault\`, *RevVaultCh) | +for (@(_, RevVault) <- RevVaultCh) { +new vaultCh, vaultTo, revVaultkeyCh, +deployerId(\`rho:rchain:deployerId\`), +deployId(\`rho:rchain:deployId\`) +in { +match ("${revAddrFrom}", "${revAddrTo}", ${amount}) { +(revAddrFrom, revAddrTo, amount) => { +@RevVault!("findOrCreate", revAddrFrom, *vaultCh) | +@RevVault!("findOrCreate", revAddrTo, *vaultTo) | +@RevVault!("deployerAuthKey", *deployerId, *revVaultkeyCh) | +for (@vault <- vaultCh; key <- revVaultkeyCh; _ <- vaultTo) { +match vault { +(true, vault) => { +new resultCh in { +@vault!("transfer", revAddrTo, amount, *key, *resultCh) | +for (@result <- resultCh) { +match result { +(true , _ ) => deployId!((true, "Transfer successful (not yet finalized).")) +(false, err) => deployId!((false, err)) +} +} +} +} +err => { +deployId!((false, "REV vault cannot be found or created.")) +} +} +} +} +} +} +} +} +` diff --git a/src/rnode-actions.ts b/src/rnode-actions.ts new file mode 100644 index 0000000..ed9f146 --- /dev/null +++ b/src/rnode-actions.ts @@ -0,0 +1,186 @@ +import * as R from 'ramda' +import { GetDeployDataEff, GetSignedDeployEff, ProposeEff, RawRNodeHttpEff, RNodeWebAPI, SendDeployEff } from '@tgrospic/rnode-http-js' +import { RevAccount, rhoExprToJson, signDeploy } from '@tgrospic/rnode-http-js' +import { NodeUrls } from './rchain-networks' +import { checkBalance_rho } from './rho/check-balance' +import { transferFunds_rho } from './rho/transfer-funds' +import { ConsoleLog, ConsoleWarn } from './controls/common' + +export type ConsoleEff = ConsoleLog & ConsoleWarn + +export type AppRNodeEffects = { + appCheckBalance(args: AppCheckBalanceArgs): Promise<[number, string]> + appTransfer(args: AppTransferArgs): Promise + appSendDeploy(args: AppSendDeployArgs): Promise + appPropose(args: NodeUrls): Promise + // WIP - offline deploy + appOfflineTransfer(args: AppTransferArgs): Promise +} + +export const makeRNodeActions = function (rnodeWeb: RNodeWebAPI, {log, warn}: ConsoleEff): AppRNodeEffects { + const { rnodeHttp, sendDeploy, getDataForDeploy, propose, getSignedDeploy } = rnodeWeb + + // App actions to process communication with RNode + return { + appCheckBalance: appCheckBalance({rnodeHttp}), + appTransfer : appTransfer({sendDeploy, getDataForDeploy, propose, log, warn}), + appSendDeploy : appSendDeploy({sendDeploy, getDataForDeploy, log}), + appPropose : appPropose({propose, log}), + // WIP - offline deploy + appOfflineTransfer: appOfflineTransfer({getSignedDeploy, log, warn}), + } +} + +export type AppCheckBalanceArgs = {node: NodeUrls, revAddr: string} + +const appCheckBalance = ({rnodeHttp}: RawRNodeHttpEff) => async function ({node, revAddr}: AppCheckBalanceArgs): Promise<[number, string]> { + const deployCode = checkBalance_rho(revAddr) + const {expr: [e]} = await rnodeHttp(node.httpUrl, 'explore-deploy', deployCode) + const dataBal = e && e.ExprInt && e.ExprInt.data + const dataError = e && e.ExprString && e.ExprString.data + return [dataBal, dataError] +} + +export type AppOfflineTransferEff = GetSignedDeployEff & ConsoleEff + +/** + * Offline transfer + */ +const appOfflineTransfer = (effects: AppOfflineTransferEff) => async function ({node, fromAccount, toAccount, amount, setStatus}: AppTransferArgs) { + const {getSignedDeploy, log, warn} = effects + + log('OFFLINE TRANSFER', {amount, from: fromAccount.name, to: toAccount.name, node: node.httpUrl}) + + setStatus(`Creating signed deploy ...`) + + // Send deploy + const code = transferFunds_rho(fromAccount.revAddr, toAccount.revAddr, amount) + const signedDeploy = await getSignedDeploy(node, fromAccount, code) + + const {signature} = signedDeploy + log('DEPLOY ID (signature)', signature) + + // Download deploy + const downloadDeploy = function (deploy: any) { + const a = document.createElement("a") + document.body.appendChild(a) + a.setAttribute("style", "display: none") + const json = JSON.stringify(deploy) + const blob = new Blob([json], {type: "octet/stream"}) + const url = window.URL.createObjectURL(blob) + a.setAttribute("href", url) + a.setAttribute("download", "signed-deploy.json") + a.click() + window.URL.revokeObjectURL(url) + a.remove() + } + + downloadDeploy(signedDeploy) + + // Return shell command to push deploy + return `curl ${node.httpUrl}/api/deploy -d @signed-deploy.json` +} + +export type AppTransferEff = SendDeployEff & GetDeployDataEff & ProposeEff & ConsoleEff + +export type AppTransferArgs = { + readonly node: NodeUrls + readonly fromAccount: RevAccount + readonly toAccount: RevAccount + readonly amount: string + setStatus(msg: string): any +} + +const appTransfer = (effects: AppTransferEff) => async function ({node, fromAccount, toAccount, amount, setStatus}: AppTransferArgs) { + const {sendDeploy, getDataForDeploy, propose, log, warn} = effects + + log('TRANSFER', {amount, from: fromAccount.name, to: toAccount.name, node: node.httpUrl}) + + setStatus(`Deploying ...`) + + // Send deploy + const code = transferFunds_rho(fromAccount.revAddr, toAccount.revAddr, amount) + const {signature} = await sendDeploy(node, fromAccount, code) + log('DEPLOY ID (signature)', signature) + + if (node.network === 'localnet') { + // Propose on local network, don't wait for result + propose(node).catch(ex => warn(ex)) + } + + // Progress dots + const mkProgress = (i: number) => () => { + i = i > 60 ? 0 : i + 3 + return `Checking result ${R.repeat('.', i).join('')}` + } + const progressStep = mkProgress(0) + const updateProgress = () => setStatus(progressStep()) + updateProgress() + + // Try to get result from next proposed block + const {data, cost} = await getDataForDeploy(node, signature, updateProgress) + // Extract data from response object + const args = data ? rhoExprToJson(data.expr) : void 0 + const costTxt = R.isNil(cost) ? 'failed to retrive' : cost + const [success, message] = args || [false, 'deploy found in the block but failed to get confirmation data'] + + if (!success) throw Error(`Transfer error: ${message}. // cost: ${costTxt}`) + return `✓ ${message} // cost: ${costTxt}` +} + +export type AppSendDeployEff = SendDeployEff & GetDeployDataEff & ConsoleLog + +export type AppSendDeployArgs = { + readonly node: NodeUrls + readonly code: string + readonly account: RevAccount + readonly phloLimit: string + setStatus(msg: string): any +} + +const appSendDeploy = (effects: AppSendDeployEff) => async function ({node, code, account, phloLimit, setStatus}: AppSendDeployArgs) { + const {sendDeploy, getDataForDeploy, log} = effects + + log('SENDING DEPLOY', {account: account.name, phloLimit, node: node.httpUrl, code}) + + setStatus(`Deploying ...`) + + const phloLimitNum = R.isNil(phloLimit) ? phloLimit : parseInt(phloLimit) + + const {signature} = await sendDeploy(node, account, code, phloLimitNum) + log('DEPLOY ID (signature)', signature) + + // Progress dots + const mkProgress = (i: number) => () => { + i = i > 60 ? 0 : i + 3 + return `Checking result ${R.repeat('.', i).join('')}` + } + const progressStep = mkProgress(0) + const updateProgress = () => setStatus(progressStep()) + updateProgress() + + // Try to get result from next proposed block + const {data, cost} = await getDataForDeploy(node, signature, updateProgress) + // Extract data from response object + const args = data ? rhoExprToJson(data.expr) : void 0 + + log('DEPLOY RETURN DATA', {args, cost, rawData: data}) + + const costTxt = R.isNil(cost) ? 'failed to retrive' : cost + const [success, message] = R.isNil(args) + ? [false, 'deploy found in the block but data is not sent on `rho:rchain:deployId` channel'] + : [true, R.is(Array, args) ? args.join(', ') : args] + + if (!success) throw Error(`Deploy error: ${message}. // cost: ${costTxt}`) + return `✓ (${message}) // cost: ${costTxt}` +} + +type AppProposeEff = ProposeEff & ConsoleLog + +const appPropose = ({propose, log}: AppProposeEff) => async function ({httpAdminUrl}: NodeUrls) { + const resp = await propose({httpAdminUrl}) + + log('Propose result', resp) + + return resp +} diff --git a/src/rnode-sign.js b/src/rnode-sign.js deleted file mode 100644 index f536000..0000000 --- a/src/rnode-sign.js +++ /dev/null @@ -1,88 +0,0 @@ -import blake from 'blakejs' -import { ec } from 'elliptic' -import jspb from 'google-protobuf' - -export const signDeploy = (privateKey, deployObj) => { - const { - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - sigAlgorithm = 'secp256k1', - } = deployObj - - // Serialize deploy data for signing - const deploySerialized = deployDataProtobufSerialize({ - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - }) - - // Signing key - const crypt = new ec(sigAlgorithm) - const key = getSignKey(crypt, privateKey) - const deployer = Uint8Array.from(key.getPublic('array')) - // Hash and sign serialized deploy - const hashed = blake.blake2bHex(deploySerialized, void 666, 32) - const sigArray = key.sign(hashed, {canonical: true}).toDER('array') - const sig = Uint8Array.from(sigArray) - - // Return deploy object / ready for sending to RNode - return { - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - deployer, sig, sigAlgorithm, - } -} - -export const verifyDeploy = deployObj => { - const { - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - deployer, sig, sigAlgorithm, - } = deployObj - - // Serialize deploy data for signing - const deploySerialized = deployDataProtobufSerialize({ - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - }) - - // Signing public key to verify - const crypt = new ec(sigAlgorithm) - const key = crypt.keyFromPublic(deployer) - // Hash and verify signature - const hashed = blake.blake2bHex(deploySerialized, void 666, 32) - const isValid = key.verify(hashed, sig) - - return isValid -} - -// Fix for ec.keyFromPrivate not accepting KeyPair -// - detect KeyPair if it have `sign` function -const getSignKey = (crypt, pk) => - pk && pk.sign && pk.sign.constructor == Function ? pk : crypt.keyFromPrivate(pk) - -// Serialization of DeployDataProto object without generated JS code -export const deployDataProtobufSerialize = deployData => { - const { term, timestamp, phloPrice, phloLimit, validAfterBlockNumber } = deployData - - // Create binary stream writer - const writer = new jspb.BinaryWriter() - // Write fields (protobuf doesn't serialize default values) - const writeString = (order, val) => val != "" && writer.writeString(order, val) - const writeInt64 = (order, val) => val != 0 && writer.writeInt64(order, val) - - // https://github.com/rchain/rchain/blob/f7e46a9/models/src/main/protobuf/CasperMessage.proto#L134-L143 - // message DeployDataProto { - // bytes deployer = 1; //public key - // string term = 2; //rholang source code to deploy (will be parsed into `Par`) - // int64 timestamp = 3; //millisecond timestamp - // bytes sig = 4; //signature of (hash(term) + timestamp) using private key - // string sigAlgorithm = 5; //name of the algorithm used to sign - // int64 phloPrice = 7; //phlo price - // int64 phloLimit = 8; //phlo limit for the deployment - // int64 validAfterBlockNumber = 10; - // } - - // Serialize fields - writeString(2, term) - writeInt64(3, timestamp) - writeInt64(7, phloPrice) - writeInt64(8, phloLimit) - writeInt64(10, validAfterBlockNumber) - - return writer.getResultBuffer() -} diff --git a/src/rnode-web.js b/src/rnode-web.js deleted file mode 100644 index 9ceb696..0000000 --- a/src/rnode-web.js +++ /dev/null @@ -1,198 +0,0 @@ -import * as R from 'ramda' -import { ec } from 'elliptic' - -import { encodeBase16, decodeBase16 } from './lib.js' -import { verifyDeployEth, recoverPublicKeyEth } from './eth/eth-sign.js' -import { ethDetected, ethereumAddress, ethereumSign } from './eth/eth-wrapper.js' -import { signDeploy, verifyDeploy, deployDataProtobufSerialize } from './rnode-sign' - -export const makeRNodeWeb = effects => { - // Dependency DOM fetch function - const { fetch } = effects - - // Basic wrapper around DOM `fetch` method - const rnodeHttp = makeRNodeHttpInternal(fetch) - - // RNode HTTP API methods - return { - rnodeHttp, - sendDeploy : sendDeploy(rnodeHttp), - getDataForDeploy: getDataForDeploy(rnodeHttp), - propose : propose(rnodeHttp), - } -} - -// Helper function to create JSON request to RNode Web API -const makeRNodeHttpInternal = domFetch => async (httpUrl, apiMethod, data) => { - // Prepare fetch options - const postMethods = ['prepare-deploy', 'deploy', 'data-at-name', 'explore-deploy', 'propose'] - const isPost = !!data && R.includes(apiMethod, postMethods) - const httpMethod = isPost ? 'POST' : 'GET' - const url = method => `${httpUrl}/api/${method}` - const body = typeof data === 'string' ? data : JSON.stringify(data) - // Make JSON request - const opt = { method: httpMethod, body } - const resp = await domFetch(url(apiMethod), opt) - const result = await resp.json() - // Add status if server error - if (!resp.ok) { - const ex = Error(result) - ex.status = resp.status - throw ex - } - - return result -} - -// Creates deploy, signing and sending to RNode -const sendDeploy = rnodeHttp => async (node, account, code, phloLimit) => { - // Check if deploy can be signed - if (!account.privKey) { - const ethAddr = account.ethAddr - if (ethDetected && !!ethAddr) { - // If Metamask is detected check ETH address - const ethAddr = await ethereumAddress() - if (ethAddr.replace(/^0x/, '') !== account.ethAddr) - throw Error('Selected account is not the same as Metamask account.') - } else { - throw Error(`Selected account doesn't have private key and cannot be used for signing.`) - } - } - - // Get the latest block number - const [{ blockNumber }] = await rnodeHttp(node.httpUrl, 'blocks/1') - - // Create a deploy - const phloLimitNum = !!phloLimit || phloLimit == 0 ? phloLimit : 250e3 - const deployData = { - term: code, - phloLimit: phloLimitNum, phloPrice: 1, - validAfterBlockNumber: blockNumber, - timestamp: Date.now(), - } - - const deploy = !!account.privKey - ? signPrivKey(deployData, account.privKey) - : await signMetamask(deployData) - - // Send deploy / result is deploy signature (ID) - await rnodeHttp(node.httpUrl, 'deploy', deploy) - - return deploy -} - -// Singleton timeout handle to ensure only one execution -let GET_DATA_TIMEOUT_HANDLE - -// Listen for data on `deploy signature` -const getDataForDeploy = rnodeHttp => async ({httpUrl}, deployId, onProgress) => { - GET_DATA_TIMEOUT_HANDLE && clearTimeout(GET_DATA_TIMEOUT_HANDLE) - - const getData = (resolve, reject) => async () => { - const getDataUnsafe = async () => { - // Fetch deploy by signature (deployId) - const deploy = await fetchDeploy(rnodeHttp)({httpUrl}, deployId) - if (deploy) { - // Deploy found (added to a block) - const args = { depth: 1, name: { UnforgDeploy: { data: deployId } } } - // Request for data at deploy signature (deployId) - const { exprs } = await rnodeHttp(httpUrl, 'data-at-name', args) - // Extract cost from deploy info - const { cost } = deploy - // Check deploy errors - const {errored, systemDeployError} = deploy - if (errored) { - throw Error(`Deploy error when executing Rholang code.`) - } else if (!!systemDeployError) { - throw Error(`${systemDeployError} (system error).`) - } - // Return data with cost (assumes data in one block) - resolve({data: exprs[0], cost}) - } else { - // Retry - const cancel = await onProgress() - if (!cancel) { - GET_DATA_TIMEOUT_HANDLE && clearTimeout(GET_DATA_TIMEOUT_HANDLE) - GET_DATA_TIMEOUT_HANDLE = setTimeout(getData(resolve, reject), 7500) - } - } - } - try { await getDataUnsafe() } - catch (ex) { reject(ex) } - } - return await new Promise((resolve, reject) => { - getData(resolve, reject)() - }) -} - -const fetchDeploy = rnodeHttp => async ({httpUrl}, deployId) => { - // Request a block with the deploy - const block = await rnodeHttp(httpUrl, `deploy/${deployId}`) - .catch(ex => { - // Handle response code 400 / deploy not found - if (ex.status !== 400) throw ex - }) - if (block) { - const {deploys} = await rnodeHttp(httpUrl, `block/${block.blockHash}`) - const deploy = deploys.find(({sig}) => sig === deployId) - if (!deploy) // This should not be possible if block is returned - throw Error(`Deploy is not found in the block (${block.blockHash}).`) - // Return deploy - return deploy - } -} - -// Helper function to propose via HTTP -const propose = rnodeHttp => ({httpAdminUrl}) => rnodeHttp(httpAdminUrl, 'propose', {}) - -// Creates deploy signature with Metamask -const signMetamask = async deployData => { - // Serialize and sign with Metamask extension - // - this will open a popup for user to confirm/review - const data = deployDataProtobufSerialize(deployData) - const ethAddr = await ethereumAddress() - const sigHex = await ethereumSign(data, ethAddr) - // Extract public key from signed message and signature - const pubKeyHex = recoverPublicKeyEth(data, sigHex) - // Create deploy object for signature verification - const deploy = { - ...deployData, - sig: decodeBase16(sigHex), - deployer: decodeBase16(pubKeyHex), - sigAlgorithm: 'secp256k1:eth', - } - // Verify signature signed with Metamask - const isValidDeploy = verifyDeployEth(deploy) - if (!isValidDeploy) throw Error('Metamask signature verification failed.') - - return toWebDeploy(deploy) -} - -// Creates deploy signature with plain private key -const signPrivKey = (deployData, privateKey) => { - // Create signing key - const secp256k1 = new ec('secp256k1') - const key = secp256k1.keyFromPrivate(privateKey) - const deploy = signDeploy(key, deployData) - // Verify deploy signature - const isValidDeploy = verifyDeploy(deploy) - if (!isValidDeploy) throw Error('Deploy signature verification failed.') - - return toWebDeploy(deploy) -} - -// Converts JS object from protobuf spec. to Web API spec. -const toWebDeploy = deployData => { - const { - term, timestamp, phloPrice, phloLimit, validAfterBlockNumber, - deployer, sig, sigAlgorithm, - } = deployData - - const result = { - data: { term, timestamp, phloPrice, phloLimit, validAfterBlockNumber }, - sigAlgorithm, - signature: encodeBase16(sig), - deployer: encodeBase16(deployer), - } - return result -} diff --git a/src/web/style.less b/src/style.less similarity index 70% rename from src/web/style.less rename to src/style.less index d8bd689..955d328 100644 --- a/src/web/style.less +++ b/src/style.less @@ -4,6 +4,7 @@ @color-bg-light-red: #b1a8a847; @color-bg-light-blue: #c2c7ce61; +@color-bg-light-green: #b1c3b148; :root { font-size: .9rem; @@ -20,6 +21,11 @@ body { margin-right: 5px; } +body > *, .ctrl { + margin-top: 0; + margin-right: 0; +} + hr { margin: 12px 0 5px; padding: 0; @@ -79,6 +85,14 @@ optgroup > option { color: #000; } +.testnet-llbm-color { + color: #00ad00; +} + +.testnet-bm-color { + color: #009bad; +} + .testnet-color { color: @color-blue; } @@ -91,6 +105,41 @@ optgroup > option { font-size: 1.2rem; } +// Test net (leaderless block-merge) +.testnet-llbm { + h2 { + .testnet-llbm-color + } + + .address-ctrl { + background-color: @color-bg-light-green; + } + + .add-account:not([disabled]) { + .testnet-llbm-color; + font-weight: bold; + } +} + + +// Test net (block-merge) +.testnet-bm { + h2 { + .testnet-bm-color + } + + .address-ctrl { + background-color: @color-bg-light-blue; + } + + .add-account:not([disabled]) { + .testnet-bm-color; + font-weight: bold; + } +} + + +// Test net .testnet { h2 { .testnet-color @@ -106,6 +155,7 @@ optgroup > option { } } +// Main net .mainnet { h2 { .mainnet-color @@ -183,3 +233,19 @@ optgroup > option { text-decoration: underline; cursor: pointer; } + +.dev-info-box { + position: fixed; + padding: 15px; + width: 100%; + box-sizing: border-box; + text-align: center; + font-weight: bold; + background-color: #ff4343; + opacity: .85; + z-index: 100; +} + +#app { + padding-top: 28px; +} diff --git a/src/web/controls/address-ctrl.js b/src/web/controls/address-ctrl.js deleted file mode 100644 index 4d64667..0000000 --- a/src/web/controls/address-ctrl.js +++ /dev/null @@ -1,138 +0,0 @@ -import * as R from 'ramda' -import m from 'mithril' -import { - getAddrFromPrivateKey, getAddrFromPublicKey, getAddrFromEth, - newRevAddr, verifyRevAddr, -} from '@tgrospic/rnode-grpc-js' -import { labelStyle } from './common' -import { ethereumAddress, ethDetected } from '../../eth/eth-wrapper' - -export const addressCtrl = (st, {wallet, onAddAccount}) => { - const updateAddress = text => { - const val = text.replace(/^0x/, '').trim() - // Account from private key, public key, ETH or REV address - const fromPriv = getAddrFromPrivateKey(val) - const fromPub = getAddrFromPublicKey(val) - const fromEth = getAddrFromEth(val) - const isRev = verifyRevAddr(val) - // Render - if (isRev) { - st.set({text, revAddr: text}) - } else if (!!fromPriv) { - st.set({text, privKey: val, ...fromPriv}) - } else if (!!fromPub) { - st.set({text, pubKey: val, ...fromPub}) - } else if (!!fromEth) { - st.set({text, privKey: '', pubKey: '', ethAddr: val, revAddr: fromEth}) - } else - st.set({text}) - } - - const addAccount = async _ => { - const account = {name, privKey, pubKey, ethAddr, revAddr} - await onAddAccount(account) - clear() - } - - const clear = _ => { - st.set({text: ''}) - } - - const fillMetamaskAccountEv = async _ => { - const ethAddr = await ethereumAddress() - updateAddress(ethAddr) - } - - const addrKeyPressEv = ev => { - const text = ev.target.value - updateAddress(text) - } - - const nameKeyPressEv = ev => { - const nameVal = ev.target.value - st.update(s => ({...s, name: nameVal})) - } - - const newRevAddrEv = _ => { - const {privKey} = newRevAddr() - updateAddress(privKey) - } - - const updateEv = revAddr => _ => { - const acc = wallet.find(R.propEq('revAddr', revAddr)) - st.set(acc) - } - - // Control state - const {text, privKey, pubKey, ethAddr, revAddr, name} = st.view({}) - - const description = m('span.info', - `Any address used on this page must be first added as an account and assign a name. All accounts are then shown in dropdown menus to select as send or receive address.`, - m('br'), - `Entered information is not stored anywhere except on the page. After exit or refresh the page, all information is lost.` - ) - const labelSource = 'REV address / ETH address / Public key / Private key' - const metamaskTitle = 'Copy ETH address from selected Metamask account' - const newAccountTitle = 'Generate new private key (public key, ETH, REV)' - const saveTitle = 'Save account with assigned name' - const closeTitle = 'Cancel edit of account' - const namePlaceholder = 'Friendly name for account' - const addDisabled = !name || !name.trim() - const isEdit = !!revAddr - - return m('.ctrl.address-ctrl', - m('h2', 'REV wallet (import REV address, ETH address, public/private key, Metamask)'), - description, - - // Input textbox - m('', labelStyle(text), labelSource), - m('input[type=text]', { - autocomplete: 'nono', placeholder: labelSource, - value: text, oninput: addrKeyPressEv - }), - - // New accounts - ethDetected && m('button', {title: metamaskTitle, disabled: isEdit, onclick: fillMetamaskAccountEv}, 'Metamask account'), - m('button', {title: newAccountTitle, disabled: isEdit, onclick: newRevAddrEv}, 'New account'), - - // Edit wallet item - isEdit && m('.address-gen', - m('table', - privKey && m('tr', m('td', 'Private key'), m('td', privKey)), - pubKey && m('tr', m('td', 'Public key'), m('td', pubKey)), - ethAddr && m('tr', m('td', 'ETH'), m('td', ethAddr)), - m('tr', m('td', 'REV'), m('td', m('b', revAddr))), - ), - // Action buttons - m('input[type=text].addr-name', {placeholder: namePlaceholder, value: name, oninput: nameKeyPressEv}), - m('button.add-account', {title: saveTitle, onclick: addAccount, disabled: addDisabled}, 'Save account'), - m('button', {title: closeTitle, onclick: clear}, 'Close'), - ), - - // Wallet display - wallet && !!wallet.length && m('table.wallet', - m('thead', - m('th', 'Account'), - m('th', 'REV'), - m('th', 'ETH'), - m('th', 'PUBLIC'), - m('th', 'PRIVATE'), - ), - wallet.map(({name, privKey = '', pubKey = '', ethAddr = '', revAddr}) => { - const rev = revAddr.slice(0, 10) - const eth = ethAddr.slice(0, 10) - const pub = pubKey.slice(0, 10) - const priv = privKey.slice(0, 5) - return m('tr', - m('td.account', {onclick: updateEv(revAddr)}, name), - m('td', rev), - m('td', eth), - m('td', pub), - m('td', - priv ? m('span', {title: 'Private key saved with this account'}, '✓') : '' - ), - ) - }) - ), - ) -} diff --git a/src/web/controls/balance-ctrl.js b/src/web/controls/balance-ctrl.js deleted file mode 100644 index 6e5fada..0000000 --- a/src/web/controls/balance-ctrl.js +++ /dev/null @@ -1,58 +0,0 @@ -import m from 'mithril' -import * as R from 'ramda' -import { labelStyle, showRevDecimal, showNetworkError } from './common' - -const initSelected = (st, wallet) => { - const {account} = st - - // Pre-select first account if not selected - const selAccount = R.isNil(account) && !R.isNil(wallet) - ? R.head(wallet) : account - - return {...st, account: selAccount} -} - -export const balanceCtrl = (st, {wallet = [], onCheckBalance}) => { - const checkBalanceEv = async _ => { - st.update(s => ({...s, dataBal: '...', dataError: ''})) - - const [bal, dataError] = await onCheckBalance(account.revAddr) - .catch(ex => ['', ex.message]) - - const dataBal = typeof bal === 'number' - ? bal === 0 ? `${bal}` : `${bal} (${showRevDecimal(bal)} REV)` : '' - st.update(s => ({...s, dataBal, dataError})) - } - - const accountChangeEv = ev => { - const account = R.find(R.propEq('revAddr', ev.target.value), wallet) - st.set({account}) - } - - const labelAddr = 'REV address' - const isWalletEmpty = R.isNil(wallet) || R.isEmpty(wallet) - - // Control state - const {account, dataBal, dataError} = initSelected(st.view({}), wallet) - - return m('.ctrl.balance-ctrl', - m('h2', 'Check REV balance'), - isWalletEmpty ? m('b', 'REV wallet is empty, add accounts to check balance.') : [ - m('', 'Sends exploratory deploy to selected read-only RNode.'), - - // REV address dropdown - m('', labelStyle(account), labelAddr), - m('select', {onchange: accountChangeEv}, - wallet.map(({name, revAddr}) => - m('option', {value: revAddr}, `${name}: ${revAddr}`) - ), - ), - - // Action button / results - m(''), - m('button', {onclick: checkBalanceEv, disabled: !account}, 'Check balance'), - m('b', dataBal), - m('b.warning', showNetworkError(dataError)), - ] - ) -} diff --git a/src/web/controls/common.js b/src/web/controls/common.js deleted file mode 100644 index c77925f..0000000 --- a/src/web/controls/common.js +++ /dev/null @@ -1,111 +0,0 @@ -import * as R from 'ramda' -import m from 'mithril' - -// Common styles - -const labelBaseStyle = { 'font-size': '.8rem', padding: '2px 0 0 0', transition: 'all 1s' } - -const styleShowHide = isVis => ({ opacity: isVis ? .65 : 0, height: isVis ? 'auto' : 0 }) - -export const labelStyle = isVis => ({ style: {...labelBaseStyle, ...styleShowHide(isVis) } }) - -export const showRevDecimal = amount => { - const d = 8 // decimal places - const amountNr = parseInt(amount) - const amountStr = isNaN(amountNr) ? '' : `${amountNr}` - const length = amountStr.length - const trimZeroes = s => s.replace(/[\.]?[0]*$/ig, '') - if (length === 0) return '' - if (length <= d) { - const padded = amountStr.padStart(d, '0') - return trimZeroes(`0.${padded}`) - } else if (length > d) { - const prefix = amountStr.slice(0, -d) - const suffix = amountStr.slice(-d) - return trimZeroes(`${prefix}.${suffix}`) - } -} - -export const labelRev = amount => - amount && m('span.rev', amount, m('b', ' REV')) - -export const showNetworkError = errMessage => - errMessage == 'Failed to fetch' - ? `${errMessage}: select a running RNode from the above selector.` - : errMessage - -// State cell -export const mkCell = () => { - let _stRef, _listener - const ln = path => - R.is(Function, path) ? path : R.lensPath(path.split('.').filter(p => !R.isEmpty(p))) - const stCell = path => { - const lens = ln(path) - return { - view: def => { - const res = R.view(lens, _stRef) - return R.isNil(res) ? def : res - }, - set: v => { - _stRef = R.set(lens, v, _stRef) - // Trigger event (render) - _listener(_stRef) - }, - update: f => { - const s = R.view(lens, _stRef) - _stRef = R.set(lens, f(s), _stRef) - // Trigger event (render) - _listener(_stRef) - }, - // Compose lenses / make sub cells - o: compPath => { - const subLens = R.compose(lens, ln(compPath)) - return stCell(subLens) - }, - } - } - return { - ...stCell(''), - // Set event (on-change) listener - setListener: f => { _listener = f }, - } -} - -// Wraps Virtual DOM renderer to render state -export const makeRenderer = (element, view) => (state, deps) => { - const stateCell = mkCell() - const render = () => { - m.render(element, view(stateCell, deps)) - } - stateCell.setListener(render) - stateCell.set(state) -} - -export const pageLog = ({log, document}) => { - // Page logger - const logEL = document.querySelector('#log') - const logWrap = (...args) => { - const lines = Array.from(args).map(x => { - const f = (_, v) => v && v.buffer instanceof ArrayBuffer - ? Array.from(v).toString() : v - return JSON.stringify(x, f, 2).replace(/\\n/g, '
') - }) - const el = document.createElement('pre') - el.innerHTML = lines.join(' ') - logEL.prepend(el) - log(...args) - } - return logWrap -} - -export const handleHashHref = pageBody => { - // Prevents default redirect for link
- pageBody.addEventListener('click', ev => { - const target = ev.target - const isHrefHash = target - && target.nodeName === 'A' - && target.attributes['href'].value === '#' - - if (isHrefHash) ev.preventDefault() - }) -} diff --git a/src/web/controls/custom-deploy-ctrl.js b/src/web/controls/custom-deploy-ctrl.js deleted file mode 100644 index 22ea223..0000000 --- a/src/web/controls/custom-deploy-ctrl.js +++ /dev/null @@ -1,144 +0,0 @@ -import m from 'mithril' -import * as R from 'ramda' -import { labelStyle, showRevDecimal, labelRev, showNetworkError } from './common' - -const sampleReturnCode = `new return(\`rho:rchain:deployId\`) in { - return!((42, true, "Hello from blockchain!")) -}` - -const sampleInsertToRegistry = `new return(\`rho:rchain:deployId\`), - insertArbitrary(\`rho:registry:insertArbitrary\`) -in { - new uriCh, valueCh in { - insertArbitrary!("My value", *uriCh) | - for (@uri <- uriCh) { - return!(("URI", uri)) - } - } -}` - -const sampleRegistryLookup = `new return(\`rho:rchain:deployId\`), - lookup(\`rho:registry:lookup\`) -in { - new valueCh in { - // Fill in registry URI: \`rho:id:11fhnau8j3...h4459w9bpus6oi\` - lookup!( , *valueCh) | - for (@value <- valueCh) { - return!(("Value from registry", value)) - } - } -}` - -const samples = [ - ['return data', sampleReturnCode], - ['insert to registry', sampleInsertToRegistry], - ['registry lookup', sampleRegistryLookup], -] - -const initSelected = (st, wallet) => { - const {selRevAddr, phloLimit = 250000} = st - - // Pre-select first account if not selected - const initRevAddr = R.isNil(selRevAddr) && !R.isNil(wallet) && !!wallet.length - ? R.head(wallet).revAddr : selRevAddr - - return {...st, selRevAddr: initRevAddr, phloLimit} -} - -export const customDeployCtrl = (st, {wallet = [], node, onSendDeploy, onPropose, warn}) => { - const onSendDeployEv = code => async _ => { - st.update(s => ({...s, status: '...', dataError: ''})) - - const account = R.find(R.propEq('revAddr', selRevAddr), wallet) - const [status, dataError] = await onSendDeploy({code, account, phloLimit}) - .then(x => [x, '']) - .catch(ex => { - warn('DEPLOY ERROR', ex) - return ['', ex.message] - }) - - st.update(s => ({...s, status, dataError})) - } - - const onProposeEv = async _ => { - st.update(s => ({...s, proposeStatus: '...', proposeError: ''})) - - const [proposeStatus, proposeError] = await onPropose(node) - .then(x => [x, '']) - .catch(ex => ['', ex.message]) - - st.update(s => ({...s, proposeStatus, proposeError})) - } - - const accountChangeEv = ev => { - const { revAddr } = wallet[ev.target.selectedIndex] - st.update(s => ({...s, selRevAddr: revAddr})) - } - - const updateCodeEv = code => _ => { - st.update(s => ({...s, code})) - } - - // Field update by name - const valEv = name => ev => { - const val = ev.target.value - st.update(s => ({...s, [name]: val})) - } - - // Control state - const {selRevAddr, code, phloLimit, status, dataError, proposeStatus, proposeError} - = initSelected(st.view({}), wallet) - - const labelAddr = 'Signing account' - const labelCode = 'Rholang code' - const labelPhloLimit = 'Phlo limit (in revlettes x10^8)' - const isWalletEmpty = R.isNil(wallet) || R.isEmpty(wallet) - const showPropose = node.network === 'localnet' - const canDeploy = (code || '').trim() !== '' && !!selRevAddr - const phloLimitPreview = showRevDecimal(phloLimit) - - return m('.ctrl.custom-deploy-ctrl', - m('h2', 'Custom deploy'), - isWalletEmpty ? m('b', 'REV wallet is empty, add accounts to make deploys.') : [ - m('span', 'Send deploy to selected validator RNode.'), - - // Rholang examples - m('', - m('span', 'Sample code: '), - samples.map(([title, code]) => - m('a', {onclick: updateCodeEv(code), href: '#'}, title), - ) - ), - - // REV address dropdown - m('', labelStyle(!!selRevAddr), labelAddr), - m('select', {onchange: accountChangeEv}, - wallet.map(({name, revAddr}) => - m('option', `${name}: ${revAddr}`) - ), - ), - - // Rholang code (editor) - m('', labelStyle(code), labelCode), - m('textarea.deploy-code', {value: code, rows: 13, placeholder: 'Rholang code', oninput: valEv('code')}), - - // Phlo limit - m('', labelStyle(true), labelPhloLimit), - m('input[type=number].phlo-limit', { - value: phloLimit, placeholder: labelPhloLimit, oninput: valEv('phloLimit') - }), - labelRev(phloLimitPreview), - - // Action buttons / results - m(''), - m('button', {onclick: onSendDeployEv(code), disabled: !canDeploy}, 'Deploy Rholang code'), - status && m('b', status), - dataError && m('b.warning', showNetworkError(dataError)), - - m(''), - showPropose && m('button', {onclick: onProposeEv}, 'Propose'), - showPropose && proposeStatus && m('b', proposeStatus), - showPropose && proposeError && m('b.warning', showNetworkError(proposeError)), - ] - ) -} diff --git a/src/web/controls/main-ctrl.js b/src/web/controls/main-ctrl.js deleted file mode 100644 index 2d7cc36..0000000 --- a/src/web/controls/main-ctrl.js +++ /dev/null @@ -1,124 +0,0 @@ -// // @ts-check -import * as R from 'ramda' -import m from 'mithril' -import { localNet, testNet, mainNet, getNodeUrls } from '../../rchain-networks' -import { ethDetected } from '../../eth/eth-wrapper' -import { makeRenderer } from './common' - -// Controls -import { selectorCtrl } from './selector-ctrl' -import { addressCtrl } from './address-ctrl' -import { balanceCtrl } from './balance-ctrl' -import { transferCtrl } from './transfer-ctrl' -import { customDeployCtrl } from './custom-deploy-ctrl' - -/* - This will display the test page to select local, testnet, and mainnet validators - and make REV transfers and check balance. -*/ - -const repoUrl = 'https://github.com/tgrospic/rnode-client-js' - -const mainCtrl = (st, effects) => { - const { appCheckBalance, appTransfer, appSendDeploy, appPropose, log, warn } = effects - - const onCheckBalance = node => revAddr => appCheckBalance({node, revAddr}) - - const onTransfer = (node, setStatus) => ({fromAccount, toAccount, amount}) => - appTransfer({node, fromAccount, toAccount, amount, setStatus}) - - const onSendDeploy = (node, setStatus) => ({code, account, phloLimit}) => - appSendDeploy({node, code, account, phloLimit, setStatus}) - - const onPropose = node => () => appPropose(node) - - const appendUpdateLens = pred => R.lens(R.find(pred), (x, xs) => { - const idx = R.findIndex(pred, xs) - const apply = idx === -1 ? R.append : R.update(idx) - return apply(x, xs) - }) - - const onSaveAccount = account => - st.o('wallet') - .o(appendUpdateLens(R.propEq('revAddr', account.revAddr))) - .set(account) - - // State lenses for each control - const selSt = st.o('sel') - const addressSt = st.o('address') - const balanceSt = st.o('balance') - const transferSt = st.o('transfer') - const customDeploySt = st.o('customDeploy') - - const {nets, sel, wallet} = st.view() - const valNodeUrls = getNodeUrls(sel.valNode) - const readNodeUrls = getNodeUrls(sel.readNode) - - const setTransferStatus = transferSt.o('status').set - const setDeployStatus = customDeploySt.o('status').set - - // App render - return m(`.${sel.valNode.name}`, - m('.ctrl', - 'Demo client for RNode ', - m('a', {href: repoUrl, target: '_blank'}, repoUrl), - m('h1', 'RNode client testing page'), - ), - - // Selector control - m('hr'), - selectorCtrl(selSt, {nets}), - - // REV wallet control - addressCtrl(addressSt, {wallet, onAddAccount: onSaveAccount}), - - // Check balance control - balanceCtrl(balanceSt, {wallet, onCheckBalance: onCheckBalance(readNodeUrls)}), - m('hr'), - - // Transfer REV control - transferCtrl(transferSt, { - wallet, onTransfer: onTransfer(valNodeUrls, setTransferStatus), warn, - }), - - // Custom deploy control - m('hr'), - customDeployCtrl(customDeploySt, { - wallet, node: valNodeUrls, - onSendDeploy: onSendDeploy(valNodeUrls, setDeployStatus), - onPropose: onPropose(valNodeUrls), - warn, - }), - ) -} - -const nets = [localNet, testNet, mainNet] - .map(({title, name, hosts, readOnlys}) => ({ - title, name, - hosts: hosts.map(x => ({...x, title, name})), - readOnlys: readOnlys.map(x => ({...x, title, name})), - })) - -const initNet = nets[0] - -// Initial application state -const initialState = { - // Validators to choose - nets, - // Selected validator - sel: { valNode: initNet.hosts[0], readNode: initNet.readOnlys[1] }, - // Initial wallet - wallet: [], // [{name: 'My REV account', ...newRevAddr()}] -} - -export const startApp = (element, effects) => { - const { warn } = effects - - // App renderer / creates state cell that is passed to controls - const r = makeRenderer(element, mainCtrl) - - // Start app / the big bang! - r(initialState, effects) - - warn('ETH detected', ethDetected) -} diff --git a/src/web/controls/selector-ctrl.js b/src/web/controls/selector-ctrl.js deleted file mode 100644 index 10c9406..0000000 --- a/src/web/controls/selector-ctrl.js +++ /dev/null @@ -1,108 +0,0 @@ -import * as R from 'ramda' -import m from 'mithril' -import { getNodeUrls } from '../../rchain-networks' -import { labelStyle } from './common' - -export const selectorCtrl = (st, {nets}) => { - const findValidatorByIndex = index => - nets.flatMap(({hosts}) => hosts)[index] - - const findReadOnlyByIndex = (index, netName) => - nets.filter(x => x.name === netName).flatMap(({readOnlys}) => readOnlys)[index] - - const onSelIdx = ev => { - const sel = findValidatorByIndex(ev.target.selectedIndex) - const read = sel.name === valNode.name ? readNode : findReadOnlyByIndex(0, sel.name) - st.set({valNode: sel, readNode: read}) - } - - const onSelReadIdx = ev => { - const sel = findReadOnlyByIndex(ev.target.selectedIndex, valNode.name) - st.set({valNode, readNode: sel}) - } - - const getDdlText = ({name, domain, grpc, https, http}) => { - const httpInfo = !!https ? `:${https}` : !!http ? `:${http}` : ' ' - const isLocal = name === 'localnet' - return isLocal ? `${domain}${httpInfo}` : domain - } - - const isEqNode = (v1, v2) => - R.eqBy(({domain, gprc, https, http}) => ({domain, gprc, https, http}), v1, v2) - - // Control state - const {valNode, readNode} = st.view({}) - - const isLocal = valNode.name === 'localnet' - const isTestnet = valNode.name === 'testnet' - const isMainnet = valNode.name === 'mainnet' - const valUrls = getNodeUrls(valNode) - const readUrls = getNodeUrls(readNode) - - return m('.ctrl.selector-ctrl', - // Validator selector - m('h2', 'RChain Network selector'), - m('h3', `${valNode.title} - validator node`), - m('select', {onchange: onSelIdx}, - nets.map(({title, hosts, name}) => - m(`optgroup.${name}-color`, {label: title}, - hosts.map(({name, domain, grpc, https, http}) => - m(`option`, - {title, selected: isEqNode(valNode, {domain, grpc, https, http})}, - getDdlText({name, domain, grpc, https, http}) - ) - ), - ), - ), - ), - - // Validator info - m(''), - m('span', 'Direct links'), - m('a', {target: '_blank', href: valUrls.statusUrl}, 'status'), - m('a', {target: '_blank', href: valUrls.getBlocksUrl}, 'blocks'), - isTestnet && [ - m('a', {target: '_blank', href: valUrls.logsUrl}, 'logs'), - m('a', {target: '_blank', href: valUrls.filesUrl}, 'files'), - ], - m('table', - valUrls.grpcUrl && m('tr', m('td', 'gRPC'), m('td', m('pre', valUrls.grpcUrl))), - m('tr', m('td', 'HTTP'), m('td', m('pre', valUrls.httpUrl))), - isLocal && m('tr', m('td', 'Admin'), m('td', m('pre', valUrls.httpAdminUrl))), - ), - isMainnet && [ - m('p.warning', 'You are connected to MAIN RChain network. Any deploy will use REAL REVs.'), - ], - - // Read-only selector - m('h3', `${readNode.title} - read-only node`), - (isTestnet || isMainnet) && !!readNode.http && m('', labelStyle(true), httpMixedContentInfo), - m('select', {onchange: onSelReadIdx}, - nets.filter(x => x.name === valNode.name).map(({title, readOnlys}) => - m('optgroup', {label: title}, - readOnlys.map(({name, domain, grpc, https, http}) => - m('option', - {title, selected: isEqNode(readNode, {domain, grpc, https, http})}, - getDdlText({name, domain, grpc, https, http}) - ) - ), - ), - ), - ), - - // Read-only info - m(''), - m('span', 'Direct links'), - m('a', {target: '_blank', href: readUrls.statusUrl}, 'status'), - m('a', {target: '_blank', href: readUrls.getBlocksUrl}, 'blocks'), - isTestnet && [ - m('a', {target: '_blank', href: readUrls.logsUrl}, 'logs'), - m('a', {target: '_blank', href: readUrls.filesUrl}, 'files'), - ], - m('table', - readUrls.grpcUrl && m('tr', m('td', 'gRPC'), m('td', m('pre', readUrls.grpcUrl))), - m('tr', m('td', 'HTTP'), m('td', m('pre', readUrls.httpUrl))), - isLocal && m('tr', m('td', 'Admin'), m('td', m('pre', readUrls.httpAdminUrl))), - ), - ) -} diff --git a/src/web/controls/transfer-ctrl.js b/src/web/controls/transfer-ctrl.js deleted file mode 100644 index 3419cf5..0000000 --- a/src/web/controls/transfer-ctrl.js +++ /dev/null @@ -1,96 +0,0 @@ -import m from 'mithril' -import * as R from 'ramda' -import { labelStyle, showRevDecimal, labelRev, showNetworkError } from './common' -import { ethDetected } from '../../eth/eth-wrapper' - -const initSelected = (st, wallet) => { - const {account, toAccount} = st - - // Pre-select first account if not selected - - const selAccount = R.isNil(account) && !R.isNil(wallet) - ? R.head(wallet) : account - - const selToAccount = R.isNil(toAccount) && !R.isNil(wallet) - ? R.head(wallet) : toAccount - - return {...st, account: selAccount, toAccount: selToAccount} -} - -export const transferCtrl = (st, {wallet, onTransfer, warn}) => { - const valEv = name => ev => { - const val = ev.target.value - st.update(s => ({...s, [name]: val})) - } - - const send = async _ => { - st.update(s => ({...s, status: '...', error: ''})) - await onTransfer({fromAccount: account, toAccount, amount}) - .then(x => { - st.update(s => ({...s, status: x, error: ''})) - }) - .catch(ex => { - st.update(s => ({...s, status: '', error: ex.message})) - warn('Transfer error', ex) - }) - } - - const onSelectFrom = async ev => { - const account = R.find(R.propEq('revAddr', ev.target.value), wallet) - st.update(s => ({...s, account})) - } - - const onSelectTo = async ev => { - const toAccount = R.find(R.propEq('revAddr', ev.target.value), wallet) - st.update(s => ({...s, toAccount})) - } - - // Control state - const {account, toAccount, amount, status, error} = initSelected(st.view({}), wallet) - - const labelSource = 'Source REV address' - const labelDestination = 'Destination REV address' - const labelAmount = 'Amount (in revlettes x10^8)' - const isWalletEmpty = R.isNil(wallet) || R.isEmpty(wallet) - const canTransfer = account && toAccount && amount && (account || ethDetected) - const amountPreview = showRevDecimal(amount) - - return m('.ctrl.transfer-ctrl', - m('h2', 'Transfer REV tokens'), - isWalletEmpty ? m('b', 'REV wallet is empty, add accounts to make transfers.') : [ - m('', 'Sends transfer deploy to selected validator RNode.'), - - // Source REV address dropdown - m('', labelStyle(account), labelSource), - m('select', {onchange: onSelectFrom}, - wallet.map(({name, revAddr}) => - m('option', {value: revAddr}, `${name}: ${revAddr}`) - ), - ), - - // Target REV address dropdown - m(''), - m('', labelStyle(toAccount), labelDestination), - m('select', {onchange: onSelectTo}, - wallet.map(({name, revAddr}) => - m('option', {value: revAddr}, `${name}: ${revAddr}`) - ), - ), - - // REV amount - m(''), - m('', labelStyle(amount), labelAmount), - m('input[type=number].rev-amount', { - placeholder: labelAmount, value: amount, - oninput: valEv('amount'), - }), - labelRev(amountPreview), - - // Action button / result - m(''), - m('button', {onclick: send, disabled: !canTransfer}, 'Transfer'), - status && m('b', status), - error && m('b.warning', showNetworkError(error)), - ] - ) -} diff --git a/src/web/rnode-actions.js b/src/web/rnode-actions.js deleted file mode 100644 index b76a263..0000000 --- a/src/web/rnode-actions.js +++ /dev/null @@ -1,147 +0,0 @@ -import * as R from 'ramda' -import { checkBalance_rho } from '../rho/check-balance' -import { transferFunds_rho } from '../rho/transfer-funds' - -export const makeRNodeActions = (rnodeWeb, {log, warn}) => { - const { rnodeHttp, sendDeploy, getDataForDeploy, propose } = rnodeWeb - - // App actions to process communication with RNode - return { - appCheckBalance: appCheckBalance({rnodeHttp}), - appTransfer : appTransfer({sendDeploy, getDataForDeploy, propose, log, warn}), - appSendDeploy : appSendDeploy({sendDeploy, getDataForDeploy, log}), - appPropose : appPropose({propose, log}), - } -} - -const appCheckBalance = ({rnodeHttp}) => async ({node, revAddr}) => { - const deployCode = checkBalance_rho(revAddr) - const {expr: [e]} = await rnodeHttp(node.httpUrl, 'explore-deploy', deployCode) - const dataBal = e && e.ExprInt && e.ExprInt.data - const dataError = e && e.ExprString && e.ExprString.data - return [dataBal, dataError] -} - -const appTransfer = effects => async ({node, fromAccount, toAccount, amount, setStatus}) => { - const {sendDeploy, getDataForDeploy, propose, log, warn} = effects - - log('TRANSFER', {amount, from: fromAccount.name, to: toAccount.name, node: node.httpUrl}) - - setStatus(`Deploying ...`) - - // Send deploy - const code = transferFunds_rho(fromAccount.revAddr, toAccount.revAddr, amount) - const {signature} = await sendDeploy(node, fromAccount, code) - log('DEPLOY ID (signature)', signature) - - if (node.network === 'localnet') { - // Propose on local network, don't wait for result - propose(node).catch(ex => warn(ex)) - } - - // Progress dots - const mkProgress = i => () => { - i = i > 60 ? 0 : i + 3 - return `Checking result ${R.repeat('.', i).join('')}` - } - const progressStep = mkProgress(0) - const updateProgress = _ => setStatus(progressStep()) - updateProgress() - - // Try to get result from next proposed block - const {data, cost} = await getDataForDeploy(node, signature, updateProgress) - // Extract data from response object - const args = data ? rhoExprToJS(data.expr) : void 0 - const costTxt = R.isNil(cost) ? 'failed to retrive' : cost - const [success, message] = args || [false, 'deploy found in the block but failed to get confirmation data'] - - if (!success) throw Error(`Transfer error: ${message}. // cost: ${costTxt}`) - return `✓ ${message} // cost: ${costTxt}` -} - -const appSendDeploy = effects => async ({node, code, account, phloLimit, setStatus}) => { - const {sendDeploy, getDataForDeploy, log} = effects - - log('SENDING DEPLOY', {account: account.name, phloLimit, node: node.httpUrl, code}) - - setStatus(`Deploying ...`) - - const {signature} = await sendDeploy(node, account, code, phloLimit) - log('DEPLOY ID (signature)', signature) - - // Progress dots - const mkProgress = i => () => { - i = i > 60 ? 0 : i + 3 - return `Checking result ${R.repeat('.', i).join('')}` - } - const progressStep = mkProgress(0) - const updateProgress = _ => setStatus(progressStep()) - updateProgress() - - // Try to get result from next proposed block - const {data, cost} = await getDataForDeploy(node, signature, updateProgress) - // Extract data from response object - const args = data ? rhoExprToJS(data.expr) : void 0 - - log('DEPLOY RETURN DATA', {args, cost, rawData: data}) - - const costTxt = R.isNil(cost) ? 'failed to retrive' : cost - const [success, message] = R.isNil(args) - ? [false, 'deploy found in the block but data is not sent on `rho:rchain:deployId` channel'] - : [true, R.is(Array, args) ? args.join(', ') : args] - - if (!success) throw Error(`Deploy error: ${message}. // cost: ${costTxt}`) - return `✓ (${message}) // cost: ${costTxt}` -} - -const appPropose = ({propose, log}) => async ({httpAdminUrl}) => { - const resp = await propose({httpAdminUrl}) - - log('Propose result', resp) - - return resp -} - -// Converts RhoExpr response from RNode WebAPI -// https://github.com/rchain/rchain/blob/b7331ae05/node/src/main/scala/coop/rchain/node/api/WebApi.scala#L128-L147 -// - return!("One argument") // monadic -// - return!((true, A, B)) // monadic as tuple -// - return!(true, A, B) // polyadic -// new return(`rho:rchain:deployId`) in { -// return!((true, "Hello from blockchain!")) -// } -// TODO: make it stack safe -const rhoExprToJS = input => { - const loop = rhoExpr => convert(rhoExpr)(converters) - const converters = R.toPairs(converterMapping(loop)) - return loop(input) -} - -const convert = rhoExpr => R.pipe( - R.map(matchTypeConverter(rhoExpr)), - R.find(x => !R.isNil(x)), - // Return the whole object if unknown type - x => R.isNil(x) ? [R.identity, rhoExpr] : x, - ([f, d]) => f(d) -) - -const matchTypeConverter = rhoExpr => ([type, f]) => { - const d = R.path([type, 'data'], rhoExpr) - return R.isNil(d) ? void 666 : [f, d] -} - -const converterMapping = loop => ({ - "ExprInt": R.identity, - "ExprBool": R.identity, - "ExprString": R.identity, - "ExprBytes": R.identity, - "ExprUri": R.identity, - "UnforgDeploy": R.identity, - "UnforgDeployer": R.identity, - "UnforgPrivate": R.identity, - "ExprUnforg": loop, - "ExprPar": R.map(loop), - "ExprTuple": R.map(loop), - "ExprList": R.map(loop), - "ExprMap": R.mapObjIndexed(loop), -}) diff --git a/tsconfig.json b/tsconfig.json index 34ffb14..0f84934 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,30 @@ { "compilerOptions": { - "resolveJsonModule": true, - "noImplicitAny": true, - "alwaysStrict": true, - "noImplicitThis": true, + "declaration": true, + "declarationDir": "dist-types", + "emitDeclarationOnly": true, + "outDir": "dist", + "sourceMap": true, + "strict": true, "noImplicitReturns": true, - "noUnusedLocals": false + "noImplicitAny": true, + "module": "ES6", + "strictPropertyInitialization": true, + "moduleResolution": "Node", + "target": "es5", + "allowJs": false, + "esModuleInterop": true, + "downlevelIteration": true, + "allowSyntheticDefaultImports": true, + "jsx": "react", + "jsxFactory": "h", + "jsxFragmentFactory": "h.Fragment", + "lib": [ + "dom", + "dom.iterable", + ], }, "include": [ - "src/web-ts/**/*", - "rnode-grpc-gen/js/rnode-grpc-js.d.ts" + "src/**/*" ], - "exclude": [ - "node_modules" - ] }