diff --git a/.eslintrc.js b/.eslintrc.js index fc1855f93..974aad2c0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + module.exports = { root: true, env: { diff --git a/.githooks/pre-commit b/.githooks/pre-commit deleted file mode 100755 index f906c3977..000000000 --- a/.githooks/pre-commit +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-commit". - -root_dir=$(git rev-parse --git-dir) -root_dir=$(cd $root_dir > /dev/null && cd .. > /dev/null && pwd -P) - -cd $root_dir - -yarn precommit diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..e734a1f7c --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +## Summary + +## Detail + +## Testing + +## Documentation + +--- + +**Requested Reviewers:** @mention diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..976509a7e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: Continuous Integration +on: + pull_request: + +jobs: + run_ci_tests: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: "16.14.0" + + - name: Install Yarn + run: npm install -g yarn@1.22.19 + + - name: Install packages + run: yarn install --frozen-lockfile + + - name: Setup local environment + run: cp config.js.example config.js && ./start-ganache.sh + + - name: Run static checks + run: yarn static-check + + - name: Run size check + run: yarn contract-size + + - name: Run tests + run: yarn test diff --git a/.gitignore b/.gitignore index bbfbcc8a7..b929e43d0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,16 @@ validate/apikey.infura ganache-blockchain-log.txt .coverage_artifacts .coverage_contracts -yarn-error.log @types/generated/ config.js +blacklist.*.json +!blacklist.test.json +out/ +cache/ + +# Yarn & Node Modules +yarn-error.log +node_modules/ + +logs/ +pids/ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..be539834c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn precommit diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..bf79505bb --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v16.14.0 diff --git a/.prettierignore b/.prettierignore index e5b68009b..e21033ef9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,3 +6,4 @@ coverage.json build/ .coverage_contracts/ .coverage_artifacts/ +LICENSE diff --git a/.solcover.js b/.solcover.js index eb8380cd8..30a3b29db 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + module.exports = { providerOptions: { port: 8555, diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fbd73d11b..000000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: node_js -node_js: - - 12 - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH="$HOME/.yarn/bin:$PATH" - -install: - - yarn install --frozen-lockfile - -script: - - yarn compile && yarn typechain - - yarn ganache & sleep 5 && yarn test diff --git a/.vscode/extensions.json b/.vscode/extensions.json index eddb75a46..5ca1223d8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,6 +2,7 @@ "recommendations": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", - "juanblanco.solidity" + "juanblanco.solidity", + "ymotongpoo.licenser" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 6720ec14e..ebce079ab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,4 @@ { - "files.exclude": { - "**/.DS_Store": true, - "**/node_modules/": true - }, "solidity.packageDefaultDependenciesContractsDirectory": "", "solidity.packageDefaultDependenciesDirectory": "node_modules", "solidity.formatter": "none", @@ -21,9 +17,15 @@ }, "[solidity]": { "editor.tabSize": 4, - "editor.formatOnSave": true + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": { "editor.formatOnSave": true - } + }, + "typescript.tsdk": "node_modules/typescript/lib", + "licenser.license": "Custom", + "licenser.customHeader": "SPDX-License-Identifier: Apache-2.0\n\nCopyright (c) @YEAR@, Circle Internet Financial, LLC.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.", + "licenser.useSingleLineStyle": false, + "files.autoSave": "onFocusChange" } diff --git a/@types/AnyFiatTokenV2Instance.d.ts b/@types/AnyFiatTokenV2Instance.d.ts new file mode 100644 index 000000000..7c7590984 --- /dev/null +++ b/@types/AnyFiatTokenV2Instance.d.ts @@ -0,0 +1,35 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + FiatTokenV2Instance, + FiatTokenV21Instance, + FiatTokenV22Instance, +} from "./generated"; + +export interface FiatTokenV22InstanceExtended extends FiatTokenV22Instance { + permit?: typeof FiatTokenV2Instance.permit; + transferWithAuthorization?: typeof FiatTokenV2Instance.transferWithAuthorization; + receiveWithAuthorization?: typeof FiatTokenV2Instance.receiveWithAuthorization; + cancelAuthorization?: typeof FiatTokenV2Instance.cancelAuthorization; +} + +export type AnyFiatTokenV2Instance = + | FiatTokenV2Instance + | FiatTokenV21Instance + | FiatTokenV22InstanceExtended; diff --git a/@types/TransactionRawLog.d.ts b/@types/TransactionRawLog.d.ts index f19751270..e6bae8dac 100644 --- a/@types/TransactionRawLog.d.ts +++ b/@types/TransactionRawLog.d.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + export interface TransactionRawLog { logIndex: number; transactionIndex: number; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..ece046729 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +## 2.2.0 (2023-11-09) + +- Add ERC-1271 signature validation support to EIP-2612 and EIP-3009 functions +- Combine the balance state and the blacklist state for an address in a + `balanceAndBlacklistStates` map to reduce gas usage +- Update `DOMAIN_SEPARATOR` to be a dynamic value +- Remove `notBlacklisted` modifiers for `approve`, `increaseAllowance`, + `decreaseAllowance` and `permit` +- Enable bypassing `TIMESTAMP` opcode in `permit` by using `uint256.max` + +## 2.1.1 (2021-06-03) + +- Add the multi-issuer minter contracts from the `multi-issuer` branch + +## 2.1.0 (2021-02-17) + +- Move locked USDC to a "lost and found" address and blacklists itself so that + accidental sends will no longer be possible +- Conform to EIP-3009 in FiatToken + - Add `receiveWithAuthorization` + - Remove `approveWithAuthorization`, `increaseAllowanceWithAuthorization` and + `decreaseAllowanceWithAuthorization` + +## 2.0.0 (2020-07-30) + +- Add support for EIP-2612 in FiatToken +- Add `transferWithAuthorization`, `approveWithAuthorization`, + `increaseAllowanceWithAuthorization`, `decreaseAllowanceWithAuthorization` to + enable ETH-less transactions +- Add `increaseAllowance` and `decreaseAllowance` to mitigate the + multi-withdrawal attack vulnerability in ERC-20 `approve` function +- Update Solidity version to `0.6.12` + +## 1.1.0 (2020-05-27) + +- Add Rescuable functionalities to FiatToken +- Update Solidity version to `0.6.8` +- Remove `ifAdmin` modifier from admin() and implementation() in FiatTokenProxy + +## 1.0.0 (2018-07-24) + +- Create ERC-20 compliant FiatToken contract +- Add Ownable, Pausable and Blacklistable functionalities to FiatToken +- Create FiatTokenProxy contracts based on Zeppelinos's Unstructured-Storage + Proxy pattern diff --git a/Dockerfile.ganache b/Dockerfile.ganache deleted file mode 100644 index 347028e72..000000000 --- a/Dockerfile.ganache +++ /dev/null @@ -1,6 +0,0 @@ -FROM node:12-alpine - -RUN npm i npm@latest -g \ - && npm install -g ganache-cli@^6.9.1 - -ENTRYPOINT ["ganache-cli"] diff --git a/Dockerfile.truffle b/Dockerfile.truffle deleted file mode 100644 index 985cafe14..000000000 --- a/Dockerfile.truffle +++ /dev/null @@ -1,8 +0,0 @@ -FROM node:12-alpine - -RUN npm i npm@latest -g \ - && npm install -g truffle@^5.1.24 \ - && npm install -g ganache-cli@^6.9.1 - -ENTRYPOINT ["truffle"] -CMD ["--help"] diff --git a/LICENSE b/LICENSE index c96b81a78..7a4a3ea24 100644 --- a/LICENSE +++ b/LICENSE @@ -1,19 +1,202 @@ -Copyright (c) 2018-2021 CENTRE SECZ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 8cecf7b71..5173d802b 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,79 @@ -# centre-tokens - -Fiat tokens on the [CENTRE](https://centre.io) network. + + +# Circle's Stablecoin Smart Contracts on EVM-compatible blockchains + + +This repository contains the smart contracts used by +[Circle's](https://www.circle.com/) stablecoins on EVM-compatible blockchains. +All contracts are written in [Solidity](https://soliditylang.org/) and managed +by the [Truffle](https://trufflesuite.com/) framework. + + + +## Table of contents + + +- [Setup](#setup) + - [Development Environment](#development-environment) + - [IDE](#ide) +- [Development](#development) + - [TypeScript type definition files for the contracts](#typescript-type-definition-files-for-the-contracts) + - [Linting and Formatting](#linting-and-formatting) + - [Testing](#testing) +- [Deployment](#deployment) +- [Contracts](#contracts) +- [FiatToken features](#fiattoken-features) + - [ERC20 compatible](#erc20-compatible) + - [Pausable](#pausable) + - [Upgradable](#upgradable) + - [Blacklist](#blacklist) + - [Minting/Burning](#mintingburning) + - [Ownable](#ownable) +- [Additional Documentations](#additional-documentations) ## Setup +### Development Environment + Requirements: -- Node >= v12 -- Yarn +- Node 16.14.0 +- Yarn 1.22.19 +```sh +$ git clone git@github.com:circlefin/stablecoin-evm.git +$ cd stablecoin-evm +$ nvm use +$ npm i -g yarn@1.22.19 # Install yarn if you don't already have it +$ yarn install # Install dependencies ``` -$ git clone git@github.com:centrehq/centre-tokens.git -$ cd centre-tokens -$ npm i -g yarn # Install yarn if you don't already have it -$ yarn install # Install dependencies -$ yarn setup # Setup Git hooks -``` -## TypeScript type definition files for the contracts +### IDE + +We recommend using VSCode for the project here with these +[extensions](./.vscode/extensions.json) installed. + +## Development + +### TypeScript type definition files for the contracts To generate type definitions: -``` -$ yarn compile && yarn typechain +```sh +$ yarn typechain ``` -## Linting and Formatting +### Linting and Formatting To check code for problems: +```sh +$ yarn static-check # Runs a static check on the repo. ``` + +or run the checks individually: + +```sh $ yarn typecheck # Type-check TypeScript code $ yarn lint # Check JavaScript and TypeScript code $ yarn lint --fix # Fix problems where possible @@ -39,36 +83,43 @@ $ yarn slither # Run Slither To auto-format code: -``` +```sh $ yarn fmt ``` -## Testing +### Testing First, make sure Ganache is running. -``` +```sh $ yarn ganache ``` Run all tests: -``` +```sh $ yarn test ``` To run tests in a specific file, run: -``` +```sh $ yarn test [path/to/file] ``` To run tests and generate test coverage, run: -``` +```sh $ yarn coverage ``` +To check the size of contracts in the repo, run the following command. + +```sh +$ yarn contract-size # Ignores tests +$ yarn contract-size:all # Includes all contracts +``` + ## Deployment Create a copy of the file `config.js.example`, and name it `config.js`. Enter @@ -77,21 +128,32 @@ addresses of proxy admin, owner, master minter, blacklister, and pauser in `config.js`. This file must not be checked into the repository. To prevent accidental check-ins, `config.js` is in `.gitignore`. +Create a copy of the file `blacklist.test.json`, and name it +`blacklist.remote.json`. Fill in `blacklist.remote.json` with the list addresses +to blacklist. This file must not be checked into the repository. To prevent +accidental check-ins, `blacklist.remote.json` is in `.gitignore`. + Run `yarn migrate --network NETWORK`, where NETWORK is either `mainnet` or `ropsten`. ## Contracts -The implementation uses 2 separate contracts - a proxy contract -(`FiatTokenProxy.sol`) and an implementation contract (`FiatToken.sol`). This -allows upgrading the contract, as a new implementation contact can be deployed -and the Proxy updated to point to it. +The FiatToken contracts adheres to OpenZeppelin's +[Proxy Upgrade Pattern](https://docs.openzeppelin.com/upgrades-plugins/1.x/proxies) +([permalink](https://github.com/OpenZeppelin/openzeppelin-upgrades/blob/65cf285bd36af24570186ca6409341540c67238a/docs/modules/ROOT/pages/proxies.adoc#L1)). +There are 2 main contracts - an implementation contract +([`FiatTokenV2_2.sol`](./contracts/v2/FiatTokenV2_2.sol)) that contains the main +logic for FiatToken's functionalities, and a proxy contract +([`FiatTokenProxy.sol`](./contracts/v1/FiatTokenProxy.sol)) that redirects +function calls to the implementation contract. This allows upgrading FiatToken's +functionalities, as a new implementation contact can be deployed and the Proxy +can be updated to point to it. -### FiatToken +## FiatToken features The FiatToken offers a number of capabilities, which briefly are described below. There are more [detailed design docs](./doc/tokendesign.md) in the `doc` -folder. +directory. ### ERC20 compatible @@ -130,3 +192,13 @@ the `masterMinter`. The contract has an Owner, who can change the `owner`, `pauser`, `blacklister`, or `masterMinter` addresses. The `owner` can not change the `proxyOwner` address. + +## Additional Documentations + +- [FiatToken design](./doc/tokendesign.md) +- [MasterMinter design](./doc/masterminter.md) +- [Deployment process](./doc/deployment.md) +- [Preparing an upgrade](./doc/upgrade.md) +- [Upgrading from v1 to v2](./doc/v2_upgrade.md) +- [Upgrading from v2 to v2.1](./doc/v2.1_upgrade.md) +- [Upgrading from v2.1 to v2.2](./doc/v2.2_upgrade.md) diff --git a/blacklist.test.json b/blacklist.test.json new file mode 100644 index 000000000..f5a6efd41 --- /dev/null +++ b/blacklist.test.json @@ -0,0 +1,8 @@ +[ + "0x04dba1194ee10112fe6c3207c0687def0e78bacf", + "0x08a8a2436fc920e6c73c3a9e9a00b8d937812ee0", + "0xb6f5ec1a0a9cd1526536d3f0426c429529471f40", + "0xbf4f36efa3ac655a1d86f6c32b648a90271443f4", + "0xf8a9ab377ce63592583767b34602e130e38ebdca", + "0xfc672c73ca5c7234edc82552e4a0c8fc247d32ac" +] diff --git a/build-dev.sh b/build-dev.sh deleted file mode 100755 index 6a9956e10..000000000 --- a/build-dev.sh +++ /dev/null @@ -1,10 +0,0 @@ -DOCROOT="$( cd "$( dirname "$0" )" && pwd )" - -# compile solidity contracts -docker-compose -f $DOCROOT/docker-compose.yml run --rm truffle compile - -# run solidity tests -docker-compose -f $DOCROOT/docker-compose.yml run --rm truffle --network local_testnet test - -#stop containers -docker-compose -f $DOCROOT/docker-compose.yml down diff --git a/buildspec.yaml b/buildspec.yaml deleted file mode 100644 index f526118bb..000000000 --- a/buildspec.yaml +++ /dev/null @@ -1,28 +0,0 @@ -version: 0.2 - -phases: - install: - commands: - - npm install -g yarn@^1.9.2 - - npm install -g truffle@4.1.13 - - yarn install --frozen-lockfile - #- npm install - build: - commands: - - echo Build started on `date` - - yarn check --integrity - - mkdir -p build/logs - - truffle compile - - npm test - post_build: - commands: - - isPR=$(echo $CODEBUILD_SOURCE_VERSION | grep -c 'pr/') || true - - succeeded=$CODEBUILD_BUILD_SUCCEEDING - - echo "isPR status:${isPR}" - - echo "succeeded status:${succeeded}" - - if [ $isPR -ne 1 ] && [ $succeeded -ne 1 ]; then echo "Build failed in main repo -- sending notification"; aws sns publish --topic-arn ${FailedBuildTopic} --message "Build Notification - centre-tokens build failed!"; else echo "Build succeeded and/or PR build -- not sending notification"; fi - -artifacts: - files: - - build/contracts/* - - coverage/**/* diff --git a/ci/codebuild.yaml b/ci/codebuild.yaml deleted file mode 100644 index 43a75d77d..000000000 --- a/ci/codebuild.yaml +++ /dev/null @@ -1,106 +0,0 @@ -AWSTemplateFormatVersion: "2010-09-09" -Description: CI for Centre Tokens -Parameters: - - StackName: - Default: ci-centre-tokens - Type: String - Description: Cloudformation stack name - - GithubRepoOwner: - Default: centrehq - Type: String - Description: Github Owner - - GithubRepo: - Default: centre-tokens - Type: String - Description: Github repository name - - GithubBranch: - Default: master - Type: String - Description: Github branch - - ECRBuildImage: - Default: "aws/codebuild/nodejs:8.11.0" - Type: String - Description: The ECR image to use in the Codebuild project - -Resources: - - # Note: Webhooks can not be enabled via Cloudformation and must be done manually - CodeBuildProject: - Type: "AWS::CodeBuild::Project" - Properties: - Name: "centre-tokens" - Description: !Sub "Codebuild project from stack ${AWS::StackName}" - Artifacts: - Type: S3 - Location: !Ref CodeBuildBucket - Name: artifacts - NamespaceType: BUILD_ID - BadgeEnabled: true - Environment: - Type: LINUX_CONTAINER - ComputeType: BUILD_GENERAL1_SMALL - Image: !Ref ECRBuildImage - EnvironmentVariables: - - Name: FailedBuildTopic - Value: !Ref FailedBuildTopic - ServiceRole: !Ref CodeBuildServiceRole - Source: - Type: GITHUB - BuildSpec: "buildspec.yaml" - Location: !Sub "https://github.com/${GithubRepoOwner}/${GithubRepo}.git" - Auth: - Type: OAUTH - GitCloneDepth: 1 - TimeoutInMinutes: 60 - - CodeBuildBucket: - Type: "AWS::S3::Bucket" - Properties: - AccessControl: "Private" - BucketName: !Sub "${AWS::StackName}-${AWS::AccountId}-${AWS::Region}" - VersioningConfiguration: - Status: Enabled - - CodeBuildServiceRole: - Type: "AWS::IAM::Role" - Properties: - AssumeRolePolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Principal: - Service: - - "codebuild.amazonaws.com" - Action: "sts:AssumeRole" - Path: "/" - Policies: - - PolicyName: "CodeBuildAccess" - PolicyDocument: - Version: "2012-10-17" - Statement: - - Sid: "AllowToCreateLogs" - Effect: "Allow" - Action: - - "logs:CreateLogGroup" - - "logs:CreateLogStream" - - "logs:PutLogEvents" - Resource: - - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/centre-tokens:log-stream:*" - - Sid: "AllowPutToBucket" - Effect: "Allow" - Action: - - "s3:PutObject*" - Resource: !Sub "arn:aws:s3:::${AWS::StackName}-${AWS::AccountId}-${AWS::Region}*" - - Sid: "AllowPublishToSNS" - Effect: "Allow" - Action: - - "SNS:Publish" - Resource: !Ref FailedBuildTopic - - FailedBuildTopic: - Type: AWS::SNS::Topic diff --git a/config.js.example b/config.js.example index 46c79dc6f..93f3cf1a5 100644 --- a/config.js.example +++ b/config.js.example @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + module.exports = { // BIP39 mnemonic phrase MNEMONIC: "", @@ -9,12 +27,31 @@ module.exports = { OWNER_ADDRESS: "", // Master Minter - can configure minters and minter allowance MASTERMINTER_ADDRESS: "", + // Master Minter Owner - owner of master minter contract + MASTERMINTER_OWNER_ADDRESS: "", // Pauser - can pause the contract PAUSER_ADDRESS: "", // Blacklister - can blacklist addresses BLACKLISTER_ADDRESS: "", // FiatTokenProxy contract - override the contract address used in migrations PROXY_CONTRACT_ADDRESS: "", + // FiatToken Implementation contract - deploy new proxy with an existing implementation contract + FIAT_TOKEN_IMPLEMENTATION_ADDRESS: "", // LostAndFound - tokens that were locked in the contract are sent to this LOST_AND_FOUND_ADDRESS: "", + // MockERC1271WalletOwner - can deploy and send transactions from a sample ERC1271 wallet + MOCK_ERC1271_WALLET_OWNER_ADDRESS: "", + + // TokenName - ERC20 name of the token e.g. "USD Coin" + TOKEN_NAME: "USD Coin", + // TokenSymbol - Symbol of the token e.g. "USDC" + TOKEN_SYMBOL: "USDC", + // TokenCurrency - Currency of the token e.g. "USD" + TOKEN_CURRENCY: "USD", + // TokenDecimals - Number of decimals for the token e.g. 6 + TOKEN_DECIMALS: 6, + + // USE_VERSIONED_MIGRATIONS - whether or not to use migrations in migrations/versioned directory. + // These migrations deploy each version of FiatToken separately. + USE_VERSIONED_MIGRATIONS: true, }; diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index 0fd41b947..fdac39399 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2021 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/interface/IERC1271.sol b/contracts/interface/IERC1271.sol new file mode 100644 index 000000000..74b848806 --- /dev/null +++ b/contracts/interface/IERC1271.sol @@ -0,0 +1,36 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +/** + * @dev Interface of the ERC1271 standard signature validation method for + * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. + */ +interface IERC1271 { + /** + * @dev Should return whether the signature provided is valid for the provided data + * @param hash Hash of the data to be signed + * @param signature Signature byte array associated with the provided data hash + * @return magicValue bytes4 magic value 0x1626ba7e when function passes + */ + function isValidSignature(bytes32 hash, bytes memory signature) + external + view + returns (bytes4 magicValue); +} diff --git a/contracts/minting/Controller.sol b/contracts/minting/Controller.sol index 96e3e703a..cb8ad02ce 100644 --- a/contracts/minting/Controller.sol +++ b/contracts/minting/Controller.sol @@ -1,23 +1,19 @@ /** - * Copyright CENTRE SECZ 2018 - 2021 + * SPDX-License-Identifier: Apache-2.0 * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -32,7 +28,7 @@ import { Ownable } from "../v1/Ownable.sol"; */ contract Controller is Ownable { /** - * @notice A controller manages a single worker address. + * @dev A controller manages a single worker address. * controllers[controller] = worker */ mapping(address => address) internal controllers; diff --git a/contracts/minting/MasterMinter.sol b/contracts/minting/MasterMinter.sol index ac3849604..4c759d828 100644 --- a/contracts/minting/MasterMinter.sol +++ b/contracts/minting/MasterMinter.sol @@ -1,28 +1,24 @@ /** - * Copyright CENTRE SECZ 2018 - 2021 + * SPDX-License-Identifier: Apache-2.0 * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; -import "./MintController.sol"; +import { MintController } from "./MintController.sol"; /** * @title MasterMinter diff --git a/contracts/minting/MintController.sol b/contracts/minting/MintController.sol index dae187ba1..dce3986e0 100644 --- a/contracts/minting/MintController.sol +++ b/contracts/minting/MintController.sol @@ -1,48 +1,45 @@ /** - * Copyright CENTRE SECZ 2018 - 2021 + * SPDX-License-Identifier: Apache-2.0 * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; -import "./Controller.sol"; -import "./MinterManagementInterface.sol"; +import { Controller } from "./Controller.sol"; +import { MinterManagementInterface } from "./MinterManagementInterface.sol"; import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +// solhint-disable func-name-mixedcase + /** * @title MintController - * @notice The MintController contract manages minters for a contract that + * @dev The MintController contract manages minters for a contract that * implements the MinterManagerInterface. It lets the owner designate certain * addresses as controllers, and these controllers then manage the * minters by adding and removing minters, as well as modifying their minting * allowance. A controller may manage exactly one minter, but the same minter * address may be managed by multiple controllers. - * @dev MintController inherits from the Controller contract. It treats the + * MintController inherits from the Controller contract. It treats the * Controller workers as minters. */ contract MintController is Controller { using SafeMath for uint256; /** - * @title MinterManagementInterface - * @notice MintController calls the minterManager to execute/record minter + * @dev MintController calls the minterManager to execute/record minter * management tasks, as well as to query the status of a minter address. */ MinterManagementInterface internal minterManager; diff --git a/contracts/minting/MinterManagementInterface.sol b/contracts/minting/MinterManagementInterface.sol index def04e6da..1da53d6ca 100644 --- a/contracts/minting/MinterManagementInterface.sol +++ b/contracts/minting/MinterManagementInterface.sol @@ -1,31 +1,27 @@ /** - * Copyright CENTRE SECZ 2018 - 2021 + * SPDX-License-Identifier: Apache-2.0 * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; /** - * @notice A contract that implements the MinterManagementInterface has external + * @dev A contract that implements the MinterManagementInterface has external * functions for adding and removing minters and modifying their allowances. - * An example is the FiatTokenV1 contract that implements USDC. + * An example is the FiatTokenV1 contract. */ interface MinterManagementInterface { function isMinter(address _account) external view returns (bool); diff --git a/contracts/test/ContractThatCallsPublicFunctions.sol b/contracts/test/ContractThatCallsPublicFunctions.sol index 6bc510389..7b50f02b0 100644 --- a/contracts/test/ContractThatCallsPublicFunctions.sol +++ b/contracts/test/ContractThatCallsPublicFunctions.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2021 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/ContractThatReverts.sol b/contracts/test/ContractThatReverts.sol index 3992d130c..1f909e6d5 100644 --- a/contracts/test/ContractThatReverts.sol +++ b/contracts/test/ContractThatReverts.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2021 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/ContractWithExternalFunctions.sol b/contracts/test/ContractWithExternalFunctions.sol index db2ec2144..b92994721 100644 --- a/contracts/test/ContractWithExternalFunctions.sol +++ b/contracts/test/ContractWithExternalFunctions.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2021 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/ContractWithPublicFunctions.sol b/contracts/test/ContractWithPublicFunctions.sol index 54c9f45dd..07ad85fd0 100644 --- a/contracts/test/ContractWithPublicFunctions.sol +++ b/contracts/test/ContractWithPublicFunctions.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2021 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/DummyERC20.sol b/contracts/test/DummyERC20.sol index d1ae4f014..f94eacdd2 100644 --- a/contracts/test/DummyERC20.sol +++ b/contracts/test/DummyERC20.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/ECRecoverTest.sol b/contracts/test/ECRecoverTest.sol index 7518fb65d..e202d3e29 100644 --- a/contracts/test/ECRecoverTest.sol +++ b/contracts/test/ECRecoverTest.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -27,12 +21,11 @@ pragma solidity 0.6.12; import { ECRecover } from "../util/ECRecover.sol"; contract ECRecoverTest { - function recover( - bytes32 digest, - uint8 v, - bytes32 r, - bytes32 s - ) external pure returns (address) { - return ECRecover.recover(digest, v, r, s); + function recover(bytes32 digest, bytes memory signature) + external + pure + returns (address) + { + return ECRecover.recover(digest, signature); } } diff --git a/contracts/test/EIP712Test.sol b/contracts/test/EIP712Test.sol index fe54065f5..e74411967 100644 --- a/contracts/test/EIP712Test.sol +++ b/contracts/test/EIP712Test.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -34,14 +28,4 @@ contract EIP712Test { { return EIP712.makeDomainSeparator(name, version); } - - function recover( - bytes32 domainSeparator, - uint8 v, - bytes32 r, - bytes32 s, - bytes calldata typeHashAndData - ) external pure returns (address) { - return EIP712.recover(domainSeparator, v, r, s, typeHashAndData); - } } diff --git a/contracts/test/MessageHashUtilsTest.sol b/contracts/test/MessageHashUtilsTest.sol new file mode 100644 index 000000000..0ae762466 --- /dev/null +++ b/contracts/test/MessageHashUtilsTest.sol @@ -0,0 +1,31 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { MessageHashUtils } from "../util/MessageHashUtils.sol"; + +contract MessageHashUtilsTest { + function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) + external + pure + returns (bytes32 digest) + { + return MessageHashUtils.toTypedDataHash(domainSeparator, structHash); + } +} diff --git a/contracts/test/MockERC1271Wallet.sol b/contracts/test/MockERC1271Wallet.sol new file mode 100644 index 000000000..fab304a2c --- /dev/null +++ b/contracts/test/MockERC1271Wallet.sol @@ -0,0 +1,114 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +pragma solidity 0.6.12; + +import { ECRecover } from "../util/ECRecover.sol"; +import { IERC1271 } from "../interface/IERC1271.sol"; + +/** + * @title MockERC1271Wallet + * @dev An ERC-1271 compatible wallet using standard ECDSA validation. + */ +contract MockERC1271Wallet is IERC1271 { + address private _owner; + + constructor(address owner) public { + _owner = owner; + } + + function isValidSignature(bytes32 hash, bytes memory signature) + external + override + view + returns (bytes4 magicValue) + { + address recovered = ECRecover.recover(hash, signature); + return + recovered == _owner + ? IERC1271.isValidSignature.selector + : bytes4(0); + } +} + +/** + * @title MockERC1271WalletReturningBytes32 + * @dev Used to check against unexpected reverts from abi.decode when raw bytes data overflow the target type. + * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/874c2d3c02ec1bce6af9a30bc828d3fe2079136b/contracts/mocks/ERC1271WalletMock.sol + */ +contract MockERC1271WalletReturningBytes32 is IERC1271 { + function isValidSignature(bytes32, bytes memory) + external + override + view + returns (bytes4) + { + assembly { + mstore( + 0, + 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + ) + return(0, 32) + } + } +} + +/** + * @title MockERC1271WalletCustomValidation + * @dev An ERC-1271 compatible wallet that performs custom signature validation + */ +contract MockERC1271WalletWithCustomValidation is IERC1271 { + address private _owner; + bool private _signatureValid; + + constructor(address owner) public { + _owner = owner; + } + + function setSignatureValid(bool signatureValid) external { + _signatureValid = signatureValid; + } + + function isValidSignature(bytes32, bytes memory) + external + override + view + returns (bytes4 magicValue) + { + return _signatureValid ? IERC1271.isValidSignature.selector : bytes4(0); + } +} + +/** + * @title MockStateModifyingERC1271Wallet + * @dev An ERC-1271 compatible wallet that attempts to modify contract state. + */ +contract MockStateModifyingERC1271Wallet { + bool private _evoked; + + function evoked() external view returns (bool) { + return _evoked; + } + + function isValidSignature(bytes32, bytes memory) + external + returns (bytes4 magicValue) + { + _evoked = true; + return IERC1271.isValidSignature.selector; + } +} diff --git a/contracts/test/MockFiatTokenWithEditableBalanceAndBlacklistStates.sol b/contracts/test/MockFiatTokenWithEditableBalanceAndBlacklistStates.sol new file mode 100644 index 000000000..d84741c60 --- /dev/null +++ b/contracts/test/MockFiatTokenWithEditableBalanceAndBlacklistStates.sol @@ -0,0 +1,88 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { FiatTokenV2_2 } from "../v2/FiatTokenV2_2.sol"; + +// solhint-disable func-name-mixedcase + +/** + * @title MockFiatTokenWithEditableBalanceAndBlacklistStates + * @dev A mock class that allows the internal balanceAndBlacklistStates to be manipulated in tests. + */ +contract MockFiatTokenWithEditableBalanceAndBlacklistStates is FiatTokenV2_2 { + /** + * @dev Allows the balanceAndBlacklistStates to be manipulated. This + * enables us to properly test the ERC20 functionalities. + */ + function setBalanceAndBlacklistStates(address _account, uint256 _state) + external + { + balanceAndBlacklistStates[_account] = _state; + } + + /** + * @dev Allows the balanceAndBlacklistStates to be read as plain values. + */ + function getBalanceAndBlacklistStates(address _account) + external + view + returns (uint256) + { + return balanceAndBlacklistStates[_account]; + } + + /** + * @dev Exposes the internal function for unit testing. + */ + function internal_setBlacklistState(address _account, bool _shouldBlacklist) + external + { + _setBlacklistState(_account, _shouldBlacklist); + } + + /** + * @dev Exposes the internal function for unit testing. + */ + function internal_setBalance(address _account, uint256 _balance) external { + _setBalance(_account, _balance); + } + + /** + * @dev Exposes the internal function for unit testing. + */ + function internal_isBlacklisted(address _account) + external + view + returns (bool) + { + return _isBlacklisted(_account); + } + + /** + * @dev Exposes the internal function for unit testing. + */ + function internal_balanceOf(address _account) + external + view + returns (uint256) + { + return _balanceOf(_account); + } +} diff --git a/contracts/test/MockFiatTokenWithEditableChainId.sol b/contracts/test/MockFiatTokenWithEditableChainId.sol new file mode 100644 index 000000000..b6bf2d20e --- /dev/null +++ b/contracts/test/MockFiatTokenWithEditableChainId.sol @@ -0,0 +1,51 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { FiatTokenV2_2 } from "../v2/FiatTokenV2_2.sol"; + +/** + * @title MockFiatTokenWithEditableChainId + * @dev A mock class to simulate chain ID change as a result of blockchain forks + */ +contract MockFiatTokenWithEditableChainId is FiatTokenV2_2 { + uint256 private _internalChainId = 1; + + /** + * @dev Allow chain ID to be set to any arbitrary values. + */ + function setChainId(uint256 newChainId) external { + _internalChainId = newChainId; + } + + /** + * @return uint256 the interal chain ID previous set with user input + */ + function _chainId() internal override view returns (uint256) { + return _internalChainId; + } + + /** + * @dev Helper to allow reading current chain ID from test cases. + * @return uint256 the interal chain ID previous set with user input + */ + function chainId() external view returns (uint256) { + return _chainId(); + } +} diff --git a/contracts/test/UpgradedFiatToken.sol b/contracts/test/UpgradedFiatToken.sol index 8f6418659..856cf87f8 100644 --- a/contracts/test/UpgradedFiatToken.sol +++ b/contracts/test/UpgradedFiatToken.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/UpgradedFiatTokenNewFieldsNewLogicTest.sol b/contracts/test/UpgradedFiatTokenNewFieldsNewLogicTest.sol index bdfc8465f..69aa8e238 100644 --- a/contracts/test/UpgradedFiatTokenNewFieldsNewLogicTest.sol +++ b/contracts/test/UpgradedFiatTokenNewFieldsNewLogicTest.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/UpgradedFiatTokenNewFieldsTest.sol b/contracts/test/UpgradedFiatTokenNewFieldsTest.sol index 02f01a18f..19bf117b7 100644 --- a/contracts/test/UpgradedFiatTokenNewFieldsTest.sol +++ b/contracts/test/UpgradedFiatTokenNewFieldsTest.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/test/UpgradedFiatTokenV2_2.sol b/contracts/test/UpgradedFiatTokenV2_2.sol new file mode 100644 index 000000000..ef43c38fc --- /dev/null +++ b/contracts/test/UpgradedFiatTokenV2_2.sol @@ -0,0 +1,29 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { FiatTokenV2_2 } from "../v2/FiatTokenV2_2.sol"; + +/** + * @title UpgradedFiatTokenV2_2 + * @dev ERC20 Token backed by fiat reserves + */ +contract UpgradedFiatTokenV2_2 is FiatTokenV2_2 { + +} diff --git a/contracts/test/UpgradedFiatTokenV2_2NewFieldsTest.sol b/contracts/test/UpgradedFiatTokenV2_2NewFieldsTest.sol new file mode 100644 index 000000000..906f41158 --- /dev/null +++ b/contracts/test/UpgradedFiatTokenV2_2NewFieldsTest.sol @@ -0,0 +1,70 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { FiatTokenV2_2 } from "../v2/FiatTokenV2_2.sol"; + +/** + * @title UpgradedFiatTokenV2_2NewFieldsTest + * @dev ERC20 Token backed by fiat reserves + */ +contract UpgradedFiatTokenV2_2NewFieldsTest is FiatTokenV2_2 { + bool public newBool; + address public newAddress; + uint256 public newUint; + bool internal initializedV2; + + function initialize( + string calldata tokenName, + string calldata tokenSymbol, + string calldata tokenCurrency, + uint8 tokenDecimals, + address newMasterMinter, + address newPauser, + address newBlacklister, + address newOwner, + bool _newBool, + address _newAddress, + uint256 _newUint + ) external { + super.initialize( + tokenName, + tokenSymbol, + tokenCurrency, + tokenDecimals, + newMasterMinter, + newPauser, + newBlacklister, + newOwner + ); + initV2(_newBool, _newAddress, _newUint); + } + + function initV2( + bool _newBool, + address _newAddress, + uint256 _newUint + ) public { + require(!initializedV2, "contract is already initialized"); + newBool = _newBool; + newAddress = _newAddress; + newUint = _newUint; + initializedV2 = true; + } +} diff --git a/contracts/upgradeability/AdminUpgradeabilityProxy.sol b/contracts/upgradeability/AdminUpgradeabilityProxy.sol index 5079207f3..3aa44758b 100644 --- a/contracts/upgradeability/AdminUpgradeabilityProxy.sol +++ b/contracts/upgradeability/AdminUpgradeabilityProxy.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/upgradeability/Proxy.sol b/contracts/upgradeability/Proxy.sol index 58be93fdc..850292b8c 100644 --- a/contracts/upgradeability/Proxy.sol +++ b/contracts/upgradeability/Proxy.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/upgradeability/UpgradeabilityProxy.sol b/contracts/upgradeability/UpgradeabilityProxy.sol index ac7562a8e..389b598d9 100644 --- a/contracts/upgradeability/UpgradeabilityProxy.sol +++ b/contracts/upgradeability/UpgradeabilityProxy.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/util/ECRecover.sol b/contracts/util/ECRecover.sol index b84242ee7..df5c8f0d6 100644 --- a/contracts/util/ECRecover.sol +++ b/contracts/util/ECRecover.sol @@ -1,26 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2016-2019 zOS Global Limited - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -72,4 +65,33 @@ library ECRecover { return signer; } + + /** + * @notice Recover signer's address from a signed message + * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/0053ee040a7ff1dbc39691c9e67a69f564930a88/contracts/utils/cryptography/ECDSA.sol + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + * @return Signer address + */ + function recover(bytes32 digest, bytes memory signature) + internal + pure + returns (address) + { + require(signature.length == 65, "ECRecover: invalid signature length"); + + bytes32 r; + bytes32 s; + uint8 v; + + // ecrecover takes the signature parameters, and the only way to get them + // currently is to use assembly. + /// @solidity memory-safe-assembly + assembly { + r := mload(add(signature, 0x20)) + s := mload(add(signature, 0x40)) + v := byte(0, mload(add(signature, 0x60))) + } + return recover(digest, v, r, s); + } } diff --git a/contracts/util/EIP712.sol b/contracts/util/EIP712.sol index d443bf263..bd01b2f74 100644 --- a/contracts/util/EIP712.sol +++ b/contracts/util/EIP712.sol @@ -1,31 +1,23 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; -import { ECRecover } from "./ECRecover.sol"; - /** * @title EIP712 * @notice A library that provides EIP712 helper functions @@ -35,17 +27,14 @@ library EIP712 { * @notice Make EIP712 domain separator * @param name Contract name * @param version Contract version + * @param chainId Blockchain ID * @return Domain separator */ - function makeDomainSeparator(string memory name, string memory version) - internal - view - returns (bytes32) - { - uint256 chainId; - assembly { - chainId := chainid() - } + function makeDomainSeparator( + string memory name, + string memory version, + uint256 chainId + ) internal view returns (bytes32) { return keccak256( abi.encode( @@ -60,28 +49,20 @@ library EIP712 { } /** - * @notice Recover signer's address from a EIP712 signature - * @param domainSeparator Domain separator - * @param v v of the signature - * @param r r of the signature - * @param s s of the signature - * @param typeHashAndData Type hash concatenated with data - * @return Signer's address + * @notice Make EIP712 domain separator + * @param name Contract name + * @param version Contract version + * @return Domain separator */ - function recover( - bytes32 domainSeparator, - uint8 v, - bytes32 r, - bytes32 s, - bytes memory typeHashAndData - ) internal pure returns (address) { - bytes32 digest = keccak256( - abi.encodePacked( - "\x19\x01", - domainSeparator, - keccak256(typeHashAndData) - ) - ); - return ECRecover.recover(digest, v, r, s); + function makeDomainSeparator(string memory name, string memory version) + internal + view + returns (bytes32) + { + uint256 chainId; + assembly { + chainId := chainid() + } + return makeDomainSeparator(name, version, chainId); } } diff --git a/contracts/util/MessageHashUtils.sol b/contracts/util/MessageHashUtils.sol new file mode 100644 index 000000000..9b80f352e --- /dev/null +++ b/contracts/util/MessageHashUtils.sol @@ -0,0 +1,54 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +/** + * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. + * + * The library provides methods for generating a hash of a message that conforms to the + * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] + * specifications. + */ +library MessageHashUtils { + /** + * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`). + * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/MessageHashUtils.sol + * + * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with + * `\x19\x01` and hashing the result. It corresponds to the hash signed by the + * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712. + * + * @param domainSeparator Domain separator + * @param structHash Hashed EIP-712 data struct + * @return digest The keccak256 digest of an EIP-712 typed data + */ + function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) + internal + pure + returns (bytes32 digest) + { + assembly { + let ptr := mload(0x40) + mstore(ptr, "\x19\x01") + mstore(add(ptr, 0x02), domainSeparator) + mstore(add(ptr, 0x22), structHash) + digest := keccak256(ptr, 0x42) + } + } +} diff --git a/contracts/util/SignatureChecker.sol b/contracts/util/SignatureChecker.sol new file mode 100644 index 000000000..b66fa080b --- /dev/null +++ b/contracts/util/SignatureChecker.sol @@ -0,0 +1,87 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { ECRecover } from "./ECRecover.sol"; +import { IERC1271 } from "../interface/IERC1271.sol"; + +/** + * @dev Signature verification helper that can be used instead of `ECRecover.recover` to seamlessly support both ECDSA + * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets. + * + * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/SignatureChecker.sol + */ +library SignatureChecker { + /** + * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the + * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECRecover.recover`. + * @param signer Address of the claimed signer + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + */ + function isValidSignatureNow( + address signer, + bytes32 digest, + bytes memory signature + ) external view returns (bool) { + if (!isContract(signer)) { + return ECRecover.recover(digest, signature) == signer; + } + return isValidERC1271SignatureNow(signer, digest, signature); + } + + /** + * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated + * against the signer smart contract using ERC1271. + * @param signer Address of the claimed signer + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + * + * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus + * change through time. It could return true at block N and false at block N+1 (or the opposite). + */ + function isValidERC1271SignatureNow( + address signer, + bytes32 digest, + bytes memory signature + ) internal view returns (bool) { + (bool success, bytes memory result) = signer.staticcall( + abi.encodeWithSelector( + IERC1271.isValidSignature.selector, + digest, + signature + ) + ); + return (success && + result.length >= 32 && + abi.decode(result, (bytes32)) == + bytes32(IERC1271.isValidSignature.selector)); + } + + /** + * @dev Checks if the input address is a smart contract. + */ + function isContract(address addr) internal view returns (bool) { + uint256 size; + assembly { + size := extcodesize(addr) + } + return size > 0; + } +} diff --git a/contracts/v1.1/FiatTokenV1_1.sol b/contracts/v1.1/FiatTokenV1_1.sol index a92a54fc4..854664ecf 100644 --- a/contracts/v1.1/FiatTokenV1_1.sol +++ b/contracts/v1.1/FiatTokenV1_1.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/v1.1/Rescuable.sol b/contracts/v1.1/Rescuable.sol index 5af835e9a..3b23aa07e 100644 --- a/contracts/v1.1/Rescuable.sol +++ b/contracts/v1.1/Rescuable.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -66,8 +60,8 @@ contract Rescuable is Ownable { } /** - * @notice Assign the rescuer role to a given address. - * @param newRescuer New rescuer's address + * @notice Updates the rescuer address. + * @param newRescuer The address of the new rescuer. */ function updateRescuer(address newRescuer) external onlyOwner { require( diff --git a/contracts/v1/AbstractFiatTokenV1.sol b/contracts/v1/AbstractFiatTokenV1.sol index 89e3906e4..bb64da5a3 100644 --- a/contracts/v1/AbstractFiatTokenV1.sol +++ b/contracts/v1/AbstractFiatTokenV1.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/v1/Blacklistable.sol b/contracts/v1/Blacklistable.sol index c1827e836..b555cb6df 100644 --- a/contracts/v1/Blacklistable.sol +++ b/contracts/v1/Blacklistable.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -30,16 +24,16 @@ import { Ownable } from "./Ownable.sol"; * @title Blacklistable Token * @dev Allows accounts to be blacklisted by a "blacklister" role */ -contract Blacklistable is Ownable { +abstract contract Blacklistable is Ownable { address public blacklister; - mapping(address => bool) internal blacklisted; + mapping(address => bool) internal _deprecatedBlacklisted; event Blacklisted(address indexed _account); event UnBlacklisted(address indexed _account); event BlacklisterChanged(address indexed newBlacklister); /** - * @dev Throws if called by any account other than the blacklister + * @dev Throws if called by any account other than the blacklister. */ modifier onlyBlacklister() { require( @@ -50,43 +44,48 @@ contract Blacklistable is Ownable { } /** - * @dev Throws if argument account is blacklisted - * @param _account The address to check + * @dev Throws if argument account is blacklisted. + * @param _account The address to check. */ modifier notBlacklisted(address _account) { require( - !blacklisted[_account], + !_isBlacklisted(_account), "Blacklistable: account is blacklisted" ); _; } /** - * @dev Checks if account is blacklisted - * @param _account The address to check + * @notice Checks if account is blacklisted. + * @param _account The address to check. + * @return True if the account is blacklisted, false if the account is not blacklisted. */ function isBlacklisted(address _account) external view returns (bool) { - return blacklisted[_account]; + return _isBlacklisted(_account); } /** - * @dev Adds account to blacklist - * @param _account The address to blacklist + * @notice Adds account to blacklist. + * @param _account The address to blacklist. */ function blacklist(address _account) external onlyBlacklister { - blacklisted[_account] = true; + _blacklist(_account); emit Blacklisted(_account); } /** - * @dev Removes account from blacklist - * @param _account The address to remove from the blacklist + * @notice Removes account from blacklist. + * @param _account The address to remove from the blacklist. */ function unBlacklist(address _account) external onlyBlacklister { - blacklisted[_account] = false; + _unBlacklist(_account); emit UnBlacklisted(_account); } + /** + * @notice Updates the blacklister address. + * @param _newBlacklister The address of the new blacklister. + */ function updateBlacklister(address _newBlacklister) external onlyOwner { require( _newBlacklister != address(0), @@ -95,4 +94,27 @@ contract Blacklistable is Ownable { blacklister = _newBlacklister; emit BlacklisterChanged(blacklister); } + + /** + * @dev Checks if account is blacklisted. + * @param _account The address to check. + * @return true if the account is blacklisted, false otherwise. + */ + function _isBlacklisted(address _account) + internal + virtual + view + returns (bool); + + /** + * @dev Helper method that blacklists an account. + * @param _account The address to blacklist. + */ + function _blacklist(address _account) internal virtual; + + /** + * @dev Helper method that unblacklists an account. + * @param _account The address to unblacklist. + */ + function _unBlacklist(address _account) internal virtual; } diff --git a/contracts/v1/FiatTokenProxy.sol b/contracts/v1/FiatTokenProxy.sol index 4f6215b07..83f0ee481 100644 --- a/contracts/v1/FiatTokenProxy.sol +++ b/contracts/v1/FiatTokenProxy.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/v1/FiatTokenV1.sol b/contracts/v1/FiatTokenV1.sol index 1820842d1..cfec563ea 100644 --- a/contracts/v1/FiatTokenV1.sol +++ b/contracts/v1/FiatTokenV1.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -44,7 +38,10 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { address public masterMinter; bool internal initialized; - mapping(address => uint256) internal balances; + /// @dev A mapping that stores the balance and blacklist states for a given address. + /// The first bit defines whether the address is blacklisted (1 if blacklisted, 0 otherwise). + /// The last 255 bits define the balance for the address. + mapping(address => uint256) internal balanceAndBlacklistStates; mapping(address => mapping(address => uint256)) internal allowed; uint256 internal totalSupply_ = 0; mapping(address => bool) internal minters; @@ -56,6 +53,17 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { event MinterRemoved(address indexed oldMinter); event MasterMinterChanged(address indexed newMasterMinter); + /** + * @notice Initializes the fiat token contract. + * @param tokenName The name of the fiat token. + * @param tokenSymbol The symbol of the fiat token. + * @param tokenCurrency The fiat currency that the token represents. + * @param tokenDecimals The number of decimals that the token uses. + * @param newMasterMinter The masterMinter address for the fiat token. + * @param newPauser The pauser address for the fiat token. + * @param newBlacklister The blacklister address for the fiat token. + * @param newOwner The owner of the fiat token. + */ function initialize( string memory tokenName, string memory tokenSymbol, @@ -96,7 +104,7 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev Throws if called by any account other than a minter + * @dev Throws if called by any account other than a minter. */ modifier onlyMinters() { require(minters[msg.sender], "FiatToken: caller is not a minter"); @@ -104,11 +112,11 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev Function to mint tokens + * @notice Mints fiat tokens to an address. * @param _to The address that will receive the minted tokens. * @param _amount The amount of tokens to mint. Must be less than or equal * to the minterAllowance of the caller. - * @return A boolean that indicates if the operation was successful. + * @return True if the operation was successful. */ function mint(address _to, uint256 _amount) external @@ -128,7 +136,7 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { ); totalSupply_ = totalSupply_.add(_amount); - balances[_to] = balances[_to].add(_amount); + _setBalance(_to, _balanceOf(_to).add(_amount)); minterAllowed[msg.sender] = mintingAllowedAmount.sub(_amount); emit Mint(msg.sender, _to, _amount); emit Transfer(address(0), _to, _amount); @@ -147,27 +155,29 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev Get minter allowance for an account - * @param minter The address of the minter + * @notice Gets the minter allowance for an account. + * @param minter The address to check. + * @return The remaining minter allowance for the account. */ function minterAllowance(address minter) external view returns (uint256) { return minterAllowed[minter]; } /** - * @dev Checks if account is a minter - * @param account The address to check + * @notice Checks if an account is a minter. + * @param account The address to check. + * @return True if the account is a minter, false if the account is not a minter. */ function isMinter(address account) external view returns (bool) { return minters[account]; } /** - * @notice Amount of remaining tokens spender is allowed to transfer on - * behalf of the token owner - * @param owner Token owner's address - * @param spender Spender's address - * @return Allowance amount + * @notice Gets the remaining amount of fiat tokens a spender is allowed to transfer on + * behalf of the token owner. + * @param owner The token owner's address. + * @param spender The spender's address. + * @return The remaining allowance. */ function allowance(address owner, address spender) external @@ -179,15 +189,17 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev Get totalSupply of token + * @notice Gets the totalSupply of the fiat token. + * @return The totalSupply of the fiat token. */ function totalSupply() external override view returns (uint256) { return totalSupply_; } /** - * @dev Get token balance of an account - * @param account address The account + * @notice Gets the fiat token balance of an account. + * @param account The address to check. + * @return balance The fiat token balance of the account. */ function balanceOf(address account) external @@ -195,18 +207,18 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { view returns (uint256) { - return balances[account]; + return _balanceOf(account); } /** - * @notice Set spender's allowance over the caller's tokens to be a given - * value. - * @param spender Spender's address - * @param value Allowance amount - * @return True if successful + * @notice Sets a fiat token allowance for a spender to spend on behalf of the caller. + * @param spender The spender's address. + * @param value The allowance amount. + * @return True if the operation was successful. */ function approve(address spender, uint256 value) external + virtual override whenNotPaused notBlacklisted(msg.sender) @@ -218,10 +230,10 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev Internal function to set allowance - * @param owner Token owner's address - * @param spender Spender's address - * @param value Allowance amount + * @dev Internal function to set allowance. + * @param owner Token owner's address. + * @param spender Spender's address. + * @param value Allowance amount. */ function _approve( address owner, @@ -235,11 +247,12 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @notice Transfer tokens by spending allowance - * @param from Payer's address - * @param to Payee's address - * @param value Transfer amount - * @return True if successful + * @notice Transfers tokens from an address to another by spending the caller's allowance. + * @dev The caller must have some fiat token allowance on the payer's tokens. + * @param from Payer's address. + * @param to Payee's address. + * @param value Transfer amount. + * @return True if the operation was successful. */ function transferFrom( address from, @@ -264,10 +277,10 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @notice Transfer tokens from the caller - * @param to Payee's address - * @param value Transfer amount - * @return True if successful + * @notice Transfers tokens from the caller. + * @param to Payee's address. + * @param value Transfer amount. + * @return True if the operation was successful. */ function transfer(address to, uint256 value) external @@ -282,10 +295,10 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @notice Internal function to process transfers - * @param from Payer's address - * @param to Payee's address - * @param value Transfer amount + * @dev Internal function to process transfers. + * @param from Payer's address. + * @param to Payee's address. + * @param value Transfer amount. */ function _transfer( address from, @@ -295,19 +308,19 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require( - value <= balances[from], + value <= _balanceOf(from), "ERC20: transfer amount exceeds balance" ); - balances[from] = balances[from].sub(value); - balances[to] = balances[to].add(value); + _setBalance(from, _balanceOf(from).sub(value)); + _setBalance(to, _balanceOf(to).add(value)); emit Transfer(from, to, value); } /** - * @dev Function to add/update a new minter - * @param minter The address of the minter - * @param minterAllowedAmount The minting amount allowed for the minter + * @notice Adds or updates a new minter with a mint allowance. + * @param minter The address of the minter. + * @param minterAllowedAmount The minting amount allowed for the minter. * @return True if the operation was successful. */ function configureMinter(address minter, uint256 minterAllowedAmount) @@ -323,8 +336,8 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev Function to remove a minter - * @param minter The address of the minter to remove + * @notice Removes a minter. + * @param minter The address of the minter to remove. * @return True if the operation was successful. */ function removeMinter(address minter) @@ -339,10 +352,10 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { } /** - * @dev allows a minter to burn some of its own tokens - * Validates that caller is a minter and that sender is not blacklisted - * amount is less than or equal to the minter's account balance - * @param _amount uint256 the amount of tokens to be burned + * @notice Allows a minter to burn some of its own tokens. + * @dev The caller must be a minter, must not be blacklisted, and the amount to burn + * should be less than or equal to the account's balance. + * @param _amount the amount of tokens to be burned. */ function burn(uint256 _amount) external @@ -350,16 +363,20 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { onlyMinters notBlacklisted(msg.sender) { - uint256 balance = balances[msg.sender]; + uint256 balance = _balanceOf(msg.sender); require(_amount > 0, "FiatToken: burn amount not greater than 0"); require(balance >= _amount, "FiatToken: burn amount exceeds balance"); totalSupply_ = totalSupply_.sub(_amount); - balances[msg.sender] = balance.sub(_amount); + _setBalance(msg.sender, balance.sub(_amount)); emit Burn(msg.sender, _amount); emit Transfer(msg.sender, address(0), _amount); } + /** + * @notice Updates the master minter address. + * @param _newMasterMinter The address of the new master minter. + */ function updateMasterMinter(address _newMasterMinter) external onlyOwner { require( _newMasterMinter != address(0), @@ -368,4 +385,66 @@ contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { masterMinter = _newMasterMinter; emit MasterMinterChanged(masterMinter); } + + /** + * @inheritdoc Blacklistable + */ + function _blacklist(address _account) internal override { + _setBlacklistState(_account, true); + } + + /** + * @inheritdoc Blacklistable + */ + function _unBlacklist(address _account) internal override { + _setBlacklistState(_account, false); + } + + /** + * @dev Helper method that sets the blacklist state of an account. + * @param _account The address of the account. + * @param _shouldBlacklist True if the account should be blacklisted, false if the account should be unblacklisted. + */ + function _setBlacklistState(address _account, bool _shouldBlacklist) + internal + virtual + { + _deprecatedBlacklisted[_account] = _shouldBlacklist; + } + + /** + * @dev Helper method that sets the balance of an account. + * @param _account The address of the account. + * @param _balance The new fiat token balance of the account. + */ + function _setBalance(address _account, uint256 _balance) internal virtual { + balanceAndBlacklistStates[_account] = _balance; + } + + /** + * @inheritdoc Blacklistable + */ + function _isBlacklisted(address _account) + internal + virtual + override + view + returns (bool) + { + return _deprecatedBlacklisted[_account]; + } + + /** + * @dev Helper method to obtain the balance of an account. + * @param _account The address of the account. + * @return The fiat token balance of the account. + */ + function _balanceOf(address _account) + internal + virtual + view + returns (uint256) + { + return balanceAndBlacklistStates[_account]; + } } diff --git a/contracts/v1/Ownable.sol b/contracts/v1/Ownable.sol index b830eee48..3e90f61d2 100644 --- a/contracts/v1/Ownable.sol +++ b/contracts/v1/Ownable.sol @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + pragma solidity 0.6.12; /** diff --git a/contracts/v1/Pausable.sol b/contracts/v1/Pausable.sol index d814a729c..51c120349 100644 --- a/contracts/v1/Pausable.sol +++ b/contracts/v1/Pausable.sol @@ -2,7 +2,7 @@ * SPDX-License-Identifier: MIT * * Copyright (c) 2016 Smart Contract Solutions, Inc. - * Copyright (c) 2018-2020 CENTRE SECZ0 + * Copyright (c) 2018-2020 CENTRE SECZ * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -81,7 +81,8 @@ contract Pausable is Ownable { } /** - * @dev update the pauser role + * @notice Updates the pauser address. + * @param _newPauser The address of the new pauser. */ function updatePauser(address _newPauser) external onlyOwner { require( diff --git a/contracts/v2/AbstractFiatTokenV2.sol b/contracts/v2/AbstractFiatTokenV2.sol index f70a5d49d..4a0e9a721 100644 --- a/contracts/v2/AbstractFiatTokenV2.sol +++ b/contracts/v2/AbstractFiatTokenV2.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/v2/EIP2612.sol b/contracts/v2/EIP2612.sol index 615e39a72..455b1ca16 100644 --- a/contracts/v2/EIP2612.sol +++ b/contracts/v2/EIP2612.sol @@ -1,32 +1,27 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; import { AbstractFiatTokenV2 } from "./AbstractFiatTokenV2.sol"; import { EIP712Domain } from "./EIP712Domain.sol"; -import { EIP712 } from "../util/EIP712.sol"; +import { MessageHashUtils } from "../util/MessageHashUtils.sol"; +import { SignatureChecker } from "../util/SignatureChecker.sol"; /** * @title EIP-2612 @@ -53,7 +48,7 @@ abstract contract EIP2612 is AbstractFiatTokenV2, EIP712Domain { * @param owner Token owner's address (Authorizer) * @param spender Spender's address * @param value Amount of allowance - * @param deadline The time at which this expires (unix time) + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration * @param v v of the signature * @param r r of the signature * @param s s of the signature @@ -67,18 +62,49 @@ abstract contract EIP2612 is AbstractFiatTokenV2, EIP712Domain { bytes32 r, bytes32 s ) internal { - require(deadline >= now, "FiatTokenV2: permit is expired"); + _permit(owner, spender, value, deadline, abi.encodePacked(r, s, v)); + } + + /** + * @notice Verify a signed approval permit and execute if valid + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param owner Token owner's address (Authorizer) + * @param spender Spender's address + * @param value Amount of allowance + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration + * @param signature Signature byte array signed by an EOA wallet or a contract wallet + */ + function _permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + bytes memory signature + ) internal { + require( + deadline == type(uint256).max || deadline >= now, + "FiatTokenV2: permit is expired" + ); - bytes memory data = abi.encode( - PERMIT_TYPEHASH, - owner, - spender, - value, - _permitNonces[owner]++, - deadline + bytes32 typedDataHash = MessageHashUtils.toTypedDataHash( + _domainSeparator(), + keccak256( + abi.encode( + PERMIT_TYPEHASH, + owner, + spender, + value, + _permitNonces[owner]++, + deadline + ) + ) ); require( - EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == owner, + SignatureChecker.isValidSignatureNow( + owner, + typedDataHash, + signature + ), "EIP2612: invalid signature" ); diff --git a/contracts/v2/EIP3009.sol b/contracts/v2/EIP3009.sol index ff83e0141..17e3d5a00 100644 --- a/contracts/v2/EIP3009.sol +++ b/contracts/v2/EIP3009.sol @@ -1,32 +1,27 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; import { AbstractFiatTokenV2 } from "./AbstractFiatTokenV2.sol"; import { EIP712Domain } from "./EIP712Domain.sol"; -import { EIP712 } from "../util/EIP712.sol"; +import { SignatureChecker } from "../util/SignatureChecker.sol"; +import { MessageHashUtils } from "../util/MessageHashUtils.sol"; /** * @title EIP-3009 @@ -97,20 +92,52 @@ abstract contract EIP3009 is AbstractFiatTokenV2, EIP712Domain { bytes32 r, bytes32 s ) internal { - _requireValidAuthorization(from, nonce, validAfter, validBefore); - - bytes memory data = abi.encode( - TRANSFER_WITH_AUTHORIZATION_TYPEHASH, + _transferWithAuthorization( from, to, value, validAfter, validBefore, - nonce + nonce, + abi.encodePacked(r, s, v) ); - require( - EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == from, - "FiatTokenV2: invalid signature" + } + + /** + * @notice Execute a transfer with a signed authorization + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _transferWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) internal { + _requireValidAuthorization(from, nonce, validAfter, validBefore); + _requireValidSignature( + from, + keccak256( + abi.encode( + TRANSFER_WITH_AUTHORIZATION_TYPEHASH, + from, + to, + value, + validAfter, + validBefore, + nonce + ) + ), + signature ); _markAuthorizationAsUsed(from, nonce); @@ -142,21 +169,55 @@ abstract contract EIP3009 is AbstractFiatTokenV2, EIP712Domain { bytes32 r, bytes32 s ) internal { - require(to == msg.sender, "FiatTokenV2: caller must be the payee"); - _requireValidAuthorization(from, nonce, validAfter, validBefore); - - bytes memory data = abi.encode( - RECEIVE_WITH_AUTHORIZATION_TYPEHASH, + _receiveWithAuthorization( from, to, value, validAfter, validBefore, - nonce + nonce, + abi.encodePacked(r, s, v) ); - require( - EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == from, - "FiatTokenV2: invalid signature" + } + + /** + * @notice Receive a transfer with a signed authorization from the payer + * @dev This has an additional check to ensure that the payee's address + * matches the caller of this function to prevent front-running attacks. + * EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _receiveWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) internal { + require(to == msg.sender, "FiatTokenV2: caller must be the payee"); + _requireValidAuthorization(from, nonce, validAfter, validBefore); + _requireValidSignature( + from, + keccak256( + abi.encode( + RECEIVE_WITH_AUTHORIZATION_TYPEHASH, + from, + to, + value, + validAfter, + validBefore, + nonce + ) + ), + signature ); _markAuthorizationAsUsed(from, nonce); @@ -178,22 +239,55 @@ abstract contract EIP3009 is AbstractFiatTokenV2, EIP712Domain { bytes32 r, bytes32 s ) internal { - _requireUnusedAuthorization(authorizer, nonce); + _cancelAuthorization(authorizer, nonce, abi.encodePacked(r, s, v)); + } - bytes memory data = abi.encode( - CANCEL_AUTHORIZATION_TYPEHASH, + /** + * @notice Attempt to cancel an authorization + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _cancelAuthorization( + address authorizer, + bytes32 nonce, + bytes memory signature + ) internal { + _requireUnusedAuthorization(authorizer, nonce); + _requireValidSignature( authorizer, - nonce - ); - require( - EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == authorizer, - "FiatTokenV2: invalid signature" + keccak256( + abi.encode(CANCEL_AUTHORIZATION_TYPEHASH, authorizer, nonce) + ), + signature ); _authorizationStates[authorizer][nonce] = true; emit AuthorizationCanceled(authorizer, nonce); } + /** + * @notice Validates that signature against input data struct + * @param signer Signer's address + * @param dataHash Hash of encoded data struct + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _requireValidSignature( + address signer, + bytes32 dataHash, + bytes memory signature + ) private view { + require( + SignatureChecker.isValidSignatureNow( + signer, + MessageHashUtils.toTypedDataHash(_domainSeparator(), dataHash), + signature + ), + "FiatTokenV2: invalid signature" + ); + } + /** * @notice Check that an authorization is unused * @param authorizer Authorizer's address diff --git a/contracts/v2/EIP712Domain.sol b/contracts/v2/EIP712Domain.sol index 2b9907348..4513d8c36 100644 --- a/contracts/v2/EIP712Domain.sol +++ b/contracts/v2/EIP712Domain.sol @@ -1,35 +1,46 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; +// solhint-disable func-name-mixedcase + /** * @title EIP712 Domain */ contract EIP712Domain { + // was originally DOMAIN_SEPARATOR + // but that has been moved to a method so we can override it in V2_2+ + bytes32 internal _DEPRECATED_CACHED_DOMAIN_SEPARATOR; + + /** + * @notice Get the EIP712 Domain Separator. + * @return The bytes32 EIP712 domain separator. + */ + function DOMAIN_SEPARATOR() external view returns (bytes32) { + return _domainSeparator(); + } + /** - * @dev EIP712 Domain Separator + * @dev Internal method to get the EIP712 Domain Separator. + * @return The bytes32 EIP712 domain separator. */ - bytes32 public DOMAIN_SEPARATOR; + function _domainSeparator() internal virtual view returns (bytes32) { + return _DEPRECATED_CACHED_DOMAIN_SEPARATOR; + } } diff --git a/contracts/v2/FiatTokenUtil.sol b/contracts/v2/FiatTokenUtil.sol index d4ba5466f..4030a97fa 100644 --- a/contracts/v2/FiatTokenUtil.sol +++ b/contracts/v2/FiatTokenUtil.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; diff --git a/contracts/v2/FiatTokenV2.sol b/contracts/v2/FiatTokenV2.sol index 5535df3ba..152d90eb9 100644 --- a/contracts/v2/FiatTokenV2.sol +++ b/contracts/v2/FiatTokenV2.sol @@ -1,33 +1,25 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; import { FiatTokenV1_1 } from "../v1.1/FiatTokenV1_1.sol"; -import { AbstractFiatTokenV2 } from "./AbstractFiatTokenV2.sol"; import { EIP712 } from "../util/EIP712.sol"; -import { EIP712Domain } from "./EIP712Domain.sol"; import { EIP3009 } from "./EIP3009.sol"; import { EIP2612 } from "./EIP2612.sol"; @@ -46,7 +38,10 @@ contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { // solhint-disable-next-line reason-string require(initialized && _initializedVersion == 0); name = newName; - DOMAIN_SEPARATOR = EIP712.makeDomainSeparator(newName, "2"); + _DEPRECATED_CACHED_DOMAIN_SEPARATOR = EIP712.makeDomainSeparator( + newName, + "2" + ); _initializedVersion = 1; } @@ -58,6 +53,7 @@ contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { */ function increaseAllowance(address spender, uint256 increment) external + virtual whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) @@ -75,6 +71,7 @@ contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { */ function decreaseAllowance(address spender, uint256 decrement) external + virtual whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) @@ -182,7 +179,7 @@ contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { * @param owner Token owner's address (Authorizer) * @param spender Spender's address * @param value Amount of allowance - * @param deadline Expiration time, seconds since the epoch + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration * @param v v of the signature * @param r r of the signature * @param s s of the signature @@ -195,12 +192,18 @@ contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { uint8 v, bytes32 r, bytes32 s - ) external whenNotPaused notBlacklisted(owner) notBlacklisted(spender) { + ) + external + virtual + whenNotPaused + notBlacklisted(owner) + notBlacklisted(spender) + { _permit(owner, spender, value, deadline, v, r, s); } /** - * @notice Internal function to increase the allowance by a given increment + * @dev Internal function to increase the allowance by a given increment * @param owner Token owner's address * @param spender Spender's address * @param increment Amount of increase @@ -214,7 +217,7 @@ contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { } /** - * @notice Internal function to decrease the allowance by a given decrement + * @dev Internal function to decrease the allowance by a given decrement * @param owner Token owner's address * @param spender Spender's address * @param decrement Amount of decrease diff --git a/contracts/v2/FiatTokenV2_1.sol b/contracts/v2/FiatTokenV2_1.sol index d7eaf65ef..38fe992c6 100644 --- a/contracts/v2/FiatTokenV2_1.sol +++ b/contracts/v2/FiatTokenV2_1.sol @@ -1,25 +1,19 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; @@ -41,11 +35,11 @@ contract FiatTokenV2_1 is FiatTokenV2 { // solhint-disable-next-line reason-string require(_initializedVersion == 1); - uint256 lockedAmount = balances[address(this)]; + uint256 lockedAmount = _balanceOf(address(this)); if (lockedAmount > 0) { _transfer(address(this), lostAndFound, lockedAmount); } - blacklisted[address(this)] = true; + _blacklist(address(this)); _initializedVersion = 2; } @@ -54,7 +48,7 @@ contract FiatTokenV2_1 is FiatTokenV2 { * @notice Version string for the EIP712 domain separator * @return Version string */ - function version() external view returns (string memory) { + function version() external pure returns (string memory) { return "2"; } } diff --git a/contracts/v2/FiatTokenV2_2.sol b/contracts/v2/FiatTokenV2_2.sol new file mode 100644 index 000000000..41260cb02 --- /dev/null +++ b/contracts/v2/FiatTokenV2_2.sol @@ -0,0 +1,309 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { EIP712Domain } from "./EIP712Domain.sol"; // solhint-disable-line no-unused-import +import { Blacklistable } from "../v1/Blacklistable.sol"; // solhint-disable-line no-unused-import +import { FiatTokenV1 } from "../v1/FiatTokenV1.sol"; // solhint-disable-line no-unused-import +import { FiatTokenV2 } from "./FiatTokenV2.sol"; // solhint-disable-line no-unused-import +import { FiatTokenV2_1 } from "./FiatTokenV2_1.sol"; +import { EIP712 } from "../util/EIP712.sol"; + +// solhint-disable func-name-mixedcase + +/** + * @title FiatToken V2.2 + * @notice ERC20 Token backed by fiat reserves, version 2.2 + */ +contract FiatTokenV2_2 is FiatTokenV2_1 { + /** + * @notice Initialize v2.2 + * @param accountsToBlacklist A list of accounts to migrate from the old blacklist + * @param newSymbol New token symbol + * data structure to the new blacklist data structure. + */ + function initializeV2_2( + address[] calldata accountsToBlacklist, + string calldata newSymbol + ) external { + // solhint-disable-next-line reason-string + require(_initializedVersion == 2); + + // Update fiat token symbol + symbol = newSymbol; + + // Add previously blacklisted accounts to the new blacklist data structure + // and remove them from the old blacklist data structure. + for (uint256 i = 0; i < accountsToBlacklist.length; i++) { + require( + _deprecatedBlacklisted[accountsToBlacklist[i]], + "FiatTokenV2_2: Blacklisting previously unblacklisted account!" + ); + _blacklist(accountsToBlacklist[i]); + delete _deprecatedBlacklisted[accountsToBlacklist[i]]; + } + _blacklist(address(this)); + delete _deprecatedBlacklisted[address(this)]; + + _initializedVersion = 3; + } + + /** + * @dev Internal function to get the current chain id. + * @return The current chain id. + */ + function _chainId() internal virtual view returns (uint256) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId; + } + + /** + * @inheritdoc EIP712Domain + */ + function _domainSeparator() internal override view returns (bytes32) { + return EIP712.makeDomainSeparator(name, "2", _chainId()); + } + + /** + * @notice Update allowance with a signed permit + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param owner Token owner's address (Authorizer) + * @param spender Spender's address + * @param value Amount of allowance + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + bytes memory signature + ) external whenNotPaused { + _permit(owner, spender, value, deadline, signature); + } + + /** + * @notice Execute a transfer with a signed authorization + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function transferWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) external whenNotPaused notBlacklisted(from) notBlacklisted(to) { + _transferWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + signature + ); + } + + /** + * @notice Receive a transfer with a signed authorization from the payer + * @dev This has an additional check to ensure that the payee's address + * matches the caller of this function to prevent front-running attacks. + * EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function receiveWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) external whenNotPaused notBlacklisted(from) notBlacklisted(to) { + _receiveWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + signature + ); + } + + /** + * @notice Attempt to cancel an authorization + * @dev Works only if the authorization is not yet used. + * EOA wallet signatures should be packed in the order of r, s, v. + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function cancelAuthorization( + address authorizer, + bytes32 nonce, + bytes memory signature + ) external whenNotPaused { + _cancelAuthorization(authorizer, nonce, signature); + } + + /** + * @dev Helper method that sets the blacklist state of an account on balanceAndBlacklistStates. + * If _shouldBlacklist is true, we apply a (1 << 255) bitmask with an OR operation on the + * account's balanceAndBlacklistState. This flips the high bit for the account to 1, + * indicating that the account is blacklisted. + * + * If _shouldBlacklist if false, we reset the account's balanceAndBlacklistStates to their + * balances. This clears the high bit for the account, indicating that the account is unblacklisted. + * @param _account The address of the account. + * @param _shouldBlacklist True if the account should be blacklisted, false if the account should be unblacklisted. + */ + function _setBlacklistState(address _account, bool _shouldBlacklist) + internal + override + { + balanceAndBlacklistStates[_account] = _shouldBlacklist + ? balanceAndBlacklistStates[_account] | (1 << 255) + : _balanceOf(_account); + } + + /** + * @dev Helper method that sets the balance of an account on balanceAndBlacklistStates. + * Since balances are stored in the last 255 bits of the balanceAndBlacklistStates value, + * we need to ensure that the updated balance does not exceed (2^255 - 1). + * Since blacklisted accounts' balances cannot be updated, the method will also + * revert if the account is blacklisted + * @param _account The address of the account. + * @param _balance The new fiat token balance of the account (max: (2^255 - 1)). + */ + function _setBalance(address _account, uint256 _balance) internal override { + require( + _balance <= ((1 << 255) - 1), + "FiatTokenV2_2: Balance exceeds (2^255 - 1)" + ); + require( + !_isBlacklisted(_account), + "FiatTokenV2_2: Account is blacklisted" + ); + + balanceAndBlacklistStates[_account] = _balance; + } + + /** + * @inheritdoc Blacklistable + */ + function _isBlacklisted(address _account) + internal + override + view + returns (bool) + { + return balanceAndBlacklistStates[_account] >> 255 == 1; + } + + /** + * @dev Helper method to obtain the balance of an account. Since balances + * are stored in the last 255 bits of the balanceAndBlacklistStates value, + * we apply a ((1 << 255) - 1) bit bitmask with an AND operation on the + * balanceAndBlacklistState to obtain the balance. + * @param _account The address of the account. + * @return The fiat token balance of the account. + */ + function _balanceOf(address _account) + internal + override + view + returns (uint256) + { + return balanceAndBlacklistStates[_account] & ((1 << 255) - 1); + } + + /** + * @inheritdoc FiatTokenV1 + */ + function approve(address spender, uint256 value) + external + override + whenNotPaused + returns (bool) + { + _approve(msg.sender, spender, value); + return true; + } + + /** + * @inheritdoc FiatTokenV2 + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override whenNotPaused { + _permit(owner, spender, value, deadline, v, r, s); + } + + /** + * @inheritdoc FiatTokenV2 + */ + function increaseAllowance(address spender, uint256 increment) + external + override + whenNotPaused + returns (bool) + { + _increaseAllowance(msg.sender, spender, increment); + return true; + } + + /** + * @inheritdoc FiatTokenV2 + */ + function decreaseAllowance(address spender, uint256 decrement) + external + override + whenNotPaused + returns (bool) + { + _decreaseAllowance(msg.sender, spender, decrement); + return true; + } +} diff --git a/contracts/v2/upgrader/AbstractV2Upgrader.sol b/contracts/v2/upgrader/AbstractV2Upgrader.sol new file mode 100644 index 000000000..f4ebd6cd7 --- /dev/null +++ b/contracts/v2/upgrader/AbstractV2Upgrader.sol @@ -0,0 +1,120 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { Ownable } from "../../v1/Ownable.sol"; +import { FiatTokenProxy } from "../../v1/FiatTokenProxy.sol"; +import { AbstractUpgraderHelper } from "./helpers/AbstractUpgraderHelper.sol"; + +/** + * @dev An abstract contract to encapsulate any common logic + * for any V2+ Upgrader contracts. + */ +abstract contract AbstractV2Upgrader is Ownable { + using SafeMath for uint256; + + FiatTokenProxy internal _proxy; + address internal _implementation; + address internal _newProxyAdmin; + AbstractUpgraderHelper internal _helper; + + /** + * @notice Constructor + * @param proxy FiatTokenProxy contract + * @param implementation Address of the implementation contract + * @param newProxyAdmin Grantee of proxy admin role after upgrade + */ + constructor( + FiatTokenProxy proxy, + address implementation, + address newProxyAdmin + ) public Ownable() { + _proxy = proxy; + _implementation = implementation; + _newProxyAdmin = newProxyAdmin; + } + + /** + * @notice The address of the FiatTokenProxy contract + * @return Contract address + */ + function proxy() external view returns (address) { + return address(_proxy); + } + + /** + * @notice The address of the FiatTokenV2 implementation contract + * @return Contract address + */ + function implementation() external view returns (address) { + return _implementation; + } + + /** + * @notice The address of the V2UpgraderHelper contract + * @return Contract address + */ + function helper() external view returns (address) { + return address(_helper); + } + + /** + * @notice The address to which the proxy admin role will be transferred + * after the upgrade is completed + * @return Address + */ + function newProxyAdmin() external view returns (address) { + return _newProxyAdmin; + } + + /** + * @notice Withdraw any FiatToken in the contract + */ + function withdrawFiatToken() public onlyOwner { + IERC20 fiatToken = IERC20(address(_proxy)); + uint256 balance = fiatToken.balanceOf(address(this)); + if (balance > 0) { + require( + fiatToken.transfer(msg.sender, balance), + "Failed to withdraw FiatToken" + ); + } + } + + /** + * @notice Transfer proxy admin role to newProxyAdmin, and self-destruct + */ + function abortUpgrade() external onlyOwner { + // Transfer proxy admin role + _proxy.changeAdmin(_newProxyAdmin); + + // Tear down + tearDown(); + } + + /** + * @dev Tears down the helper contract followed by this contract. + */ + function tearDown() internal { + _helper.tearDown(); + selfdestruct(msg.sender); + } +} diff --git a/contracts/v2/upgrader/V2Upgrader.sol b/contracts/v2/upgrader/V2Upgrader.sol index bc1cd8835..e3f6ecff7 100644 --- a/contracts/v2/upgrader/V2Upgrader.sol +++ b/contracts/v2/upgrader/V2Upgrader.sol @@ -1,53 +1,41 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { Ownable } from "../../v1/Ownable.sol"; import { FiatTokenV2 } from "../FiatTokenV2.sol"; import { FiatTokenProxy } from "../../v1/FiatTokenProxy.sol"; -import { V2UpgraderHelper } from "./V2UpgraderHelper.sol"; +import { V2UpgraderHelper } from "./helpers/V2UpgraderHelper.sol"; +import { AbstractV2Upgrader } from "./AbstractV2Upgrader.sol"; /** * @title V2 Upgrader - * @notice Performs USDC v2 upgrade, and runs a basic sanity test in a single - * atomic transaction, rolling back if any issues are found. This may be - * overkill, but the peace of mind is worth the gas spent. By performing the + * @notice Performs FiatToken v2 upgrade, and runs a basic sanity test in a single + * atomic transaction, rolling back if any issues are found. By performing the * upgrade atomically, it ensures that there is no disruption of service if the * upgrade is not successful for some unforeseen circumstances. - * @dev Read docs/v2_upgrade.md + * @dev Read doc/v2_upgrade.md */ -contract V2Upgrader is Ownable { +contract V2Upgrader is AbstractV2Upgrader { using SafeMath for uint256; - FiatTokenProxy private _proxy; - FiatTokenV2 private _implementation; - address private _newProxyAdmin; string private _newName; - V2UpgraderHelper private _helper; /** * @notice Constructor @@ -61,47 +49,11 @@ contract V2Upgrader is Ownable { FiatTokenV2 implementation, address newProxyAdmin, string memory newName - ) public Ownable() { - _proxy = proxy; - _implementation = implementation; - _newProxyAdmin = newProxyAdmin; + ) public AbstractV2Upgrader(proxy, address(implementation), newProxyAdmin) { _newName = newName; _helper = new V2UpgraderHelper(address(proxy)); } - /** - * @notice The address of the FiatTokenProxy contract - * @return Contract address - */ - function proxy() external view returns (address) { - return address(_proxy); - } - - /** - * @notice The address of the FiatTokenV2 implementation contract - * @return Contract address - */ - function implementation() external view returns (address) { - return address(_implementation); - } - - /** - * @notice The address of the V2UpgraderHelper contract - * @return Contract address - */ - function helper() external view returns (address) { - return address(_helper); - } - - /** - * @notice The address to which the proxy admin role will be transferred - * after the upgrade is completed - * @return Address - */ - function newProxyAdmin() external view returns (address) { - return _newProxyAdmin; - } - /** * @notice New ERC20 token name * @return New Name @@ -119,24 +71,25 @@ contract V2Upgrader is Ownable { // The helper needs to be used to read contract state because // AdminUpgradeabilityProxy does not allow the proxy admin to make // proxy calls. + V2UpgraderHelper v2Helper = V2UpgraderHelper(address(_helper)); // Check that this contract sufficient funds to run the tests - uint256 contractBal = _helper.balanceOf(address(this)); - require(contractBal >= 2e5, "V2Upgrader: 0.2 USDC needed"); + uint256 contractBal = v2Helper.balanceOf(address(this)); + require(contractBal >= 2e5, "V2Upgrader: 0.2 FiatToken needed"); - uint256 callerBal = _helper.balanceOf(msg.sender); + uint256 callerBal = v2Helper.balanceOf(msg.sender); // Keep original contract metadata - string memory symbol = _helper.symbol(); - uint8 decimals = _helper.decimals(); - string memory currency = _helper.currency(); - address masterMinter = _helper.masterMinter(); - address owner = _helper.fiatTokenOwner(); - address pauser = _helper.pauser(); - address blacklister = _helper.blacklister(); + string memory symbol = v2Helper.symbol(); + uint8 decimals = v2Helper.decimals(); + string memory currency = v2Helper.currency(); + address masterMinter = v2Helper.masterMinter(); + address owner = v2Helper.fiatTokenOwner(); + address pauser = v2Helper.pauser(); + address blacklister = v2Helper.blacklister(); // Change implementation contract address - _proxy.upgradeTo(address(_implementation)); + _proxy.upgradeTo(_implementation); // Transfer proxy admin role _proxy.changeAdmin(_newProxyAdmin); @@ -175,46 +128,19 @@ contract V2Upgrader is Ownable { // Test approve/transferFrom require( - v2.approve(address(_helper), 1e5) && - v2.allowance(address(this), address(_helper)) == 1e5 && - _helper.transferFrom(address(this), msg.sender, 1e5) && + v2.approve(address(v2Helper), 1e5) && + v2.allowance(address(this), address(v2Helper)) == 1e5 && + v2Helper.transferFrom(address(this), msg.sender, 1e5) && v2.allowance(address(this), msg.sender) == 0 && v2.balanceOf(msg.sender) == callerBal.add(2e5) && v2.balanceOf(address(this)) == contractBal.sub(2e5), "V2Upgrader: approve/transferFrom test failed" ); - // Transfer any remaining USDC to the caller - withdrawUSDC(); - - // Tear down - _helper.tearDown(); - selfdestruct(msg.sender); - } - - /** - * @notice Withdraw any USDC in the contract - */ - function withdrawUSDC() public onlyOwner { - IERC20 usdc = IERC20(address(_proxy)); - uint256 balance = usdc.balanceOf(address(this)); - if (balance > 0) { - require( - usdc.transfer(msg.sender, balance), - "V2Upgrader: failed to withdraw USDC" - ); - } - } - - /** - * @notice Transfer proxy admin role to newProxyAdmin, and self-destruct - */ - function abortUpgrade() external onlyOwner { - // Transfer proxy admin role - _proxy.changeAdmin(_newProxyAdmin); + // Transfer any remaining FiatToken to the caller + withdrawFiatToken(); // Tear down - _helper.tearDown(); - selfdestruct(msg.sender); + tearDown(); } } diff --git a/contracts/v2/upgrader/V2_1Upgrader.sol b/contracts/v2/upgrader/V2_1Upgrader.sol index 73eea11ae..64ed69e3e 100644 --- a/contracts/v2/upgrader/V2_1Upgrader.sol +++ b/contracts/v2/upgrader/V2_1Upgrader.sol @@ -1,48 +1,41 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { Ownable } from "../../v1/Ownable.sol"; import { FiatTokenV2_1 } from "../FiatTokenV2_1.sol"; import { FiatTokenProxy } from "../../v1/FiatTokenProxy.sol"; -import { V2UpgraderHelper } from "./V2UpgraderHelper.sol"; +import { V2UpgraderHelper } from "./helpers/V2UpgraderHelper.sol"; +import { AbstractV2Upgrader } from "./AbstractV2Upgrader.sol"; /** * @title V2.1 Upgrader - * @dev Read docs/v2.1_upgrade.md + * @notice Performs FiatToken v2.1 upgrade, and runs a basic sanity test in a single + * atomic transaction, rolling back if any issues are found. By performing the + * upgrade atomically, it ensures that there is no disruption of service if the + * upgrade is not successful for some unforeseen circumstances. + * @dev Read doc/v2.1_upgrade.md */ -contract V2_1Upgrader is Ownable { +contract V2_1Upgrader is AbstractV2Upgrader { using SafeMath for uint256; - FiatTokenProxy private _proxy; - FiatTokenV2_1 private _implementation; - address private _newProxyAdmin; address private _lostAndFound; - V2UpgraderHelper private _helper; /** * @notice Constructor @@ -56,47 +49,11 @@ contract V2_1Upgrader is Ownable { FiatTokenV2_1 implementation, address newProxyAdmin, address lostAndFound - ) public Ownable() { - _proxy = proxy; - _implementation = implementation; - _newProxyAdmin = newProxyAdmin; + ) public AbstractV2Upgrader(proxy, address(implementation), newProxyAdmin) { _lostAndFound = lostAndFound; _helper = new V2UpgraderHelper(address(proxy)); } - /** - * @notice The address of the FiatTokenProxy contract - * @return Contract address - */ - function proxy() external view returns (address) { - return address(_proxy); - } - - /** - * @notice The address of the FiatTokenV2 implementation contract - * @return Contract address - */ - function implementation() external view returns (address) { - return address(_implementation); - } - - /** - * @notice The address of the V2UpgraderHelper contract - * @return Contract address - */ - function helper() external view returns (address) { - return address(_helper); - } - - /** - * @notice The address to which the proxy admin role will be transferred - * after the upgrade is completed - * @return Address - */ - function newProxyAdmin() external view returns (address) { - return _newProxyAdmin; - } - /** * @notice The address to which the locked funds will be sent as part of the * initialization process @@ -115,25 +72,26 @@ contract V2_1Upgrader is Ownable { // The helper needs to be used to read contract state because // AdminUpgradeabilityProxy does not allow the proxy admin to make // proxy calls. + V2UpgraderHelper v2_1Helper = V2UpgraderHelper(address(_helper)); // Check that this contract sufficient funds to run the tests - uint256 contractBal = _helper.balanceOf(address(this)); - require(contractBal >= 2e5, "V2_1Upgrader: 0.2 USDC needed"); + uint256 contractBal = v2_1Helper.balanceOf(address(this)); + require(contractBal >= 2e5, "V2_1Upgrader: 0.2 FiatToken needed"); - uint256 callerBal = _helper.balanceOf(msg.sender); + uint256 callerBal = v2_1Helper.balanceOf(msg.sender); // Keep original contract metadata - string memory name = _helper.name(); - string memory symbol = _helper.symbol(); - uint8 decimals = _helper.decimals(); - string memory currency = _helper.currency(); - address masterMinter = _helper.masterMinter(); - address owner = _helper.fiatTokenOwner(); - address pauser = _helper.pauser(); - address blacklister = _helper.blacklister(); + string memory name = v2_1Helper.name(); + string memory symbol = v2_1Helper.symbol(); + uint8 decimals = v2_1Helper.decimals(); + string memory currency = v2_1Helper.currency(); + address masterMinter = v2_1Helper.masterMinter(); + address owner = v2_1Helper.fiatTokenOwner(); + address pauser = v2_1Helper.pauser(); + address blacklister = v2_1Helper.blacklister(); // Change implementation contract address - _proxy.upgradeTo(address(_implementation)); + _proxy.upgradeTo(_implementation); // Transfer proxy admin role _proxy.changeAdmin(_newProxyAdmin); @@ -173,46 +131,19 @@ contract V2_1Upgrader is Ownable { // Test approve/transferFrom require( - v2_1.approve(address(_helper), 1e5) && - v2_1.allowance(address(this), address(_helper)) == 1e5 && - _helper.transferFrom(address(this), msg.sender, 1e5) && + v2_1.approve(address(v2_1Helper), 1e5) && + v2_1.allowance(address(this), address(v2_1Helper)) == 1e5 && + v2_1Helper.transferFrom(address(this), msg.sender, 1e5) && v2_1.allowance(address(this), msg.sender) == 0 && v2_1.balanceOf(msg.sender) == callerBal.add(2e5) && v2_1.balanceOf(address(this)) == contractBal.sub(2e5), "V2_1Upgrader: approve/transferFrom test failed" ); - // Transfer any remaining USDC to the caller - withdrawUSDC(); - - // Tear down - _helper.tearDown(); - selfdestruct(msg.sender); - } - - /** - * @notice Withdraw any USDC in the contract - */ - function withdrawUSDC() public onlyOwner { - IERC20 usdc = IERC20(address(_proxy)); - uint256 balance = usdc.balanceOf(address(this)); - if (balance > 0) { - require( - usdc.transfer(msg.sender, balance), - "V2_1Upgrader: failed to withdraw USDC" - ); - } - } - - /** - * @notice Transfer proxy admin role to newProxyAdmin, and self-destruct - */ - function abortUpgrade() external onlyOwner { - // Transfer proxy admin role - _proxy.changeAdmin(_newProxyAdmin); + // Transfer any remaining FiatToken to the caller + withdrawFiatToken(); // Tear down - _helper.tearDown(); - selfdestruct(msg.sender); + tearDown(); } } diff --git a/contracts/v2/upgrader/V2_2Upgrader.sol b/contracts/v2/upgrader/V2_2Upgrader.sol new file mode 100644 index 000000000..1a6878385 --- /dev/null +++ b/contracts/v2/upgrader/V2_2Upgrader.sol @@ -0,0 +1,208 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { FiatTokenV2_2 } from "../FiatTokenV2_2.sol"; +import { FiatTokenProxy } from "../../v1/FiatTokenProxy.sol"; +import { V2_2UpgraderHelper } from "./helpers/V2_2UpgraderHelper.sol"; +import { AbstractV2Upgrader } from "./AbstractV2Upgrader.sol"; + +/** + * @title V2.2 Upgrader + * @notice Performs FiatToken v2.2 upgrade, and runs a basic sanity test in a single + * atomic transaction, rolling back if any issues are found. By performing the + * upgrade atomically, it ensures that there is no disruption of service if the + * upgrade is not successful for some unforeseen circumstances. + * @dev Read doc/v2.2_upgrade.md + */ +contract V2_2Upgrader is AbstractV2Upgrader { + using SafeMath for uint256; + + struct FiatTokenMetadata { + string name; + uint8 decimals; + string currency; + string version; + bytes32 domainSeparator; + address masterMinter; + address owner; + address pauser; + address blacklister; + address rescuer; + bool paused; + uint256 totalSupply; + } + + address[] private _accountsToBlacklist; + string private _newSymbol; + + /** + * @notice Constructor + * @param proxy FiatTokenProxy contract + * @param implementation FiatTokenV2_2 implementation contract + * @param newProxyAdmin Grantee of proxy admin role after upgrade + * @param accountsToBlacklist Accounts to add to the new blacklist data structure + * @param newSymbol New token symbol + */ + constructor( + FiatTokenProxy proxy, + FiatTokenV2_2 implementation, + address newProxyAdmin, + address[] memory accountsToBlacklist, + string memory newSymbol + ) public AbstractV2Upgrader(proxy, address(implementation), newProxyAdmin) { + _helper = new V2_2UpgraderHelper(address(proxy)); + _accountsToBlacklist = accountsToBlacklist; + _newSymbol = newSymbol; + } + + /** + * @notice The list of blacklisted accounts to migrate to the blacklist data structure. + * @return Address[] the list of accounts to blacklist. + */ + function accountsToBlacklist() external view returns (address[] memory) { + return _accountsToBlacklist; + } + + /** + * @notice Upgrade, transfer proxy admin role to a given address, run a + * sanity test, and tear down the upgrader contract, in a single atomic + * transaction. It rolls back if there is an error. + */ + function upgrade() external onlyOwner { + // The helper needs to be used to read contract state because + // AdminUpgradeabilityProxy does not allow the proxy admin to make + // proxy calls. + V2_2UpgraderHelper v2_2Helper = V2_2UpgraderHelper(address(_helper)); + + // Check that this contract sufficient funds to run the tests + uint256 contractBal = v2_2Helper.balanceOf(address(this)); + require(contractBal >= 2e5, "V2_2Upgrader: 0.2 FiatToken needed"); + + uint256 callerBal = v2_2Helper.balanceOf(msg.sender); + + // Keep original contract metadata + FiatTokenMetadata memory originalMetadata = FiatTokenMetadata( + v2_2Helper.name(), + v2_2Helper.decimals(), + v2_2Helper.currency(), + v2_2Helper.version(), + v2_2Helper.DOMAIN_SEPARATOR(), + v2_2Helper.masterMinter(), + v2_2Helper.fiatTokenOwner(), + v2_2Helper.pauser(), + v2_2Helper.blacklister(), + v2_2Helper.rescuer(), + v2_2Helper.paused(), + v2_2Helper.totalSupply() + ); + + // Change implementation contract address + _proxy.upgradeTo(_implementation); + + // Transfer proxy admin role + _proxy.changeAdmin(_newProxyAdmin); + + // Initialize V2 contract + FiatTokenV2_2 v2_2 = FiatTokenV2_2(address(_proxy)); + v2_2.initializeV2_2(_accountsToBlacklist, _newSymbol); + + // Sanity test + // Check metadata + FiatTokenMetadata memory upgradedMetadata = FiatTokenMetadata( + v2_2.name(), + v2_2.decimals(), + v2_2.currency(), + v2_2.version(), + v2_2.DOMAIN_SEPARATOR(), + v2_2.masterMinter(), + v2_2.owner(), + v2_2.pauser(), + v2_2.blacklister(), + v2_2.rescuer(), + v2_2.paused(), + v2_2.totalSupply() + ); + require( + checkFiatTokenMetadataEqual(originalMetadata, upgradedMetadata), + "V2_2Upgrader: metadata test failed" + ); + + // Check symbol is updated + require( + keccak256(bytes(v2_2.symbol())) == keccak256(bytes(_newSymbol)), + "V2_2Upgrader: symbol not updated" + ); + + // Test balanceOf + require( + v2_2.balanceOf(address(this)) == contractBal, + "V2_2Upgrader: balanceOf test failed" + ); + + // Test transfer + require( + v2_2.transfer(msg.sender, 1e5) && + v2_2.balanceOf(msg.sender) == callerBal.add(1e5) && + v2_2.balanceOf(address(this)) == contractBal.sub(1e5), + "V2_2Upgrader: transfer test failed" + ); + + // Test approve/transferFrom + require( + v2_2.approve(address(v2_2Helper), 1e5) && + v2_2.allowance(address(this), address(v2_2Helper)) == 1e5 && + v2_2Helper.transferFrom(address(this), msg.sender, 1e5) && + v2_2.allowance(address(this), msg.sender) == 0 && + v2_2.balanceOf(msg.sender) == callerBal.add(2e5) && + v2_2.balanceOf(address(this)) == contractBal.sub(2e5), + "V2_2Upgrader: approve/transferFrom test failed" + ); + + // Transfer any remaining FiatToken to the caller + withdrawFiatToken(); + + // Tear down + tearDown(); + } + + /** + * @dev Checks whether two FiatTokenMetadata are equal. + * @return true if the two metadata are equal, false otherwise. + */ + function checkFiatTokenMetadataEqual( + FiatTokenMetadata memory a, + FiatTokenMetadata memory b + ) private pure returns (bool) { + return + keccak256(bytes(a.name)) == keccak256(bytes(b.name)) && + a.decimals == b.decimals && + keccak256(bytes(a.currency)) == keccak256(bytes(b.currency)) && + keccak256(bytes(a.version)) == keccak256(bytes(b.version)) && + a.domainSeparator == b.domainSeparator && + a.masterMinter == b.masterMinter && + a.owner == b.owner && + a.pauser == b.pauser && + a.blacklister == b.blacklister && + a.rescuer == b.rescuer && + a.paused == b.paused && + a.totalSupply == b.totalSupply; + } +} diff --git a/contracts/v2/upgrader/helpers/AbstractUpgraderHelper.sol b/contracts/v2/upgrader/helpers/AbstractUpgraderHelper.sol new file mode 100644 index 000000000..e93987872 --- /dev/null +++ b/contracts/v2/upgrader/helpers/AbstractUpgraderHelper.sol @@ -0,0 +1,52 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +pragma solidity 0.6.12; + +import { Ownable } from "../../../v1/Ownable.sol"; + +/** + * @dev An abstract contract to encapsulate any common logic for any V2+ Upgrader Helper contracts. + * The helper enables the upgrader to read some contract state before it renounces the + * proxy admin role (Proxy admins cannot call delegated methods). + */ +abstract contract AbstractUpgraderHelper is Ownable { + address internal _proxy; + + /** + * @notice Constructor + * @param fiatTokenProxy Address of the FiatTokenProxy contract + */ + constructor(address fiatTokenProxy) public Ownable() { + _proxy = fiatTokenProxy; + } + + /** + * @notice The address of the FiatTokenProxy contract + * @return Contract address + */ + function proxy() external view returns (address) { + return _proxy; + } + + /** + * @notice Tear down the contract (self-destruct) + */ + function tearDown() external onlyOwner { + selfdestruct(msg.sender); + } +} diff --git a/contracts/v2/upgrader/V2UpgraderHelper.sol b/contracts/v2/upgrader/helpers/V2UpgraderHelper.sol similarity index 59% rename from contracts/v2/upgrader/V2UpgraderHelper.sol rename to contracts/v2/upgrader/helpers/V2UpgraderHelper.sol index dc0ed006c..67a172921 100644 --- a/contracts/v2/upgrader/V2UpgraderHelper.sol +++ b/contracts/v2/upgrader/helpers/V2UpgraderHelper.sol @@ -1,56 +1,41 @@ /** - * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: Apache-2.0 * - * Copyright (c) 2018-2020 CENTRE SECZ + * Copyright (c) 2023, Circle Internet Financial, LLC. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ pragma solidity 0.6.12; -import { FiatTokenV1 } from "../../v1/FiatTokenV1.sol"; -import { Ownable } from "../../v1/Ownable.sol"; +import { FiatTokenV1 } from "../../../v1/FiatTokenV1.sol"; +import { AbstractUpgraderHelper } from "./AbstractUpgraderHelper.sol"; /** * @title V2 Upgrader Helper * @dev Enables V2Upgrader to read some contract state before it renounces the - * proxy admin role. (Proxy admins cannot call delegated methods.) It is also + * proxy admin role. (Proxy admins cannot call delegated methods). It is also * used to test approve/transferFrom. */ -contract V2UpgraderHelper is Ownable { - address private _proxy; - +contract V2UpgraderHelper is AbstractUpgraderHelper { /** * @notice Constructor * @param fiatTokenProxy Address of the FiatTokenProxy contract */ - constructor(address fiatTokenProxy) public Ownable() { - _proxy = fiatTokenProxy; - } - - /** - * @notice The address of the FiatTokenProxy contract - * @return Contract address - */ - function proxy() external view returns (address) { - return address(_proxy); - } + constructor(address fiatTokenProxy) + public + AbstractUpgraderHelper(fiatTokenProxy) + {} /** * @notice Call name() @@ -140,11 +125,4 @@ contract V2UpgraderHelper is Ownable { ) external returns (bool) { return FiatTokenV1(_proxy).transferFrom(from, to, value); } - - /** - * @notice Tear down the contract (self-destruct) - */ - function tearDown() external onlyOwner { - selfdestruct(msg.sender); - } } diff --git a/contracts/v2/upgrader/helpers/V2_2UpgraderHelper.sol b/contracts/v2/upgrader/helpers/V2_2UpgraderHelper.sol new file mode 100644 index 000000000..6a218c132 --- /dev/null +++ b/contracts/v2/upgrader/helpers/V2_2UpgraderHelper.sol @@ -0,0 +1,80 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity 0.6.12; + +import { FiatTokenV2_1 } from "../../../v2/FiatTokenV2_1.sol"; +import { V2UpgraderHelper } from "./V2UpgraderHelper.sol"; + +/** + * @title V2.2 Upgrader Helper + * @dev Enables V2_2Upgrader to read some contract state before it renounces the + * proxy admin role. (Proxy admins cannot call delegated methods). It is also + * used to test approve/transferFrom. + */ +contract V2_2UpgraderHelper is V2UpgraderHelper { + /** + * @notice Constructor + * @param fiatTokenProxy Address of the FiatTokenProxy contract + */ + constructor(address fiatTokenProxy) + public + V2UpgraderHelper(fiatTokenProxy) + {} + + /** + * @notice Call version() + * @return version + */ + function version() external view returns (string memory) { + return FiatTokenV2_1(_proxy).version(); + } + + /** + * @notice Call DOMAIN_SEPARATOR() + * @return domainSeparator + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32) { + return FiatTokenV2_1(_proxy).DOMAIN_SEPARATOR(); + } + + /** + * @notice Call rescuer() + * @return rescuer + */ + function rescuer() external view returns (address) { + return FiatTokenV2_1(_proxy).rescuer(); + } + + /** + * @notice Call paused() + * @return paused + */ + function paused() external view returns (bool) { + return FiatTokenV2_1(_proxy).paused(); + } + + /** + * @notice Call totalSupply() + * @return totalSupply + */ + function totalSupply() external view returns (uint256) { + return FiatTokenV2_1(_proxy).totalSupply(); + } +} diff --git a/doc/deployment.md b/doc/deployment.md index 06181ed82..4671f23fa 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -3,37 +3,42 @@ This is the process for deploying a new proxy and implementation (as opposed to upgrading an existing proxy). -Since the proxy uses `delegatecall` to forward calls to the implementation -initialization of the contracts becomes a little tricky because we can not +Since the proxy uses `delegatecall` to forward calls to the implementation, +initialization of the contracts becomes a little tricky because we cannot initialize fields in the implementation contract via the constructor. Instead there is an initialize method in the implementation contract, which is publicly available, but can only be called once per proxy. ## Deploying the implementation contract -1. Deploy [FiatTokenV1](../contracts/FiatTokenV1.sol) -2. Initialize the fields in FiatToken via the `initialize` method. The values - are not important, but this will stop anyone else initializing the roles and - trying to use it as a token or pass it off as a real CENTRE token. - ``` +1. Deploy [FiatTokenV2_2](../contracts/v2/FiatTokenV2_2.sol) +2. Initialize the fields in FiatTokenV2_2 via the `initialize*` methods. The + values are not important, but this will stop anyone else initializing the + roles and trying to use it as a token or pass it off as a real Circle token. + + ```js initialize( - "", - "", - "", - 0, - throwawayAddress, - throwawayAddress, - throwawayAddress, - throwawayAddress - ) + "", + "", + "", + 0, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS + ); + initializeV2(""); + initializeV2_1(THROWAWAY_ADDRESS); + initializeV2_2([], ""); ``` + 3. Verify that all fields in the FiatToken have been initialized correctly and have the expected values. See [README.validate.md](../validate/validate.js). ## Deploying a Proxy: -1. Obtain addresses for the various contract roles from CENTRE ops. The keys for - these addresses will be stored offline. The address needed are: +1. Obtain addresses for the following contract roles. Ensure that the keys for + these addresses are securely stored. ``` admin @@ -50,7 +55,7 @@ available, but can only be called once per proxy. of the deployed implementation contract to the constructor, which will initialize the `_implementation` field. -3. The `admin` of the proxy contract defaults to msg.sender. You must either +3. The `admin` of the proxy contract defaults to `msg.sender`. You must either change the `admin` now, or send the remaining transactions from a different address. The `admin` can only see methods in the Proxy, any method calls from `admin` will not be forwarded to the implementation contract. The `admin` @@ -59,47 +64,39 @@ available, but can only be called once per proxy. ``` changeAdmin(adminAddress) - ``` -4. Initialize the proxy, via the `initialize` method. This call will get +4. Initialize the proxy via the `initialize*` methods. This call will get forwarded to the implementation contract, but since it is via `delegatecall` it will run in the context of the Proxy contract, so the fields it is - initializing will be stored it the storage of the Proxy. The values passed + initializing will be stored in the storage of the Proxy. The values passed here are important, especially for the roles that will control the contract. - These addresses should be obtained from CENTRE ops, and the keys will be - stored offline. - ``` + ```js initialize( - "USD//C", - "USDC", - "USD", - 6, - masterMinterAddress, - pauserAddress, - blacklisterAddress, - ownerAddress - ) + tokenName, + tokenSymbol, + tokenCurrency, + tokenDecimals, + masterMinterAddress, + pauserAddress, + blacklisterAddress, + ownerAddress + ); + initializeV2(newTokenName); + initializeV2_1(lostAndFoundAddress); + initializeV2_2(accountsToBlacklist, newTokenSymbol); ``` 5. Verify the fields have been properly initialized. Verification should be performed independently by multiple people to make sure that the contract has been deployed correctly. The following fields should be verified: - - name, symbol, and currency are as expected - - `decimals` is 6 - - `masterMinter` is the expected address - - `pauser` is the expected address - - `blacklister` is the expected address - - `owner` is the expected address - - `admin` is the expected address. Note that `admin` is not callable by - anyone other than the admin, so this can be verified by calling - `eth.getStorageAt(proxyAddress, 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b)` - - `_implementation` is the address of the implementation contract. Note that - `implementation` is not callable by anyone other than the admin, so this - can be verified by calling - `eth.getStorageAt(proxyAddress, 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3)` + - `admin` is the expected address + - `implementation` is the address of the implementation contract + - `name`, `symbol`, `currency` and `decimals` are as expected + - `version` is 2 + - `owner`, `masterMinter`, `pauser`, `blacklister` are the expected addresses - `totalSupply` is 0 - `initialized` is `true` diff --git a/doc/masterminter.md b/doc/masterminter.md index 54b168f74..bf7245f2c 100644 --- a/doc/masterminter.md +++ b/doc/masterminter.md @@ -1,12 +1,12 @@ # MasterMinter contract The MasterMinter is a governance contract. It delegates the functionality of the -`masterMinter` role in the CENTRE USDC contract to multiple addresses. (The +`masterMinter` role in the Circle FiatToken contract to multiple addresses. (The `masterMinter` role can add and remove minters from a FiatToken and set their allowances.) The MasterMinter contract delegates the minter management capability to `controllers`. Each `controller` manages exactly one `minter`, and a single `minter` may be managed by multiple `controllers`. This allows -separation of duties (off-line key management) and simplifies nonce management +separation of duties (offline key management) and simplifies nonce management for warm transactions. Minters and FiatToken holders are not affected by replacing a `masterMinter` @@ -45,8 +45,8 @@ contract to call minter management functions on the FiatToken contract: Together, these four functions are defined as the `MinterManagementInterface`. The `MasterMinter` contains the address of a `minterManager` that implements the -`MinterManagementInterface`. The `MasterMinter` interacts with the USDC token -via the `minterManager`. +`MinterManagementInterface`. The `MasterMinter` interacts with the FiatToken +contract via the `minterManager`. When a `controller` calls a function on `MasterMinter`, the `MasterMinter` will call the appropriate function on the `FiatToken` contract on its behalf. Both @@ -108,13 +108,10 @@ We recommend assigning at least two `controllers` to each `minter`. - SecurityController. Use this `controller` to sign a single `removeMinter` transaction and store it for emergencies. -The private keys to the `AllowanceController` and `SecurityController` should -stay in cold storage. This configuration lets the Controller keep multiple warm -`incrementMinterAllowance` transactions on hand, as well as the `removeMinter` -transaction in case of a problem. Broadcasting the `removeMinter` transaction -will cause all future `incrementMinterAllowance` transactions to `throw`. Since -the two types of transactions are managed by different addresses, there is no -need to worry about nonce management. +This configuration allows the `removeMinter` transaction to be presigned as +nonces for the `SecurityController` are deterministic, which reduces the time to +respond when there's an issue. Broadcasting the `removeMinter` transaction will +cause all future interactions from the `AllowanceController` to `throw`. # MasterMinter vs. MintController diff --git a/doc/tokendesign.md b/doc/tokendesign.md index c0f405f94..7a986ffd3 100644 --- a/doc/tokendesign.md +++ b/doc/tokendesign.md @@ -1,6 +1,6 @@ -# CENTRE Fiat Token +# Circle's FiatToken Design -The CENTRE Fiat Token contract is an ERC-20 compatible token. It allows +Circle's FiatToken contract is an ERC-20 compatible token. It allows minting/burning of tokens by multiple entities, pausing all activity, freezing of individual addresses, and a way to upgrade the contract so that bugs can be fixed or features added. @@ -18,41 +18,44 @@ functionality: - `blacklister` - prevent all transfers to or from a particular address, and prevents that address from minting or burning - `owner` - re-assign any of the roles except for `admin` -- `admin` - upgrade the contract, and re-assign itself +- `admin` - manage the proxy-level functionalities such as switching the + implementation contract +- `rescuer` - transfer any ERC-20 tokens that are locked up in the contract -CENTRE will control the address of all roles except for minters, which will be -controlled by the entities that CENTRE elects to make minters +Circle will control the address of all roles. ## ERC-20 The `FiatToken` implements the standard methods of the ERC-20 interface with some changes: -- A blacklisted address will be unable to call `transfer`, `transferFrom`, or - `approve`, and will be unable to receive tokens. +- A blacklisted address will be unable to call `transfer` or `transferFrom`, and + will be unable to receive tokens. + - `approve` was not allowed for blacklisted addresses in FiatToken versions + <2.2 but available in versions 2.2+. See ["Blacklisting"](#blacklisting) + section for more details. - `transfer`, `transferFrom`, and `approve` will fail if the contract has been paused. ## Issuing and Destroying tokens -The Fiat Token allows multiple entities to create and destroy tokens. These -entities will have to be members of CENTRE, and will be vetted by CENTRE before -they are allowed to create new tokens. CENTRE will not mint any tokens itself, -it will approve members to mint and burn tokens. - -Each `minter` has a `mintingAllowance`, which CENTRE configures. The -`mintingAllowance` is how many tokens that minter may issue, and as a `minter` -issues tokens, its `mintingAllowance` declines. CENTRE will periodically reset -the `mintingAllowance` as long as a `minter` remains in good standing with -CENTRE and maintains adequate reserves for the tokens it has issued. The -`mintingAllowance` is to limit the damage if any particular `minter` is +The FiatToken contract allows multiple entities to create and destroy tokens. +These entities will have to be members of Circle, and will be vetted by Circle +before they are allowed to create new tokens. + +Each `minter` has a `minterAllowance`, which Circle configures. The +`minterAllowance` is how many tokens that minter may issue, and as a `minter` +issues tokens, its `minterAllowance` declines. Circle will periodically reset +the `minterAllowance` as long as a `minter` remains in good standing with Circle +and maintains adequate reserves for the tokens it has issued. The +`minterAllowance` is to limit the damage if any particular `minter` is compromised. ### Adding Minters -CENTRE adds minters via the `configureMinter` method. When a minter is -configured a `mintingAllowance` is specified, which is the number of tokens that -address is allowed to mint. As a `minter` mints tokens, the `mintingAllowance` +Circle adds minters via the `configureMinter` method. When a minter is +configured a `minterAllowance` is specified, which is the number of tokens that +address is allowed to mint. As a `minter` mints tokens, the `minterAllowance` will decline. - Only the `masterMinter` role may call configureMinter. @@ -60,13 +63,13 @@ will decline. ### Resetting Minting Allowance The `minters` will need their allowance reset periodically to allow them to -continue minting. When a `minter`'s allowance is low, CENTRE can make another -call to `configureMinter` to reset the `mintingAllowance` to a higher value. +continue minting. When a `minter`'s allowance is low, Circle can make another +call to `configureMinter` to reset the `minterAllowance` to a higher value. ### Removing Minters -CENTRE removes minters via the `removeMinter` method. This will remove the -`minter` from the list of `minters` and set its `mintingAllowance` to 0. Once a +Circle removes minters via the `removeMinter` method. This will remove the +`minter` from the list of `minters` and set its `minterAllowance` to 0. Once a `minter` is removed it will no longer be able to mint or burn tokens. - Only the `masterMinter` role may call `removeMinter`. @@ -76,7 +79,7 @@ CENTRE removes minters via the `removeMinter` method. This will remove the A `minter` mints tokens via the `mint` method. The `minter` specifies the `amount` of tokens to create, and a `_to` address which will own the newly created tokens. A `minter` may only mint an amount less than or equal to its -`mintingAllowance`. The `mintingAllowance` will decrease by the amount of tokens +`minterAllowance`. The `minterAllowance` will decrease by the amount of tokens minted, and the balance of the `_to` address and `totalSupply` will each increase by `amount`. @@ -93,11 +96,11 @@ A `minter` burns tokens via the `burn` method. The `minter` specifies the `amount` of tokens to burn, and the `minter` must have a `balance` greater than or equal to the `amount`. Burning tokens is restricted to `minter` addresses to avoid accidental burning of tokens by end users. A `minter` with a -`mintingAllowance` of 0 is allowed to burn tokens. A `minter` can only burn +`minterAllowance` of 0 is allowed to burn tokens. A `minter` can only burn tokens which it owns. When a minter burns tokens, its balance and the totalSupply are reduced by `amount`. -Burning tokens will not increase the mintingAllowance of the address doing the +Burning tokens will not increase the minterAllowance of the address doing the burning. - Only a minter may call burn. @@ -111,11 +114,19 @@ burning. ## Blacklisting Addresses can be blacklisted. A blacklisted address will be unable to transfer -tokens, approve, mint, or burn tokens. +tokens, mint, or burn tokens. + +In FiatToken versions <2.2, A blacklisted address is unable to call `approve`, +`increaseAllowance`, `decreaseAllowance`, or authorize future pull payments +using `permit`. Nor can it be authorized to pull payments from other addresses. +This has been changed in v2.2 where a blacklisted address can perform the above +functions. But they are still blocked from transferring the assets in any way. +and therefore any operations on modifying the allowance of blacklisted addresses +are considered meaningless. ### Adding a blacklisted address -CENTRE blacklists an address via the `blacklist` method. The specified `account` +Circle blacklists an address via the `blacklist` method. The specified `account` will be added to the blacklist. - Only the `blacklister` role may call `blacklist`. @@ -123,7 +134,7 @@ will be added to the blacklist. ### Removing a blacklisted address -CENTRE removes an address from the blacklist via the `unblacklist` method. The +Circle removes an address from the blacklist via the `unblacklist` method. The specified `account` will be removed from the blacklist. - Only the `blacklister` role may call `unblacklist`. @@ -136,11 +147,11 @@ serious key compromise. All transfers, minting, burning, and adding minters will be prevented while the contract is paused. Other functionality, such as modifying the blacklist, removing minters, changing roles, and upgrading will remain operational as those methods may be required to fix or mitigate the issue -that caused CENTRE to pause the contract. +that caused Circle to pause the contract. ### Pause -CENTRE will pause the contract via the `pause` method. This method will set the +Circle will pause the contract via the `pause` method. This method will set the paused flag to true. - Only the `pauser` role may call pause. @@ -149,7 +160,7 @@ paused flag to true. ### Unpause -CENTRE will unpause the contract via the `unpause` method. This method will set +Circle will unpause the contract via the `unpause` method. This method will set the `paused` flag to false. All functionality will be restored when the contract is unpaused. @@ -157,17 +168,44 @@ is unpaused. - Unpausing emits an `Unpause()` event +## Meta transactions compatibility + +### ERC-2612 + +The contract is compatible with +[ERC-2612](https://eips.ethereum.org/EIPS/eip-2612). Users may update their +ERC-20 allowances by signing a `permit` message and passing the signed message +to a relayer who will execute the on-chain transaction, instead of submitting a +transaction themselves. + +### ERC-3009 + +The contract is compatible with +[ERC-3009](https://eips.ethereum.org/EIPS/eip-3009). Users may transfer assets +to another user by signing an EIP-3009 authorization and passing the +authorization to a relayer who will execute the authorization on chain, instead +of submitting a transaction themselves. + +### Signature Validation schemes + +The contract supports signature validation via: + +1. ECDSA signatures for Externally Owned Accounts (EOAs) +2. [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) for ERC-1271 compatible + Smart Contract Wallets + ## Upgrading -The Fiat Token uses the zeppelinos Unstructured-Storage Proxy pattern -[https://docs.zeppelinos.org/docs/upgradeability_AdminUpgradeabilityProxy.html]. -[FiatTokenV1.sol](../contracts/FiatTokenV1.sol) is the implementation, the -actual token will be a Proxy contract -([FiatTokenProxy.sol](../contracts/FiatTokenProxy.sol)) which will forward all -calls to `FiatToken` via delegatecall. This pattern allows CENTRE to upgrade the -logic of any deployed tokens seamlessly. +The FiatTokenProxy contract uses the zeppelinos Unstructured-Storage Proxy +pattern +[https://github.com/zeppelinos/zos-lib/blob/8a16ef3ad17ec7430e3a9d2b5e3f39b8204f8c8d/contracts/upgradeability/AdminUpgradeabilityProxy.sol]. +[FiatTokenV2_2.sol](../contracts/v2/FiatTokenV2_2.sol) is the implementation, +the actual token will be a Proxy contract +([FiatTokenProxy.sol](../contracts/v1/FiatTokenProxy.sol)) which will forward +all calls to `FiatToken` via delegatecall. This pattern allows Circle to upgrade +the logic of any deployed tokens seamlessly. -- CENTRE will upgrade the token via a call to `upgradeTo` or `upgradeToAndCall` +- Circle will upgrade the token via a call to `upgradeTo` or `upgradeToAndCall` if initialization is required for the new version. - Only the `admin` role may call `upgradeTo` or `upgradeToAndCall`. @@ -200,3 +238,8 @@ reassign all roles (including itself) except for the `admin` role. - `transferOwnership` updates the `owner` role to a new address. - `transferOwnership` may only be called by the `owner` role. + +### Rescuer + +- `updateRescuer` updates the `rescuer` role to a new address. +- `updateRescuer` may only be called by the `owner` role. diff --git a/doc/upgrade.md b/doc/upgrade.md index ae7578789..386c58ede 100644 --- a/doc/upgrade.md +++ b/doc/upgrade.md @@ -8,11 +8,24 @@ token, and pointing an existing proxy to the upgraded token. An upgraded token can have: 1. New logic (functions) -2. New fields (data) -3. New logic and new fields +2. New state variables (data) +3. New logic and new state variables +4. Renamed state variables +5. Updated logic for existing functions Each situation is addressed in a section below. +> **_IMPORTANT_**: Do not remove existing state variables or modify the +> inheritance order of contracts. Storage addresses for contract states are +> defined during compilation and follow a sequential order based on the +> declaration of state variables. Removing a state variable may cause other +> variables to read/write from the wrong storage address which is dangerous. +> +> Be cautious when working with storage slots. Before upgrading, ensure that +> storage addresses for existing state variables have not changed. You may rely +> on [storageSlots.behavior.ts](../test/helpers/storageSlots.behavior.ts) to +> validate this behavior. + ### New Logic Only A template for the next upgraded contract for new logic is kept in /contracts @@ -20,7 +33,7 @@ with the file name FiatTokenV[X].sol where X is the version number. The upgraded contract _must_ inherit from the current contract. For example, if upgrading from version 1 to version 2, the contract would have the format: -``` +```solidity import './FiatTokenV1.sol'; /** @@ -38,29 +51,30 @@ All that remains is to add the new logic (functions) as part of the body _functions_ will not be inherited in subsequent contract versions and should be added with care. -### New Fields Only - -Adding new fields requires inheriting from the prior version of the contract as -done in [New Logic](#new-logic-only). In addition, the new contract requires -declaring new data fields and, if the data fields must be initialized to -non-default values, adding initialization logic for the new fields. New -variables added _must_ be declared as type `internal` or `public`, `private` can -never be used. Note that `private` _functions_ will also not be inherited in -subsequent contract versions and should be added with care. Also note that -inline initialization of variables as part of declaration has no effect as the -proxy never executes this code (for example, bool public newBool = true is not -in fact initialized to true). If possible, new fields should be added that can -start with default solidity values and do not need initialization. However, if -any new fields require initialization to non-default values, the new token must -add an _initialize_ function and a _initV[X]_ function, where X is the version -of the contract. The initialization function allows the contract to be deployed -from scratch and initialize all variables declared in the new contract and in -prior contracts. The initV[X] function allows the contract to initialize only -the new variables added in the new contract. A template is shown below for -upgrading from version 1 to version 2. In the example, we add variables newBool, -newAddress, and newUint, which would be replaced with the real variables added. - -``` +### New State Variables Only + +Adding new state variables requires inheriting from the prior version of the +contract as done in [New Logic](#new-logic-only). In addition, the new contract +requires declaring new state variables and, if the state variables must be +initialized to non-default values, adding initialization logic for the new state +variables. New variables added _must_ be declared as type `internal` or +`public`, `private` can never be used. Note that `private` _functions_ will also +not be inherited in subsequent contract versions and should be added with care. +Also note that inline initialization of variables as part of declaration has no +effect as the proxy never executes this code (for example, bool public newBool = +true is not in fact initialized to true). If possible, new state variables +should be added that can start with default Solidity values and do not need +initialization. However, if any new state variables require initialization to +non-default values, the new token must add an _initialize_ function and a +_initV[X]_ function, where X is the version of the contract. The initialization +function allows the contract to be deployed from scratch and initialize all +variables declared in the new contract and in prior contracts. The initV[X] +function allows the contract to initialize only the new variables added in the +new contract. A template is shown below for upgrading from version 1 to +version 2. In the example, we add variables newBool, newAddress, and newUint, +which would be replaced with the real variables added. + +```solidity import './FiatTokenV1.sol'; /** @@ -106,18 +120,63 @@ _Note the addition of a new initializedV[X] variable that is checked and set in initV[X]._ _Note the structure of initialized that uses a super call with previously set parameters as well as a call to initV[X]._ -### New Logic and New Fields +### New Logic and New State Variables + +The case requires the same steps as +[New State Variables](#new-state-variables-only) plus the addition of new +functions as done in [New Logic](#new-logic-only). + +### Updated Logic + +The logic in existing functions may be updated, but it should be done only if it +does not cause breaking changes to users of the contract and it is absolutely +necessary. This can be done by finding the function declaration in the existing +contracts, marking the function as `virtual`, and `override` the function in the +upgraded contract. + +```solidity +contract FiatTokenV1 { + ... + + function foo() external virtual pure returns (uint256) { + return 1; + } +} +``` + +```solidity +import './FiatTokenV1.sol'; + +/** + \* @title FiatTokenV2 + \* @dev ERC20 Token backed by fiat reserves + **/ +contract FiatTokenV2 is FiatTokenV1 { + ... + + function foo() external override pure returns (uint256) { + return 2; + } +} +``` + +### Renamed State Variables -The case requires the same steps as [New Fields](#new-fields-only) plus the -addition of new functions as done in [New Logic](#new-logic-only). +State variables may be renamed to increase clarity or readability. This may be +useful if there are state variables that have become unused but cannot be safely +removed. Deprecating the variable can be done by finding the variable +declaration in existing contracts, prefixing the variable with `deprecated` and +replacing references to the variable with the new name. ## Upgraded Token Deployment Deployment can be done in the following steps: -1. Write any new logic and new fields in the new contract (as described above) -2. Test any new fields and logic added to the contract (including positive, - negative, and extended tests following the current testing strategy) +1. Write any new logic and new state variables in the new contract (as described + above) +2. Test any new state variables and logic added to the contract (including + positive, negative, and extended tests following the current testing + strategy) 3. Ensure the test suite has run on the final version of the new contract with added tests and that the test suite passes with 100% code coverage 4. Complete any external audits as deemed necessary @@ -131,8 +190,8 @@ Deployment can be done in the following steps: ## Upgrading the Proxy to point to the UpgradedToken The proxy must be pointed to the new upgraded token. This is accomplished two -ways depending on whether only new logic was added or if new fields (and -possibly new logic) were added. +ways depending on whether only new logic was added or if new state variables +(and possibly new logic) were added. ### Upgrading if _ONLY_ New Logic Added @@ -140,30 +199,20 @@ possibly new logic) were added. address of the new upgraded token. 2. Broadcast the transaction 3. Check that the implementation field of the proxy matches the address of the - upgraded token by calling web3.eth.getStorageAt(proxy.address, implSlot), - where implSlot is defined in the contract as a hardcoded field. As of CENTRE - Fiat Token v1.0.0 that slot is - 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b. - Alternatively, getImplementation may be called on the proxy with the - adminAccount. + upgraded token by calling the `implementation` method 4. If the address in 3) does not match, it is likely a wrong address was used. Repeat the process from step 1). -### Upgrading if New Fields (and possibly new Logic) Added +### Upgrading if New State Variables (and possibly new logic) Added 1. Prepare an upgradeToAndCall transaction from the adminAccount parameterized with the address of the new upgraded token and an internal call to invoke - initV[X] with the new data fields. + initV[X] with the new data state variables. 2. Broadcast the transaction 3. Check that the implementation field of the proxy matches the address of the - upgraded token by calling web3.eth.getStorageAt(proxy.address, implSlot), - where implSlot is defined in the contract as a hardcoded field. As of CENTRE - Fiat Token v1.0.0 that slot is - 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b. - Alternatively, getImplementation may be called on the proxy with the admin - account. + upgraded token by calling the `implementation` method 4. If the address in 3) does not match, it is likely a wrong address was used. Repeat the process from step 1). -5. Verify that the new fields were set correctly as done in _Deployment +5. Verify that the new state variables were set correctly as done in _Deployment Instructions_ [verification](deployment.md) 6. If verification fails, restart the process from step 1) diff --git a/doc/v2.1_upgrade.md b/doc/v2.1_upgrade.md index 0229a2a89..b8f8e5c68 100644 --- a/doc/v2.1_upgrade.md +++ b/doc/v2.1_upgrade.md @@ -11,11 +11,28 @@ with the correct values. The environment variables `PROXY_ADMIN_ADDRESS`, `PROXY_CONTRACT_ADDRESS`, and `LOST_AND_FOUND_ADDRESS` must be defined. -2. Run Truffle migrations using the Deployer Key, and get the address of the - newly deployed `V2_1Upgrader` contract. +2. Set the `NETWORK` variable to the network that you will like to deploy to in + your terminal. Ensure that the `NETWORK` that the contracts are to be + deployed to are defined in [`./truffle-config.js`](../truffle-config.js). + + ```sh + $ NETWORK=; + ``` + +3. Look for the `deploy_v2_1` and `deploy_v2_1_upgrader` scripts in + [`./migrations/`](../migrations/). Set the `MIGRATION_START` and + `MIGRATION_END` variables based off the migration numbers of these scripts. + ```sh + $ MIGRATION_START= + $ MIGRATION_END= ``` - $ yarn migrate --network mainnet --f 5 --to 6 + +4. Run Truffle migrations using the Deployer Key, and get the address of the + newly deployed `V2_1Upgrader` contract. + + ```sh + $ yarn migrate --network ${NETWORK} --f ${MIGRATION_START} --to ${MIGRATION_END} ... ... Dry-run successful. Do you want to proceed with real deployment? >> (y/n): y @@ -24,17 +41,18 @@ >>>>>>> Deployed V2_1Upgrader at 0x12345678 <<<<<<< ``` -3. Verify that the upgrader contract is deployed correctly. Verify that the +5. Verify that the upgrader contract is deployed correctly. Verify that the values returned by `proxy()`, `implementation()`, `newProxyAdmin()`, and `lostAndFound()` on the `V2_1Upgrader` contract are correct. -4. Using the Admin Key, transfer the proxy admin role to the `V2_1Upgrader` +6. Using the Admin Key, transfer the proxy admin role to the `V2_1Upgrader` contract address by calling `changeAdmin(address)` method on the `FiatTokenProxy` contract. -5. Send 0.20 USDC to the `V2_1Upgrader` contract address. (200,000 tokens) +7. Send 0.20 FiatToken (eg USDC) to the `V2_1Upgrader` contract address. + (200,000 tokens) -6. Using the Deployer Key, call `upgrade()` (`0xd55ec697`) method on the +8. Using the Deployer Key, call `upgrade()` (`0xd55ec697`) method on the `V2_1Upgrader`. #### IF THE UPGRADE TRANSACTION SUCCEEDS diff --git a/doc/v2.2_upgrade.md b/doc/v2.2_upgrade.md new file mode 100644 index 000000000..35c2028cd --- /dev/null +++ b/doc/v2.2_upgrade.md @@ -0,0 +1,181 @@ +# V2.2 Upgrade + +### Prerequisites + +1. Truffle Deployer Key ("Deployer Key") +2. Proxy Admin Key ("Admin Key") +3. A list of currently blacklisted accounts stored in `blacklist.remote.json` + +### Preparation + +1. Get the contract creation block number for the target FiatTokenProxy contract + either using a block explorer, or the command below. + + ```sh + $ yarn truffle exec scripts/getContractCreationBlock.js ${FiatTokenProxy address} --network ${NETWORK} + ``` + +2. Get a list of accounts that are currently blacklisted on the target + FiatTokenProxy contract by running the following command. `startBlockNumber` + should be set to the contract creation block number of the target + FiatTokenProxy contract. + + ```sh + $ yarn truffle exec scripts/getBlacklistedAccounts.js ${FiatTokenProxy address} ${startBlockNumber} --network ${NETWORK} + ``` + +### Steps + +1. Ensure that the `config.js` file in the project root folder is configured + with the correct values. The environment variables `PROXY_ADMIN_ADDRESS`, + `PROXY_CONTRACT_ADDRESS` must be defined. + +2. Set the `NETWORK` variable to the network that you will like to deploy to in + your terminal. Ensure that the `NETWORK` that the contracts are to be + deployed to are defined in [`./truffle-config.js`](../truffle-config.js). + + ```sh + $ NETWORK=; + ``` + +3. Look for the `deploy_v2_2` and `deploy_v2_2_upgrader` scripts in + [`./migrations/`](../migrations/). Set the `MIGRATION_START` and + `MIGRATION_END` variables based off the migration numbers of these scripts. + + ```sh + $ MIGRATION_START= + $ MIGRATION_END= + ``` + +4. Ensure that the `blacklist.remote.json` file in the project root folder is + configured with the correct list of addresses to blacklist. + +5. Run Truffle migrations using the Deployer Key, and get the address of the + newly deployed `V2_2Upgrader` contract. + + ```sh + $ yarn migrate --network ${NETWORK} --f ${MIGRATION_START} --to ${MIGRATION_END} + ... + ... + Dry-run successful. Do you want to proceed with real deployment? >> (y/n): y + ... + ... + >>>>>>> Deployed V2_2Upgrader at 0x12345678 <<<<<<< + ``` + +6. Verify that the upgrader contract is deployed correctly. Verify that the + values returned by `proxy()`, `implementation()` and `newProxyAdmin()` on the + `V2_2Upgrader` contract are correct either using a block explorer, or the + command below. + + ```sh + $ yarn compile + $ yarn truffle exec scripts/callContractROFunctions.js --network ${NETWORK} \ + --contract-name V2_2Upgrader --contract-address ${V2_2Upgrader address} \ + proxy implementation newProxyAdmin + ``` + +7. Verify that the `V2_2UpgraderHelper` contract is deployed correctly. Retrieve + the address from the `V2_2Upgrader` contract `helper()` method, and verify + that the return values of each view methods correspond with the + `FiatTokenProxy` contract to be upgraded either using a block explorer, or + the command below. + + ```sh + $ yarn compile + $ yarn truffle exec scripts/callContractROFunctions.js --network ${NETWORK} \ + --contract-name V2_2Upgrader --contract-address ${V2_2Upgrader address} \ + helper + $ yarn truffle exec scripts/callContractROFunctions.js --network ${NETWORK} \ + --contract-name V2_2UpgraderHelper --contract-address ${V2_2UpgraderHelper address} \ + name symbol decimals currency masterMinter fiatTokenOwner pauser blacklister version DOMAIN_SEPARATOR rescuer paused totalSupply + + # Compare results above with + $ yarn truffle exec scripts/callContractROFunctions.js --network ${NETWORK} \ + --contract-name FiatTokenV2_1 --contract-address ${FiatTokenProxy address} \ + name symbol decimals currency masterMinter fiatTokenOwner pauser blacklister version DOMAIN_SEPARATOR rescuer paused totalSupply + ``` + +8. Verify that the list of accounts to blacklist is correct, and is set + correctly in the upgrader contract. Run the following command to check the + list. + + ```sh + $ yarn truffle exec scripts/validateAccountsToBlacklist.js ${FiatTokenProxy address} ${V2_2Upgrader address} --network=${NETWORK} + ``` + +9. Using the Admin Key, transfer the proxy admin role to the `V2_2Upgrader` + contract address by calling `changeAdmin(address)` method on the + `FiatTokenProxy` contract. + +10. Send 0.20 FiatToken (eg USDC) to the `V2_2Upgrader` contract address. + (200,000 tokens) + +11. Using the Deployer Key, call `upgrade()` (`0xd55ec697`) method on the + `V2_2Upgrader`. + +#### IF THE UPGRADE TRANSACTION SUCCEEDS + +- Verify that the proxy admin role is transferred back to the Admin Key. +- No further action needed. + +#### IF THE UPGRADE TRANSACTION FAILS + +- If the transaction fails, any state change that happened during the `upgrade` + function call will be reverted. +- Call `abortUpgrade()` (`0xd8f6a8f6`) method on the `V2_2Upgrader` contract to + tear it down. + +### Optional - Testing support for ERC-1271 compatible wallets + +FiatToken version 2.2 supports signature validation on the +[ERC-2612](https://eips.ethereum.org/EIPS/eip-2612) and +[ERC-3009](https://eips.ethereum.org/EIPS/eip-3009) features for +[ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) compatible wallets. You may +test this with a sample ERC-1271 wallet to the network. + +#### Preparation + +1. Prepare a FiatToken version 2.2 contract for testing. If a FiatToken contract + has never been deployed to the network, follow the steps in the + [deployment doc](./deployment.md) to deploy the contract to the network. + Otherwise, follow the [steps](#steps) above to upgrade your FiatToken + contract to version 2.2. +2. Prepare an address A (Wallet Owner Address) that you own the private key to. + This address does not require any chain-native token (e.g. ETH) for gas + usage. +3. Prepare an address B (Relayer Address) that you own the private key to. Add + some chain-native token (e.g. ETH) to this address to pay for gas. + +#### Instructions + +1. Look for the `deploy_erc1271_wallet` scripts in + [`./migrations/`](../migrations/). Set the `MIGRATION_START` and + `MIGRATION_END` variables based off the migration numbers of these scripts. + + ```sh + $ MIGRATION_START= + $ MIGRATION_END= + ``` + +2. Set the `MOCK_ERC1271_WALLET_OWNER_ADDRESS` in your `config.js` file to + address A. +3. Run Truffle migrations using the Deployer Key, and get the address of the + newly deployed `MockERC1271Wallet` contract. + ```sh + $ yarn migrate --network ${NETWORK} --f ${MIGRATION_START} --to ${MIGRATION_END} + ... + ... + Dry-run successful. Do you want to proceed with real deployment? >> (y/n): y + ... + ... + >>>>>>> Deployed MockERC1271Wallet at 0x12345678 <<<<<<< + ``` +4. Generate a `permit` transaction signature using address A. This transaction + signature would update the allowance of a designated spender to pull funds + from the deployed smart contract wallet (MockERC1271Wallet). +5. Broadcast the signed transaction using address B. You may rely on public + tools ([example for ETH mainnet](https://etherscan.io/pushTx)) to complete + this step. +6. The transaction should succeed and the allowance should also be updated. You + may validate these using a block explorer. diff --git a/doc/v2_upgrade.md b/doc/v2_upgrade.md index 2a7fd2233..5e4e3e082 100644 --- a/doc/v2_upgrade.md +++ b/doc/v2_upgrade.md @@ -10,12 +10,29 @@ 1. Ensure `config.js` file in the project root folder is configured correctly with correct values. -2. Run Truffle migrations using the Deployer Key, and get the address of the - newly deployed `V2Upgrader` contract. The address is highlighted (`>>><<<`) - to prevent accidental copying-and-pasting of an incorrect address. +2. Set the `NETWORK` variable to the network that you will like to deploy to in + your terminal. Ensure that the `NETWORK` that the contracts are to be + deployed to are defined in [`./truffle-config.js`](../truffle-config.js). + ```sh + $ NETWORK=; ``` - $ yarn migrate --network mainnet --f 3 --to 4 + +3. Look for the `deploy_v2` and `deploy_v2_upgrader` scripts in + [`./migrations/`](../migrations/). Set the `MIGRATION_START` and + `MIGRATION_END` variables based off the migration numbers of these scripts. + + ```sh + $ MIGRATION_START= + $ MIGRATION_END= + ``` + +4. Run Truffle migrations using the Deployer Key, and get the address of the + newly deployed`V2Upgrader`contract. The address is highlighted (`>>><<<`) to + prevent accidental copying-and-pasting of an incorrect address. + + ```sh + $ yarn migrate --network ${NETWORK} --f ${MIGRATION_START} --to ${MIGRATION_END} ... ... Dry-run successful. Do you want to proceed with real deployment? >> (y/n): y @@ -24,17 +41,18 @@ >>>>>>> Deployed V2Upgrader at 0x12345678 <<<<<<< ``` -3. Verify that the upgrader contract is deployed correctly. Verify that the +5. Verify that the upgrader contract is deployed correctly. Verify that the values returned by `proxy()`, `implementation()`, `newProxyAdmin()`, and `newName()` on the `V2Upgrader` contract are correct. -4. Using the Admin Key, transfer the proxy admin role to the `V2Upgrader` +6. Using the Admin Key, transfer the proxy admin role to the `V2Upgrader` contract address by calling `changeAdmin(address)` method on the `FiatTokenProxy` contract. -5. Send 0.20 USDC to the `V2Upgrader` contract address. (200,000 tokens) +7. Send 0.20 FiatToken (eg USDC) to the `V2Upgrader` contract address. (200,000 + tokens) -6. Using the Deployer Key, call `upgrade()` (`0xd55ec697`) method on the +8. Using the Deployer Key, call `upgrade()` (`0xd55ec697`) method on the `V2Upgrader`. #### IF THE UPGRADE TRANSACTION SUCCEEDS diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index a79331bbc..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: '2.1' -services: - -################################## -### Ganache (ethereum-testrpc) ### -################################## - ganache: - build: - context: . - dockerfile: Dockerfile.ganache - ports: - - "8545:8545" - -################################## -### Truffle ### -################################## - truffle: - build: - context: . - dockerfile: Dockerfile.truffle - volumes: - - ./:/usr/local/solidity - working_dir: /usr/local/solidity - command: compile - depends_on: - - "ganache" - diff --git a/echidna_tests/negative.sol b/echidna_tests/negative.sol index 51c6f1f84..a35487bd8 100644 --- a/echidna_tests/negative.sol +++ b/echidna_tests/negative.sol @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + pragma solidity ^0.4.24; import "contracts/FiatTokenV1.sol"; diff --git a/echidna_tests/positive.sol b/echidna_tests/positive.sol index e9caad699..7945ca3d9 100644 --- a/echidna_tests/positive.sol +++ b/echidna_tests/positive.sol @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + pragma solidity ^0.4.24; import "contracts/FiatTokenV1.sol"; diff --git a/migrations/1_initial_migration.js b/migrations/1_initial_migration.js deleted file mode 100644 index 4d19593c3..000000000 --- a/migrations/1_initial_migration.js +++ /dev/null @@ -1,5 +0,0 @@ -const Migrations = artifacts.require("Migrations"); - -module.exports = async (deployer) => { - await deployer.deploy(Migrations); -}; diff --git a/migrations/5_deploy_v2_1.js b/migrations/5_deploy_v2_1.js deleted file mode 100644 index fad712380..000000000 --- a/migrations/5_deploy_v2_1.js +++ /dev/null @@ -1,47 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const some = require("lodash/some"); - -const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); -const FiatTokenProxy = artifacts.require("FiatTokenProxy"); - -const THROWAWAY_ADDRESS = "0x0000000000000000000000000000000000000001"; - -let proxyContractAddress = ""; - -// Read config file if it exists -if (fs.existsSync(path.join(__dirname, "..", "config.js"))) { - ({ PROXY_CONTRACT_ADDRESS: proxyContractAddress } = require("../config.js")); -} - -module.exports = async (deployer, network) => { - if ( - !proxyContractAddress || - some(["development", "coverage"], (v) => network.includes(v)) - ) { - proxyContractAddress = (await FiatTokenProxy.deployed()).address; - } - - console.log(`FiatTokenProxy: ${proxyContractAddress}`); - - console.log("Deploying FiatTokenV2_1 implementation contract..."); - await deployer.deploy(FiatTokenV2_1); - - const fiatTokenV2_1 = await FiatTokenV2_1.deployed(); - console.log("Deployed FiatTokenV2_1 at", fiatTokenV2_1.address); - console.log( - "Initializing FiatTokenV2_1 implementation contract with dummy values..." - ); - await fiatTokenV2_1.initialize( - "", - "", - "", - 0, - THROWAWAY_ADDRESS, - THROWAWAY_ADDRESS, - THROWAWAY_ADDRESS, - THROWAWAY_ADDRESS - ); - await fiatTokenV2_1.initializeV2(""); - await fiatTokenV2_1.initializeV2_1(THROWAWAY_ADDRESS); -}; diff --git a/migrations/7_deploy_master_minter.js b/migrations/7_deploy_master_minter.js deleted file mode 100644 index 706a10b5a..000000000 --- a/migrations/7_deploy_master_minter.js +++ /dev/null @@ -1,34 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const MasterMinter = artifacts.require("MasterMinter.sol"); -const FiatTokenProxy = artifacts.require("FiatTokenProxy.sol"); -let masterMinterAddress = ""; -let fiatTokenAddress = ""; - -// Read config file if it exists -if (fs.existsSync(path.join(__dirname, "..", "config.js"))) { - ({ - MASTERMINTER_ADDRESS: masterMinterAddress, - PROXY_CONTRACT_ADDRESS: fiatTokenAddress, - } = require("../config.js")); -} - -module.exports = function (deployer, network) { - if (network === "development" || network === "coverage") { - // Change these if deploying for real, these are deterministic - // address from ganache - masterMinterAddress = "0x3e5e9111ae8eb78fe1cc3bb8915d5d461f3ef9a9"; - fiatTokenAddress = FiatTokenProxy.address; - } - console.log("deploying MasterMinter for fiat token at " + fiatTokenAddress); - deployer - .deploy(MasterMinter, fiatTokenAddress) - .then(function (mm) { - console.log("master minter deployed at " + mm.address); - console.log("reassigning owner to " + masterMinterAddress); - return mm.transferOwnership(masterMinterAddress); - }) - .then(function () { - console.log("All done."); - }); -}; diff --git a/migrations/direct/1_initial_migration.js b/migrations/direct/1_initial_migration.js new file mode 100644 index 000000000..c4913384a --- /dev/null +++ b/migrations/direct/1_initial_migration.js @@ -0,0 +1,23 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const Migrations = artifacts.require("Migrations"); + +module.exports = async (deployer) => { + await deployer.deploy(Migrations); +}; diff --git a/migrations/direct/2_deploy_implementation_and_proxy.js b/migrations/direct/2_deploy_implementation_and_proxy.js new file mode 100644 index 000000000..5b0cebe5c --- /dev/null +++ b/migrations/direct/2_deploy_implementation_and_proxy.js @@ -0,0 +1,179 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require("fs"); +const path = require("path"); + +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const MasterMinter = artifacts.require("MasterMinter"); +const SignatureChecker = artifacts.require("SignatureChecker"); + +const THROWAWAY_ADDRESS = "0x0000000000000000000000000000000000000001"; + +let proxyAdminAddress = ""; +let ownerAddress = ""; +let pauserAddress = ""; +let blacklisterAddress = ""; +let lostAndFoundAddress = ""; +let masterMinterOwnerAddress = ""; +let fiatTokenImplementationAddress = ""; +let tokenName = ""; +let tokenSymbol = ""; +let tokenCurrency = ""; +let tokenDecimals = ""; + +// Read config file if it exists +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + PROXY_ADMIN_ADDRESS: proxyAdminAddress, + OWNER_ADDRESS: ownerAddress, + PAUSER_ADDRESS: pauserAddress, + BLACKLISTER_ADDRESS: blacklisterAddress, + LOST_AND_FOUND_ADDRESS: lostAndFoundAddress, + MASTERMINTER_OWNER_ADDRESS: masterMinterOwnerAddress, + FIAT_TOKEN_IMPLEMENTATION_ADDRESS: fiatTokenImplementationAddress, + TOKEN_NAME: tokenName, + TOKEN_SYMBOL: tokenSymbol, + TOKEN_CURRENCY: tokenCurrency, + TOKEN_DECIMALS: tokenDecimals, + } = require("../../config.js")); +} + +/** + * A utility script to directly deploy Fiat Token contract with the latest implementation + * + * Note: The proxy needs to be deployed before the master minter; the proxy cannot + * be initialized until the master minter is deployed. + */ +module.exports = async (deployer, network) => { + if (!proxyAdminAddress || !ownerAddress || !masterMinterOwnerAddress) { + throw new Error( + "PROXY_ADMIN_ADDRESS, OWNER_ADDRESS, and MASTERMINTER_OWNER_ADDRESS must be provided in config.js" + ); + } + + if (!pauserAddress || !blacklisterAddress || !lostAndFoundAddress) { + if (network === "mainnet") { + throw new Error( + "PAUSER_ADDRESS, BLACKLISTER_ADDRESS and LOST_AND_FOUND_ADDRESS must be provided in config.js" + ); + } else { + // If we're not on mainnet, let the user values dictate this. + pauserAddress = pauserAddress || ownerAddress; + blacklisterAddress = blacklisterAddress || ownerAddress; + lostAndFoundAddress = lostAndFoundAddress || ownerAddress; + } + } + + console.log(`Proxy Admin: ${proxyAdminAddress}`); + console.log(`Owner: ${ownerAddress}`); + console.log(`Pauser: ${pauserAddress}`); + console.log(`Blacklister: ${blacklisterAddress}`); + console.log(`Lost and Found: ${lostAndFoundAddress}`); + console.log(`Master Minter Owner: ${masterMinterOwnerAddress}`); + console.log( + `FiatTokenImplementationAddress: ${fiatTokenImplementationAddress}` + ); + + // If there is an existing implementation contract, + // we can simply point the newly deployed proxy contract to it. + // Otherwise, deploy the latest implementation contract code to the network. + if (!fiatTokenImplementationAddress) { + console.log("Deploying and linking SignatureChecker library contract..."); + await deployer.deploy(SignatureChecker); + await deployer.link(SignatureChecker, FiatTokenV2_2); + + console.log("Deploying implementation contract..."); + await deployer.deploy(FiatTokenV2_2); + const fiatTokenV2_2 = await FiatTokenV2_2.deployed(); + console.log("Deployed implementation contract at", FiatTokenV2_2.address); + + console.log("Initializing implementation contract with dummy values..."); + // These values are dummy values because we only rely on the implementation + // deployment for delegatecall logic, not for actual state storage. + await fiatTokenV2_2.initialize( + "", + "", + "", + 0, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS + ); + await fiatTokenV2_2.initializeV2(""); + await fiatTokenV2_2.initializeV2_1(THROWAWAY_ADDRESS); + await fiatTokenV2_2.initializeV2_2([], ""); + + fiatTokenImplementationAddress = FiatTokenV2_2.address; + } + + console.log("Deploying proxy contract..."); + await deployer.deploy(FiatTokenProxy, fiatTokenImplementationAddress); + const fiatTokenProxy = await FiatTokenProxy.deployed(); + console.log("Deployed proxy contract at", FiatTokenProxy.address); + + // Now that the proxy contract has been deployed, we can deploy the master minter. + console.log("Deploying master minter..."); + await deployer.deploy(MasterMinter, FiatTokenProxy.address); + const masterMinter = await MasterMinter.deployed(); + console.log("Deployed master minter at", MasterMinter.address); + + // Change the master minter to be owned by the master minter owner + console.log("Reassigning master minter owner..."); + await masterMinter.transferOwnership(masterMinterOwnerAddress); + + // Now that the master minter is set up, we can go back to setting up the proxy and + // implementation contracts. + console.log("Reassigning proxy contract admin..."); + // Need to change admin first, or the call to initialize won't work + // since admin can only call methods in the proxy, and not forwarded methods + await fiatTokenProxy.changeAdmin(proxyAdminAddress); + + console.log("Initializing proxy contract..."); + + // Do the initial (V1) initialization. + // Note that this takes in the master minter contract's address as the master minter. + // The master minter contract's owner is a separate address. + const proxyAsV2_2 = await FiatTokenV2_2.at(FiatTokenProxy.address); + await proxyAsV2_2.initialize( + tokenName, + tokenSymbol, + tokenCurrency, + tokenDecimals, + masterMinter.address, + pauserAddress, + blacklisterAddress, + ownerAddress + ); + + // Do the V2 initialization + console.log("Initializing V2..."); + await proxyAsV2_2.initializeV2(tokenName); + + // Do the V2_1 initialization + console.log("Initializing V2.1..."); + await proxyAsV2_2.initializeV2_1(lostAndFoundAddress); + + // Do the V2_2 initialization + console.log("Initializing V2.2..."); + await proxyAsV2_2.initializeV2_2([], tokenSymbol); + + console.log("Deployment step 2 finished"); +}; diff --git a/migrations/versioned/10_deploy_master_minter.js b/migrations/versioned/10_deploy_master_minter.js new file mode 100644 index 000000000..af16f0c8b --- /dev/null +++ b/migrations/versioned/10_deploy_master_minter.js @@ -0,0 +1,58 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require("fs"); +const path = require("path"); +const MasterMinter = artifacts.require("MasterMinter.sol"); +const FiatTokenProxy = artifacts.require("FiatTokenProxy.sol"); +let masterMinterOwnerAddress = ""; +let fiatTokenAddress = ""; + +// Read config file if it exists +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + MASTERMINTER_OWNER_ADDRESS: masterMinterOwnerAddress, + PROXY_CONTRACT_ADDRESS: fiatTokenAddress, + } = require("../../config.js")); +} + +module.exports = async (deployer, network) => { + if (network === "development" || network === "coverage") { + // Change these if deploying for real, these are deterministic + // address from ganache + masterMinterOwnerAddress = "0x3e5e9111ae8eb78fe1cc3bb8915d5d461f3ef9a9"; + fiatTokenAddress = FiatTokenProxy.address; + } + + console.log( + `Deploying MasterMinter for fiat token at ${fiatTokenAddress}...` + ); + + await deployer.deploy(MasterMinter, fiatTokenAddress); + const masterMinter = await MasterMinter.deployed(); + + console.log( + `>>>>>>> Deployed MasterMinter at ${masterMinter.address} <<<<<<<` + ); + console.log( + `Reassigning MasterMinter owner to ${masterMinterOwnerAddress}...` + ); + + await masterMinter.transferOwnership(masterMinterOwnerAddress); + console.log("All done."); +}; diff --git a/migrations/versioned/1_initial_migration.js b/migrations/versioned/1_initial_migration.js new file mode 100644 index 000000000..c4913384a --- /dev/null +++ b/migrations/versioned/1_initial_migration.js @@ -0,0 +1,23 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const Migrations = artifacts.require("Migrations"); + +module.exports = async (deployer) => { + await deployer.deploy(Migrations); +}; diff --git a/migrations/2_deploy_v1.js b/migrations/versioned/2_deploy_v1.js similarity index 60% rename from migrations/2_deploy_v1.js rename to migrations/versioned/2_deploy_v1.js index f6d2865ca..05c986fb6 100644 --- a/migrations/2_deploy_v1.js +++ b/migrations/versioned/2_deploy_v1.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const fs = require("fs"); const path = require("path"); const some = require("lodash/some"); @@ -12,16 +30,24 @@ let ownerAddress = ""; let masterMinterAddress = ""; let pauserAddress = ""; let blacklisterAddress = ""; +let tokenName = ""; +let tokenSymbol = ""; +let tokenCurrency = ""; +let tokenDecimals = 0; // Read config file if it exists -if (fs.existsSync(path.join(__dirname, "..", "config.js"))) { +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { ({ PROXY_ADMIN_ADDRESS: proxyAdminAddress, OWNER_ADDRESS: ownerAddress, MASTERMINTER_ADDRESS: masterMinterAddress, PAUSER_ADDRESS: pauserAddress, BLACKLISTER_ADDRESS: blacklisterAddress, - } = require("../config.js")); + TOKEN_NAME: tokenName, + TOKEN_SYMBOL: tokenSymbol, + TOKEN_CURRENCY: tokenCurrency, + TOKEN_DECIMALS: tokenDecimals, + } = require("../../config.js")); } module.exports = async (deployer, network) => { @@ -34,23 +60,35 @@ module.exports = async (deployer, network) => { masterMinterAddress = "0x3E5e9111Ae8eB78Fe1CC3bb8915d5D461F3Ef9A9"; pauserAddress = "0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E"; blacklisterAddress = "0xd03ea8624C8C5987235048901fB614fDcA89b117"; + tokenName = "USD//C"; + tokenSymbol = "USDC"; + tokenCurrency = "USD"; + tokenDecimals = 6; } - console.log(`Proxy Admin: ${proxyAdminAddress}`); - console.log(`Owner: ${ownerAddress}`); - console.log(`Master Minter: ${masterMinterAddress}`); - console.log(`Pauser: ${pauserAddress}`); - console.log(`Blacklister: ${blacklisterAddress}`); + console.log(`Proxy Admin: ${proxyAdminAddress}`); + console.log(`Owner: ${ownerAddress}`); + console.log(`Master Minter: ${masterMinterAddress}`); + console.log(`Pauser: ${pauserAddress}`); + console.log(`Blacklister: ${blacklisterAddress}`); + console.log(`Token Name: ${tokenName}`); + console.log(`Token Symbol: ${tokenSymbol}`); + console.log(`Token Currency: ${tokenCurrency}`); + console.log(`Token Decimals: ${tokenDecimals}`); if ( !proxyAdminAddress || !ownerAddress || !masterMinterAddress || !pauserAddress || - !blacklisterAddress + !blacklisterAddress || + !tokenName || + !tokenSymbol || + !tokenCurrency || + !tokenDecimals ) { throw new Error( - "PROXY_ADMIN_ADDRESS, OWNER_ADDRESS, MASTERMINTER_ADDRESS, PAUSER_ADDRESS, and BLACKLISTER_ADDRESS must be provided in config.js" + "PROXY_ADMIN_ADDRESS, OWNER_ADDRESS, MASTERMINTER_ADDRESS, PAUSER_ADDRESS, BLACKLISTER_ADDRESS, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_CURRENCY, and TOKEN_DECIMALS must be provided in config.js" ); } @@ -86,10 +124,10 @@ module.exports = async (deployer, network) => { // proxy will forward all the calls to the FiatTokenV1 impl const proxyAsV1 = await FiatTokenV1.at(FiatTokenProxy.address); await proxyAsV1.initialize( - "USD//C", - "USDC", - "USD", - 6, + tokenName, + tokenSymbol, + tokenCurrency, + tokenDecimals, masterMinterAddress, pauserAddress, blacklisterAddress, diff --git a/migrations/3_deploy_v2.js b/migrations/versioned/3_deploy_v2.js similarity index 51% rename from migrations/3_deploy_v2.js rename to migrations/versioned/3_deploy_v2.js index 8062ab8d4..0fcc44a2b 100644 --- a/migrations/3_deploy_v2.js +++ b/migrations/versioned/3_deploy_v2.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const fs = require("fs"); const path = require("path"); const some = require("lodash/some"); @@ -5,14 +23,17 @@ const some = require("lodash/some"); const FiatTokenV2 = artifacts.require("FiatTokenV2"); const FiatTokenProxy = artifacts.require("FiatTokenProxy"); const FiatTokenUtil = artifacts.require("FiatTokenUtil"); +const SignatureChecker = artifacts.require("SignatureChecker"); const THROWAWAY_ADDRESS = "0x0000000000000000000000000000000000000001"; let proxyContractAddress = ""; // Read config file if it exists -if (fs.existsSync(path.join(__dirname, "..", "config.js"))) { - ({ PROXY_CONTRACT_ADDRESS: proxyContractAddress } = require("../config.js")); +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + PROXY_CONTRACT_ADDRESS: proxyContractAddress, + } = require("../../config.js")); } module.exports = async (deployer, network) => { @@ -25,11 +46,20 @@ module.exports = async (deployer, network) => { console.log(`FiatTokenProxy: ${proxyContractAddress}`); + console.log("Deploying and linking SignatureChecker library contract..."); + await deployer.deploy(SignatureChecker); + await deployer.link(SignatureChecker, FiatTokenV2); + console.log("Deploying FiatTokenV2 implementation contract..."); await deployer.deploy(FiatTokenV2); const fiatTokenV2 = await FiatTokenV2.deployed(); console.log("Deployed FiatTokenV2 at", fiatTokenV2.address); + + // Initializing the implementation contract with dummy values here prevents + // the contract from being reinitialized later on with different values. + // Dummy values can be used here as the proxy contract will store the actual values + // for the deployed token. console.log( "Initializing FiatTokenV2 implementation contract with dummy values..." ); diff --git a/migrations/4_deploy_v2_upgrader.js b/migrations/versioned/4_deploy_v2_upgrader.js similarity index 56% rename from migrations/4_deploy_v2_upgrader.js rename to migrations/versioned/4_deploy_v2_upgrader.js index 8bace174d..41eaf43a2 100644 --- a/migrations/4_deploy_v2_upgrader.js +++ b/migrations/versioned/4_deploy_v2_upgrader.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const fs = require("fs"); const path = require("path"); const some = require("lodash/some"); @@ -8,13 +26,15 @@ const V2Upgrader = artifacts.require("V2Upgrader"); let proxyAdminAddress = ""; let proxyContractAddress = ""; +let tokenName = ""; // Read config file if it exists -if (fs.existsSync(path.join(__dirname, "..", "config.js"))) { +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { ({ PROXY_ADMIN_ADDRESS: proxyAdminAddress, PROXY_CONTRACT_ADDRESS: proxyContractAddress, - } = require("../config.js")); + TOKEN_NAME: tokenName, + } = require("../../config.js")); } module.exports = async (deployer, network) => { @@ -31,9 +51,12 @@ module.exports = async (deployer, network) => { console.log(`Proxy Admin: ${proxyAdminAddress}`); console.log(`FiatTokenProxy: ${proxyContractAddress}`); console.log(`FiatTokenV2: ${fiatTokenV2.address}`); + console.log(`Token Name: ${tokenName}`); - if (!proxyAdminAddress) { - throw new Error("PROXY_ADMIN_ADDRESS must be provided in config.js"); + if (!proxyContractAddress || !proxyAdminAddress || !tokenName) { + throw new Error( + "PROXY_CONTRACT_ADDRESS, PROXY_ADMIN_ADDRESS, and TOKEN_NAME must be provided in config.js" + ); } console.log("Deploying V2Upgrader contract..."); @@ -43,7 +66,7 @@ module.exports = async (deployer, network) => { proxyContractAddress, fiatTokenV2.address, proxyAdminAddress, - "USD Coin" + tokenName ); console.log(`>>>>>>> Deployed V2Upgrader at ${v2Upgrader.address} <<<<<<<`); diff --git a/migrations/versioned/5_deploy_v2_1.js b/migrations/versioned/5_deploy_v2_1.js new file mode 100644 index 000000000..dcaeedcc0 --- /dev/null +++ b/migrations/versioned/5_deploy_v2_1.js @@ -0,0 +1,77 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require("fs"); +const path = require("path"); +const some = require("lodash/some"); + +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const SignatureChecker = artifacts.require("SignatureChecker"); + +const THROWAWAY_ADDRESS = "0x0000000000000000000000000000000000000001"; + +let proxyContractAddress = ""; + +// Read config file if it exists +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + PROXY_CONTRACT_ADDRESS: proxyContractAddress, + } = require("../../config.js")); +} + +module.exports = async (deployer, network) => { + if ( + !proxyContractAddress || + some(["development", "coverage"], (v) => network.includes(v)) + ) { + proxyContractAddress = (await FiatTokenProxy.deployed()).address; + } + + console.log(`FiatTokenProxy: ${proxyContractAddress}`); + + console.log("Deploying and linking SignatureChecker library contract..."); + await deployer.deploy(SignatureChecker); + await deployer.link(SignatureChecker, FiatTokenV2_1); + + console.log("Deploying FiatTokenV2_1 implementation contract..."); + await deployer.deploy(FiatTokenV2_1); + + const fiatTokenV2_1 = await FiatTokenV2_1.deployed(); + console.log("Deployed FiatTokenV2_1 at", fiatTokenV2_1.address); + + // Initializing the implementation contract with dummy values here prevents + // the contract from being reinitialized later on with different values. + // Dummy values can be used here as the proxy contract will store the actual values + // for the deployed token. + console.log( + "Initializing FiatTokenV2_1 implementation contract with dummy values..." + ); + await fiatTokenV2_1.initialize( + "", + "", + "", + 0, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS + ); + await fiatTokenV2_1.initializeV2(""); + await fiatTokenV2_1.initializeV2_1(THROWAWAY_ADDRESS); +}; diff --git a/migrations/6_deploy_v2_1_upgrader.js b/migrations/versioned/6_deploy_v2_1_upgrader.js similarity index 68% rename from migrations/6_deploy_v2_1_upgrader.js rename to migrations/versioned/6_deploy_v2_1_upgrader.js index b416837b7..58e353cc9 100644 --- a/migrations/6_deploy_v2_1_upgrader.js +++ b/migrations/versioned/6_deploy_v2_1_upgrader.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const fs = require("fs"); const path = require("path"); const some = require("lodash/some"); @@ -11,12 +29,12 @@ let proxyContractAddress = ""; let lostAndFoundAddress = ""; // Read config file if it exists -if (fs.existsSync(path.join(__dirname, "..", "config.js"))) { +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { ({ PROXY_ADMIN_ADDRESS: proxyAdminAddress, PROXY_CONTRACT_ADDRESS: proxyContractAddress, LOST_AND_FOUND_ADDRESS: lostAndFoundAddress, - } = require("../config.js")); + } = require("../../config.js")); } module.exports = async (deployer, network) => { @@ -38,7 +56,7 @@ module.exports = async (deployer, network) => { console.log(`Proxy Admin: ${proxyAdminAddress}`); console.log(`FiatTokenProxy: ${proxyContractAddress}`); console.log(`FiatTokenV2_1: ${fiatTokenV2_1.address}`); - console.log(`Lost & Found: ${lostAndFoundAddress.address}`); + console.log(`Lost & Found: ${lostAndFoundAddress}`); if (!proxyAdminAddress) { throw new Error("PROXY_ADMIN_ADDRESS must be provided in config.js"); diff --git a/migrations/versioned/7_deploy_v2_2.js b/migrations/versioned/7_deploy_v2_2.js new file mode 100644 index 000000000..7e8f95a52 --- /dev/null +++ b/migrations/versioned/7_deploy_v2_2.js @@ -0,0 +1,78 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require("fs"); +const path = require("path"); +const some = require("lodash/some"); + +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const SignatureChecker = artifacts.require("SignatureChecker"); + +const THROWAWAY_ADDRESS = "0x0000000000000000000000000000000000000001"; + +let proxyContractAddress = ""; + +// Read config file if it exists +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + PROXY_CONTRACT_ADDRESS: proxyContractAddress, + } = require("../../config.js")); +} + +module.exports = async (deployer, network) => { + if ( + !proxyContractAddress || + some(["development", "coverage"], (v) => network.includes(v)) + ) { + proxyContractAddress = (await FiatTokenProxy.deployed()).address; + } + + console.log(`FiatTokenProxy: ${proxyContractAddress}`); + + console.log("Deploying and linking SignatureChecker library contract..."); + await deployer.deploy(SignatureChecker); + await deployer.link(SignatureChecker, FiatTokenV2_2); + + console.log("Deploying FiatTokenV2_2 implementation contract..."); + await deployer.deploy(FiatTokenV2_2); + + const fiatTokenV2_2 = await FiatTokenV2_2.deployed(); + console.log("Deployed FiatTokenV2_2 at", fiatTokenV2_2.address); + + // Initializing the implementation contract with dummy values here prevents + // the contract from being reinitialized later on with different values. + // Dummy values can be used here as the proxy contract will store the actual values + // for the deployed token. + console.log( + "Initializing FiatTokenV2_2 implementation contract with dummy values..." + ); + await fiatTokenV2_2.initialize( + "", + "", + "", + 0, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS, + THROWAWAY_ADDRESS + ); + await fiatTokenV2_2.initializeV2(""); + await fiatTokenV2_2.initializeV2_1(THROWAWAY_ADDRESS); + await fiatTokenV2_2.initializeV2_2([], ""); +}; diff --git a/migrations/versioned/8_deploy_v2_2_upgrader.js b/migrations/versioned/8_deploy_v2_2_upgrader.js new file mode 100644 index 000000000..6b96c869b --- /dev/null +++ b/migrations/versioned/8_deploy_v2_2_upgrader.js @@ -0,0 +1,89 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require("fs"); +const path = require("path"); +const some = require("lodash/some"); +const { readBlacklistFile } = require("../../utils"); + +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const V2_2Upgrader = artifacts.require("V2_2Upgrader"); + +let proxyAdminAddress = ""; +let proxyContractAddress = ""; +let newTokenSymbol = ""; + +// Read config file if it exists +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + PROXY_ADMIN_ADDRESS: proxyAdminAddress, + PROXY_CONTRACT_ADDRESS: proxyContractAddress, + TOKEN_SYMBOL: newTokenSymbol, + } = require("../../config.js")); +} + +module.exports = async (deployer, network) => { + const isTestEnvironment = some(["development", "coverage"], (v) => + network.includes(v) + ); + + // Proceed if and only if the blacklist file exists. + const accountsToBlacklist = readBlacklistFile( + path.join( + __dirname, + "..", + "..", + isTestEnvironment ? "blacklist.test.json" : "blacklist.remote.json" + ) + ); + + if (isTestEnvironment) { + // DO NOT USE THESE ADDRESSES IN PRODUCTION + proxyAdminAddress = "0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598"; + proxyContractAddress = (await FiatTokenProxy.deployed()).address; + } + proxyContractAddress = + proxyContractAddress || (await FiatTokenProxy.deployed()).address; + + if (!proxyAdminAddress) { + throw new Error("PROXY_ADMIN_ADDRESS must be provided in config.js"); + } + + const fiatTokenV2_2 = await FiatTokenV2_2.deployed(); + + console.log(`Proxy Admin: ${proxyAdminAddress}`); + console.log(`FiatTokenProxy: ${proxyContractAddress}`); + console.log(`FiatTokenV2_2: ${fiatTokenV2_2.address}`); + console.log(`New Token Symbol: ${newTokenSymbol}`); + + console.log("Deploying V2_2Upgrader contract..."); + + const v2_2Upgrader = await deployer.deploy( + V2_2Upgrader, + proxyContractAddress, + fiatTokenV2_2.address, + proxyAdminAddress, + accountsToBlacklist, + newTokenSymbol + ); + + console.log( + `>>>>>>> Deployed V2_2Upgrader at ${v2_2Upgrader.address} <<<<<<<` + ); +}; diff --git a/migrations/versioned/9_deploy_erc1271_wallet.js b/migrations/versioned/9_deploy_erc1271_wallet.js new file mode 100644 index 000000000..6fba754db --- /dev/null +++ b/migrations/versioned/9_deploy_erc1271_wallet.js @@ -0,0 +1,55 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fs = require("fs"); +const path = require("path"); +const some = require("lodash/some"); + +const MockERC1271Wallet = artifacts.require("MockERC1271Wallet"); + +let mockERC1271WalletOwnerAddress = ""; + +// Read config file if it exists +if (fs.existsSync(path.join(__dirname, "..", "..", "config.js"))) { + ({ + MOCK_ERC1271_WALLET_OWNER_ADDRESS: mockERC1271WalletOwnerAddress, + } = require("../../config.js")); +} + +module.exports = async (deployer, network, accounts) => { + const isTestEnvironment = some(["development", "coverage"], (v) => + network.includes(v) + ); + + if (isTestEnvironment) { + mockERC1271WalletOwnerAddress = accounts[0]; + } + + if (!mockERC1271WalletOwnerAddress) { + throw new Error( + "MOCK_ERC1271_WALLET_OWNER_ADDRESS must be provided in config.js" + ); + } + + console.log("Deploying MockERC1271Wallet contract..."); + + await deployer.deploy(MockERC1271Wallet, mockERC1271WalletOwnerAddress); + const walletAddress = (await MockERC1271Wallet.deployed()).address; + + console.log(`>>>>>>> Deployed MockERC1271Wallet at ${walletAddress} <<<<<<<`); +}; diff --git a/package.json b/package.json index 1e918f06a..f917cbc70 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,47 @@ { - "name": "centre-tokens", + "name": "stablecoin-evm", "version": "1.0.0", - "description": "Fiat and non-fiat tokens part of the CENTRE network.", + "description": "Circle's Stablecoin Smart Contracts on EVM-compatible blockchains", "main": "truffle-config.js", "directories": { "test": "test" }, "scripts": { - "setup": "git config core.hooksPath .githooks", "compile": "truffle compile", - "typechain": "yarn compile && rm -rf './@types/generated' && typechain --target=truffle-v5 --outDir './@types/generated' 'build/contracts/**/*.json'", - "typecheck": "tsc -p . --noEmit", - "lint": "eslint --ext '.js,.ts' './**/*.{j,t}s'", - "fmt": "prettier --write './**/*.sol' './**/*.js' './**/*.ts' './**/*.json' './**/*.md'", - "ganache": "ganache-cli --accounts=15 --deterministic --defaultBalanceEther=1000000 --quiet", - "test": "truffle test", + "contract-size": "yarn contract-size:all --contracts $(find ./contracts -name \"*.sol\" -not -path \"./contracts/test/*\" | xargs -I {} /bin/bash -c 'basename {} .sol')", + "contract-size:all": "yarn compile && truffle run contract-size --checkMaxSize", "coverage": "truffle run coverage", - "solhint": "solhint 'contracts/**/*.sol'", - "precommit": "yarn typechain && yarn fmt && yarn typecheck && yarn lint && yarn solhint", + "fmt": "prettier --write './**/*.sol' './**/*.js' './**/*.ts' './**/*.json' './**/*.md'", + "ganache": "ganache-cli --accounts=15 --deterministic --defaultBalanceEther=1000000 --allowUnlimitedContractSize --gasLimit=0x1C9C380 --quiet", + "lint": "eslint --ext '.js,.ts' './**/*.{j,t}s'", + "migrate": "truffle migrate --interactive", + "prepare": "husky install", + "precommit": "yarn fmt && yarn static-check", "slither": "slither --solc-disable-warnings --disable-color --exclude-dependencies .", - "migrate": "truffle migrate --interactive" + "solhint": "solhint 'contracts/**/*.sol'", + "static-check": "yarn typechain && yarn typecheck && yarn lint && yarn solhint", + "test": "USE_VERSIONED_MIGRATIONS=true truffle test", + "typechain": "yarn compile && rm -rf './@types/generated' && typechain --target=truffle-v5 --outDir './@types/generated' 'build/contracts/**/*.json'", + "typecheck": "tsc -p . --noEmit" }, "repository": { "type": "git", - "url": "git+https://github.com/centrehq/centre-tokens.git" + "url": "git+https://github.com/circlefin/stablecoin-evm.git" }, "keywords": [], "author": "", - "license": "MIT", + "license": "Apache-2.0", "bugs": { - "url": "https://github.com/centrehq/centre-tokens/issues" + "url": "https://github.com/circlefin/stablecoin-evm/issues" }, - "homepage": "https://github.com/centrehq/centre-tokens#readme", + "homepage": "https://github.com/circlefin/stablecoin-evm#readme", "dependencies": {}, "devDependencies": { "@openzeppelin/contracts": "^3.1.0", "@truffle/hdwallet-provider": "^1.0.39", "@typechain/truffle-v5": "^2.0.2", "@types/chai": "^4.2.11", + "@types/ethereumjs-abi": "^0.6.3", "@types/lodash": "^4.14.158", "@types/mocha": "^8.0.0", "@typescript-eslint/eslint-plugin": "^3.7.0", @@ -58,21 +62,23 @@ "ethereumjs-util": "^7.0.3", "ganache-cli": "^6.12.2", "googleapis": "^55.0.0", + "husky": "^8.0.3", "lodash": "^4.17.19", "prettier": "2.0.5", "prettier-plugin-solidity": "1.0.0-alpha.54", "q": "^1.5.1", "solc": "0.6.12", "solhint": "^3.1.0", - "solidity-coverage": "^0.7.9", - "truffle": "^5.1.35", + "solidity-coverage": "0.7.22", + "truffle": "5.1.49", + "truffle-contract-size": "^2.0.1", "ts-node": "^8.10.2", "typechain": "^2.0.0", - "typescript": "^3.9.7", + "typescript": "5.1.6", "web3": "^1.2.11" }, "engines": { - "node": ">= 12.0.0", - "yarn": ">= 1.21.1" + "node": "16.14.0", + "yarn": "1.22.19" } } diff --git a/scripts/callContractROFunctions.js b/scripts/callContractROFunctions.js new file mode 100644 index 000000000..8a8f34992 --- /dev/null +++ b/scripts/callContractROFunctions.js @@ -0,0 +1,137 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const _ = require("lodash"); + +/** + * A utility script that calls a series of read-only functions with no inputs + * on a contract, and prints the results to console. + * @param {string} contractName The name of the contract. Eg. FiatTokenV2_1 + * @param {string} contractAddress The address of the contract + * @param {string[]} functionNames An array of read-only function names to be called. + */ +async function main(contractName, contractAddress, functionNames) { + let Contract; + try { + Contract = require(`../build/contracts/${contractName}.json`); + } catch (e) { + throw new Error( + `Cannot find abi '${contractName}'! Run \`yarn compile\` to generate the abi first!` + ); + } + + if ((await web3.eth.getCode(contractAddress)).length <= 2) { + throw new Error(`Cannot find contract at address '${contractAddress}'!`); + } + + const viewFunctionResults = await Promise.all( + functionNames.map((funcName) => + conditionalCallROFunction(Contract, contractAddress, funcName) + ) + ); + + const result = _.fromPairs( + _.zip(functionNames, viewFunctionResults), + (element) => element[0] + ); + console.log(JSON.stringify(result, null, 2)); +} + +/** + * Memory addresses for the return data of certain read-only functions + * on the FiatTokenProxy contract. + */ +const FiatTokenProxy_SLOT_ADDRESSES = { + admin: "0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b", + implementation: + "0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3", +}; + +/** + * Conditionally calls a read-only function from a contract, depending on the contractName. + * + * If the contract is FiatTokenProxy, and either `name()` or `implementation()` is requested, + * then first try to get the result by calling the function, reading from storage slots as a fallback + * since these functions return data from static memory addresses. + * + * Otherwise, get the result by calling the function. + * @param {object} Contract The JSON abi for the contract + * @param {string} contractAddress The address of the contract. + * @param {string} funcName The read-only function to be called. + * @returns The result from calling the function. + */ +async function conditionalCallROFunction(Contract, contractAddress, funcName) { + const contract = new web3.eth.Contract(Contract.abi, contractAddress); + + if (!contract.methods[funcName]) { + throw new Error(`Cannot find ${funcName} in contract!`); + } + + if ( + Contract.contractName === "FiatTokenProxy" && + ["admin", "implementation"].includes(funcName) + ) { + try { + return await contract.methods[funcName]().call(); + } catch { + const storageResult = await web3.eth.getStorageAt( + contractAddress, + FiatTokenProxy_SLOT_ADDRESSES[funcName] + ); + return web3.utils.toChecksumAddress("0x" + storageResult.slice(26)); + } + } + + return await contract.methods[funcName]().call(); +} + +module.exports = async (callback) => { + /* eslint-disable no-undef -- Config is a global variable in a truffle exec script https://github.com/trufflesuite/truffle/pull/3233 */ + const network = config.network; + const argv = config._; + + const contractName = config.contractName; + const rawContractAddress = config.contractAddress; + const functionNames = argv.slice(1); + /* eslint-enable no-undef */ + + const usageError = new Error( + "Usage: yarn truffle exec scripts/callContractROFunctions.js [--network=] \n" + + "--contract-name=\n" + + "--contract-address=<0x-stripped address>\n" + + "[functionNames...]" + ); + + const contractAddress = `0x${rawContractAddress}`; + + console.log(`network: ${network}`); + console.log(`contractName: ${contractName}`); + console.log(`contractAddress: ${contractAddress}`); + console.log(`functionNames: ${functionNames}`); + + if (!web3.utils.isAddress(contractAddress)) { + callback(usageError); + } else { + try { + await main(contractName, contractAddress, functionNames); + callback(); + } catch (e) { + callback(e); + } + } +}; diff --git a/scripts/getBlacklistedAccounts.js b/scripts/getBlacklistedAccounts.js new file mode 100644 index 000000000..5952363da --- /dev/null +++ b/scripts/getBlacklistedAccounts.js @@ -0,0 +1,218 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const _ = require("lodash"); +const fs = require("fs"); +const path = require("path"); + +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +let Blacklistable; +try { + Blacklistable = require("../build/contracts/Blacklistable.json"); +} catch (e) { + console.error("Run `yarn compile` to generate the abi first!"); + console.error(e); + process.exit(1); +} + +const MAX_RETRIES = 5; +const CHUNK_SIZE = 200000; +const SLEEP_MS = 1000; +const OUTPUT_FILE = path.join(__dirname, "..", "blacklist.remote.json"); + +async function main(proxyAddress, startBlockNumber) { + if (fs.existsSync(OUTPUT_FILE)) { + console.log( + `NOTE: '${OUTPUT_FILE}' exists. Will append results to the file.` + ); + } + // A web3 Contract instance is used here as Truffle < v5.4.29 can trigger an + // insufficient funds error on view functions. @see https://github.com/trufflesuite/truffle/issues/4457 + const proxyAsBlacklistable = new web3.eth.Contract( + Blacklistable.abi, + proxyAddress + ); + + const latestBlockNumber = await web3.eth.getBlockNumber(); + let fromBlockNumber = startBlockNumber; + let toBlockNumber = Math.min( + latestBlockNumber, + startBlockNumber + CHUNK_SIZE + ); + + do { + await saveBlacklistedAccounts( + proxyAsBlacklistable, + fromBlockNumber, + toBlockNumber + ); + fromBlockNumber = toBlockNumber + 1; + toBlockNumber = Math.min(latestBlockNumber, toBlockNumber + CHUNK_SIZE); + + // Sleep for a bit to avoid blasting the RPC. + await sleep(SLEEP_MS); + } while ( + toBlockNumber <= latestBlockNumber && + fromBlockNumber < toBlockNumber + ); +} + +/** + * Saves all accounts that were blacklisted in [fromBlockNumber, toBlockNumber] + * AND are still blacklisted, in storage. + * @param {Blacklistable} proxyAsBlacklistable the FiatTokenProxy contract as Blacklistable + * @param {number} fromBlockNumber the start block number + * @param {number} toBlockNumber the end block number + */ +async function saveBlacklistedAccounts( + proxyAsBlacklistable, + fromBlockNumber, + toBlockNumber +) { + console.log( + `Querying events in range [${fromBlockNumber}, ${toBlockNumber}]` + ); + const rawBlacklistedEvents = await getBlacklistedEventsRetryWithBackoff( + proxyAsBlacklistable, + fromBlockNumber, + toBlockNumber + ); + if (rawBlacklistedEvents.length <= 0) { + return; + } + console.log(`>> Found ${rawBlacklistedEvents.length} 'Blacklisted' events!`); + + const maybeBlacklistedAccounts = _.uniq( + rawBlacklistedEvents.map((event) => + web3.utils.toChecksumAddress(event.returnValues._account) + ) + ); + const blacklistedAccounts = []; + for (const account of maybeBlacklistedAccounts) { + const isCurrentlyBlacklisted = await proxyAsBlacklistable.methods + .isBlacklisted(account) + .call(); + if (isCurrentlyBlacklisted) { + blacklistedAccounts.push(account); + } + } + + console.log( + `>> Found ${blacklistedAccounts.length} unique & currently blacklisted accounts` + ); + if (blacklistedAccounts.length <= 0) { + return; + } + + appendBlacklistedAccounts(blacklistedAccounts); +} + +/** + * Appends blacklisted accounts to a JSON file, deduplicating accounts. + * @param {string[]} blacklistedAccounts the list of blacklisted accounts + */ +function appendBlacklistedAccounts(blacklistedAccounts) { + let previousBlacklistedAccounts = []; + try { + previousBlacklistedAccounts = JSON.parse(fs.readFileSync(OUTPUT_FILE)); + } catch (e) { + // no-op + } + + const indent = 2; + const accountsToWrite = _.chain(previousBlacklistedAccounts) + .concat(blacklistedAccounts) + .map(web3.utils.toChecksumAddress) + .uniq() + .value(); + + fs.writeFileSync(OUTPUT_FILE, JSON.stringify(accountsToWrite, null, indent)); +} + +/** + * Get all blacklisted events that were emitted in [fromBlockNumber, toBlockNumber] + * @param {Blacklistable} proxyAsBlacklistable the FiatTokenProxy contract as Blacklistable + * @param {number} fromBlockNumber the start block number + * @param {number} toBlockNumber the end block number + * @throws error if RPC fails after MAX_RETRIES counts + */ +async function getBlacklistedEventsRetryWithBackoff( + proxyAsBlacklistable, + fromBlockNumber, + toBlockNumber +) { + let tries = 0; + let error; + + while (tries < MAX_RETRIES) { + await sleep(tries * SLEEP_MS); + try { + return await proxyAsBlacklistable.getPastEvents("Blacklisted", { + fromBlock: fromBlockNumber, + toBlock: toBlockNumber, + }); + } catch (e) { + error = e; + tries += 1; + } + } + + throw error; +} + +/** + * Utility function to trigger a sleep. + * @param {number} ms the period to sleep for + */ +async function sleep(ms) { + await new Promise((resolve) => setTimeout(resolve, ms)); +} + +module.exports = async (callback) => { + /* eslint-disable no-undef -- Config is a global variable in a truffle exec script https://github.com/trufflesuite/truffle/pull/3233 */ + const network = config.network; + const argv = config._; + /* eslint-enable no-undef */ + const usageError = new Error( + "Usage: yarn truffle exec scripts/getBlacklistedAccounts.js [<0x-stripped Proxy address>] [startBlockNumber] [--network=]" + ); + + // Truffle exec seems to auto parse a hex string passed in arguments into decimals. + // We need to strip the 0x in arguments to prevent this from happening. + const rawProxyAddress = argv[1]; + const startBlockNumber = Number(argv[2] || 0); + const proxyAddress = + network === "development" && !rawProxyAddress + ? (await FiatTokenProxy.deployed()).address + : `0x${rawProxyAddress}`; + + console.log(`network: ${network}`); + console.log(`proxyAddress: ${proxyAddress}`); + console.log(`startBlockNumber: ${startBlockNumber}`); + + if (!web3.utils.isAddress(proxyAddress)) { + callback(usageError); + } else { + try { + await main(proxyAddress, startBlockNumber); + callback(); + } catch (e) { + callback(e); + } + } +}; diff --git a/scripts/getContractCreationBlock.js b/scripts/getContractCreationBlock.js new file mode 100644 index 000000000..65c431a5d --- /dev/null +++ b/scripts/getContractCreationBlock.js @@ -0,0 +1,106 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); + +async function main(proxyAddress) { + const endBlock = await web3.eth.getBlockNumber(); + const creationBlock = await getProxyCreationBlock(proxyAddress, 0, endBlock); + if (await isContractCreatedAtBlock(proxyAddress, creationBlock)) { + console.log( + `Contract '${proxyAddress}' was created in block number ${creationBlock}` + ); + } else { + console.log( + `Could not find contract creation block for contract '${proxyAddress}'` + ); + } +} + +/** + * Searches for the creation block for a given contract using binary search. + * Adapted from https://levelup.gitconnected.com/how-to-get-smart-contract-creation-block-number-7f22f8952be0. + * @param {string} proxyAddress the address of the FiatTokenProxy contract + * @param {number} startBlock the start block of the range + * @param {number} endBlock the end block of the range + * @returns the block number at recursion termination + */ +async function getProxyCreationBlock(proxyAddress, startBlock, endBlock) { + await sleep(500); + console.log(`Searching in [${startBlock}, ${endBlock}]`); + if (startBlock === endBlock) { + return startBlock; + } + const midBlock = Math.floor((startBlock + endBlock) / 2); + if (await isContractCreatedAtBlock(proxyAddress, midBlock)) { + return getProxyCreationBlock(proxyAddress, startBlock, midBlock); + } else { + return getProxyCreationBlock(proxyAddress, midBlock + 1, endBlock); + } +} + +/** + * Checks if a given contract is created at a given block number + * @param {string} proxyAddress the address of the FiatTokenProxy contract + * @param {number} block the block number to check + * @returns true if the contract is created at the provided block number, false otherwise + */ +async function isContractCreatedAtBlock(proxyAddress, block) { + const code = await web3.eth.getCode(proxyAddress, block); + return code.length > 2; +} + +/** + * Utility function to trigger a sleep. + * @param {number} ms the period to sleep for + */ +async function sleep(ms) { + await new Promise((resolve) => setTimeout(resolve, ms)); +} + +module.exports = async (callback) => { + /* eslint-disable no-undef -- Config is a global variable in a truffle exec script https://github.com/trufflesuite/truffle/pull/3233 */ + const network = config.network; + const argv = config._; + /* eslint-enable no-undef */ + const usageError = new Error( + "Usage: yarn truffle exec scripts/getContractCreationBlock.js [<0x-stripped Proxy address>] [--network=]" + ); + + // Truffle exec seems to auto parse a hex string passed in arguments into decimals. + // We need to strip the 0x in arguments to prevent this from happening. + const rawProxyAddress = argv[1]; + const proxyAddress = + network === "development" && !rawProxyAddress + ? (await FiatTokenProxy.deployed()).address + : `0x${rawProxyAddress}`; + + console.log(`network: ${network}`); + console.log(`proxyAddress: ${proxyAddress}`); + + if (!web3.utils.isAddress(proxyAddress)) { + callback(usageError); + } else { + try { + await main(proxyAddress); + callback(); + } catch (e) { + callback(e); + } + } +}; diff --git a/scripts/git/diff-check.sh b/scripts/git/diff-check.sh new file mode 100755 index 000000000..bf808aa27 --- /dev/null +++ b/scripts/git/diff-check.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2023, Circle Internet Financial, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ============= +# Utility script to check if two different commit hashes have the same content. +# ============= + +# The commit hashes to check. +COMMIT_HASH=$1 +OTHER_COMMIT_HASH=$2 + +if [ -z "$COMMIT_HASH" ] || [ -z "$OTHER_COMMIT_HASH" ]; then + echo "Usage: $0 " + exit 1; +fi + +echo "Getting the tree-ish hash of the first commit" +TREE_HASH=$(git cat-file commit $COMMIT_HASH | grep tree | sed 's/tree //g') +echo ">> Commit: $COMMIT_HASH, Tree: $TREE_HASH" + +echo "Getting the tree-ish hash of the second commit" +OTHER_TREE_HASH=$(git cat-file commit $OTHER_COMMIT_HASH | grep tree | sed 's/tree //g') +echo ">> Commit: $OTHER_COMMIT_HASH, Tree: $OTHER_TREE_HASH" + +if [ $TREE_HASH = $OTHER_TREE_HASH ]; +then + echo "Both commits have the same content!"; + exit 0; +else + echo "Commits have different tree hashes. Content are different!"; + exit 1; +fi diff --git a/scripts/git/rebase.sh b/scripts/git/rebase.sh new file mode 100755 index 000000000..f05f9ab82 --- /dev/null +++ b/scripts/git/rebase.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2023, Circle Internet Financial, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ============= +# Utility script to perform interactive rebases using an editor of choice. +# ============= + +# Husky should be disabled so that pre-commit hook run per 'reword' rebase. +HUSKY=0 + +# (Optional) Choose the editor that you want to use for rebasing. For sufficiently +# large rebases, it may be easier to use an editor with a GUI (eg. Sublime Text). +GIT_EDITOR="subl -n -w" # Sublime Text +# GIT_EDITOR="vim" +# GIT_EDITOR="nano" + +# The range of commits to rebase. +FROM_COMMIT_HASH=$1 +TO_COMMIT_HASH=$2 + +if [ -z "$FROM_COMMIT_HASH" ] || [ -z "$TO_COMMIT_HASH" ]; then + echo "Usage: $0 " + exit 1; +fi + +echo "Interactive rebasing from '$FROM_COMMIT_HASH' to '$TO_COMMIT_HASH' using '$GIT_EDITOR'..." +git rebase -i $FROM_COMMIT_HASH $TO_COMMIT_HASH diff --git a/scripts/validateAccountsToBlacklist.js b/scripts/validateAccountsToBlacklist.js new file mode 100644 index 000000000..a918c91a2 --- /dev/null +++ b/scripts/validateAccountsToBlacklist.js @@ -0,0 +1,206 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const path = require("path"); +const { readBlacklistFile } = require("../utils"); +const _ = require("lodash"); + +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const V2_2Upgrader = artifacts.require("V2_2Upgrader"); + +/** + * A utility script to validate that + * 1. Addresses retrieved from a datasource match with the list of addresses in blacklist.remote.json + * 2. V2_2Upgrader.accountsToBlacklist() values match with the list of addresses in blacklist.remote.json + * 3. The list of addresses in blacklist.remote.json are currently blacklisted. + * @param {string} proxyAddress the contract address of FiatTokenProxy + * @param {string} v2_2UpgraderAddress the contract address of V2_2Upgrader + * @param {string} datasourceFilePath the JSON file containing an array of addresses retrieved from a datasource (eg. Dune) + * @param {boolean} skipDatasourceValidation true if datasource validation should be skipped, false otherwise + * @param {boolean} skipUpgraderValidation true if upgrader validation should be skipped, false otherwise + */ +async function main( + proxyAddress, + v2_2UpgraderAddress, + datasourceFilePath, + skipDatasourceValidation, + skipUpgraderValidation +) { + const expectedAccountsToBlacklist = readBlacklistFile( + path.join(__dirname, "..", "blacklist.remote.json") + ); + + // ==== Local state == Datasource's state + if (!skipDatasourceValidation) { + console.log("Comparing local state with data source's state..."); + console.log( + `>> Expecting ${expectedAccountsToBlacklist.length} accounts to blacklist` + ); + + const accountsFromDatasource = readBlacklistFile(datasourceFilePath); + console.log( + `>> Retrieved ${accountsFromDatasource.length} accounts from datasource` + ); + console.log(">> Verifying accounts..."); + verifyAccountsArrays(expectedAccountsToBlacklist, accountsFromDatasource); + console.log(">> All accounts verified!"); + } + + // ==== Local state == Upgrader state + if (!skipUpgraderValidation) { + console.log("\nComparing local state with deployed V2_2Upgrader..."); + const v2_2Upgrader = await V2_2Upgrader.at(v2_2UpgraderAddress); + const accountsFromUpgrader = await v2_2Upgrader.accountsToBlacklist(); + console.log( + `>> Retrieved ${accountsFromUpgrader.length} accounts from v2_2Upgrader` + ); + + console.log(">> Verifying accounts..."); + verifyAccountsArrays(expectedAccountsToBlacklist, accountsFromUpgrader); + console.log(">> All accounts verified!"); + } + + // ==== Every account blacklisted + console.log("\nComparing local state with deployed FiatTokenProxy..."); + console.log(">> Validating that all accountsToBlacklist are blacklisted"); + const proxyAsV2_1 = await FiatTokenV2_1.at(proxyAddress); + + for (let i = 0; i < expectedAccountsToBlacklist.length; i++) { + if (i % 5 === 0) { + console.log( + `>> Verified ${i}/${expectedAccountsToBlacklist.length} accounts` + ); + } + + const account = expectedAccountsToBlacklist[i]; + if (!(await proxyAsV2_1.isBlacklisted(account))) { + throw new Error(`Account '${account}' is not currently blacklisted!`); + } + } + console.log(">> All accounts verified!"); +} + +/** + * Verifies that two accounts array are both unique, and equal to each other. + * @param {string[]} accountsArray an array of accounts + * @param {string[]} otherAccountsArray another array of accounts + */ +function verifyAccountsArrays(accountsArray, otherAccountsArray) { + console.log(`>> Converting to checksum addresses`); + accountsArray = accountsArray.map(web3.utils.toChecksumAddress); + otherAccountsArray = otherAccountsArray.map(web3.utils.toChecksumAddress); + + // Check for duplicates. + console.log(`>> Checking for duplicates in accountsArray`); + verifyUnique(accountsArray); + + console.log(`>> Checking for duplicates in otherAccountsArray`); + verifyUnique(otherAccountsArray); + + // Check array equality. + console.log(`>> Checking for array equality`); + if (accountsArray.length !== otherAccountsArray.length) { + throw new Error( + `Arrays have different lengths! Expected: ${accountsArray.length}, Actual: ${otherAccountsArray.length}` + ); + } + for (const account of otherAccountsArray) { + if (!accountsArray.includes(account)) { + throw new Error(`Account '${account}' not found in accountsArray!`); + } + } +} + +/** + * Verifies that an accounts array is unique. + * @param {string[]} accountsArray an array of accounts + */ +function verifyUnique(accountsArray) { + const duplicates = _.chain(accountsArray) + .groupBy((acc) => acc.toLowerCase()) + .pickBy((group) => group.length > 1) + .keys() + .value(); + if (duplicates.length !== 0) { + throw new Error( + `${duplicates.length} duplicates detected in array! ${JSON.stringify( + duplicates + )}` + ); + } +} + +module.exports = async (callback) => { + const usageError = new Error( + "Usage: yarn truffle exec scripts/validateAccountsToBlacklist.js [--datasource-filepath=] \n" + + "[--skip-datasource-validation] \n" + + "[--skip-upgrader-validation] \n" + + "[--proxy-address=<0x-stripped Proxy address>] \n" + + "[--upgrader-address=<0x-stripped V2_2Upgrader address>] \n" + + "[--network=]" + ); + + /* eslint-disable no-undef -- Config is a global variable in a truffle exec script https://github.com/trufflesuite/truffle/pull/3233 */ + const network = config.network; + + // Truffle exec seems to auto parse a hex string passed in arguments into decimals. + // We need to strip the 0x in arguments to prevent this from happening. + const rawProxyAddress = config.proxyAddress; + const rawV2_2UpgraderAddress = config.upgraderAddress; + const datasourceFilePath = config.datasourceFilePath; + const skipDatasourceValidation = !!config.skipDatasourceValidation; + const skipUpgraderValidation = !!config.skipUpgraderValidation; + /* eslint-enable no-undef */ + + const proxyAddress = + network === "development" && !rawProxyAddress + ? (await FiatTokenProxy.deployed()).address + : `0x${rawProxyAddress}`; + const v2_2UpgraderAddress = + network === "development" && !rawV2_2UpgraderAddress + ? (await V2_2Upgrader.deployed()).address + : `0x${rawV2_2UpgraderAddress}`; + + console.log(`network: ${network}`); + console.log(`proxyAddress: ${proxyAddress}`); + console.log(`v2_2UpgraderAddress: ${v2_2UpgraderAddress}`); + console.log(`datasourceFilePath: ${datasourceFilePath}`); + console.log(`skipDatasourceValidation: ${skipDatasourceValidation}`); + console.log(`skipUpgraderValidation: ${skipUpgraderValidation}`); + + if ( + !web3.utils.isAddress(proxyAddress) || + !web3.utils.isAddress(v2_2UpgraderAddress) + ) { + callback(usageError); + } else { + try { + await main( + proxyAddress, + v2_2UpgraderAddress, + datasourceFilePath, + skipDatasourceValidation, + skipUpgraderValidation + ); + callback(); + } catch (e) { + callback(e); + } + } +}; diff --git a/scripts/verify-environment.sh b/scripts/verify-environment.sh deleted file mode 100755 index d6abea139..000000000 --- a/scripts/verify-environment.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -e - -echo "Verifying integrity" -yarn check --integrity -echo "Verifying tree" -yarn check --verify-tree diff --git a/start-ganache.sh b/start-ganache.sh new file mode 100755 index 000000000..ec162d703 --- /dev/null +++ b/start-ganache.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2023, Circle Internet Financial, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +DOCROOT="$( cd "$( dirname "$0" )" && pwd )" +GANACHE_PID_FILE="${DOCROOT}/pids/ganache.pid" + +usage() +{ +cat < 0 ]]; then + echo -e "Waiting for ${NAME} for ${DURATION} seconds..\n" + fi + + # ping every second + sleep 1 + DURATION=$SECONDS + + # check to be sure the service didn't die under mysterious circumstances after 10 second grace period + if [[ ${DURATION} -gt 10 ]] && [[ -e "${DOCROOT}/${NAME}.pid" ]]; then + PID=$(cat ${GANACHE_PID_FILE}) + if ! kill -0 &>/dev/null ${PID}; then + echo -e "$(date) : ${NAME} is not running after ${DURATION} seconds! Giving up!\n" + # fast fail by breaking while when this occurs + DURATION=${WAIT_TIME} + fi + fi + done + + echo -e "$(date) : ${NAME} service failed to start within ${WAIT_TIME} seconds!!\n" + echo -e "Last log entries for ${NAME}:\n" + tail -n 200 "logs/${NAME}.log" + exit 1 +} + +while getopts ":r" OPTION +do + case ${OPTION} in + r) + RESTART=true + ;; + ?) + usage + exit + ;; + esac +done + +if [[ ! -d "${DOCROOT}/logs" ]]; then + mkdir "${DOCROOT}/logs" +fi + +if [[ ! -d "${DOCROOT}/pids" ]]; then + mkdir "${DOCROOT}/pids" +fi + +if [[ "${RESTART}" = true ]] ; then + echo 'Stopping ganache.' + bash ${DOCROOT}/stop-ganache.sh +fi + +if [[ -e "${GANACHE_PID_FILE}" ]]; +then + PID=$(cat ${GANACHE_PID_FILE}) + if kill -0 &>/dev/null ${PID}; then + echo "Ganache is already running" + exit + else + rm ${GANACHE_PID_FILE} + fi +fi + +echo "Starting Ganache..." + +yarn ganache &> ${DOCROOT}/logs/ganache.log & +echo $! > $GANACHE_PID_FILE +ping_ganache + +echo "All outputs will be logged to ${DOCROOT}/logs" diff --git a/stop-ganache.sh b/stop-ganache.sh new file mode 100755 index 000000000..34edc1183 --- /dev/null +++ b/stop-ganache.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2023, Circle Internet Financial, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +DOCROOT="$( cd "$( dirname "$0" )" && pwd )" +PIDS_DIRECTORY="${DOCROOT}/pids" + +for arg in "ganache.pid" + do + if [[ -e "${PIDS_DIRECTORY}/${arg}" ]]; then + echo "Stopping ${arg}" + PID=$(cat "$PIDS_DIRECTORY/${arg}") + kill "${PID}" &>/dev/null + rm "${PIDS_DIRECTORY}/${arg}" + fi + done diff --git a/test/helpers/constants.ts b/test/helpers/constants.ts index bad7c971f..60a6bbd5b 100644 --- a/test/helpers/constants.ts +++ b/test/helpers/constants.ts @@ -1,9 +1,40 @@ -export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BN from "bn.js"; + +export const BLOCK_GAS_LIMIT = 30e6; +// Hex values +export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; export const ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000"; -export const MAX_UINT256 = +export const MAX_UINT256_HEX = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; +export const POW_2_255_HEX = + "0x8000000000000000000000000000000000000000000000000000000000000000"; +export const POW_2_255_MINUS1_HEX = + "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + +// BigNumber values +export const MAX_UINT256_BN = new BN(MAX_UINT256_HEX.slice(2), 16); +export const POW_2_255_BN = new BN(POW_2_255_HEX.slice(2), 16); +export const POW_2_255_MINUS1_BN = new BN(POW_2_255_MINUS1_HEX.slice(2), 16); // derived from mnemonic: clarify final village pulse require old seek excite mushroom forest satoshi video export const ACCOUNTS_AND_KEYS: { address: string; key: string }[] = [ @@ -68,3 +99,71 @@ export const ACCOUNTS_AND_KEYS: { address: string; key: string }[] = [ key: "db81ac68891890ec33021264ce81f9b5f9296a9fd95cdc785655db3066db2c08", }, ]; + +const GANACHE_ACCOUNTS: Array = [ + "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1", + "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", + "0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b", + "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", + "0xd03ea8624C8C5987235048901fB614fDcA89b117", + "0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC", + "0x3E5e9111Ae8eB78Fe1CC3bb8915d5D461F3Ef9A9", + "0x28a8746e75304c0780E011BEd21C72cD78cd535E", + "0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E", + "0x1dF62f291b2E969fB0849d99D9Ce41e2F137006e", + "0x610Bb1573d1046FCb8A70Bbbd395754cD57C2b60", + "0x855FA758c77D68a04990E992aA4dcdeF899F654A", + "0xfA2435Eacf10Ca62ae6787ba2fB044f8733Ee843", + "0x64E078A8Aa15A41B85890265648e965De686bAE6", + "0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598", +]; + +const GANACHE_PRIVATE_KEYS: Array = [ + "4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d", + "6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1", + "6370fd033278c143179d81c5526140625662b8daa446c22ee2d73db3707e620c", + "646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a7913", + "add53f9a7e588d003326d1cbf9e4a43c061aadd9bc938c843a79e7b4fd2ad743", + "395df67f0c2d2d9fe1ad08d1bc8b6627011959b79c53d7dd6a3536a33ab8a4fd", + "e485d098507f54e7733a205420dfddbe58db035fa577fc294ebd14db90767a52", + "a453611d9419d0e56f499079478fd72c37b251a94bfde4d19872c44cf65386e3", + "829e924fdf021ba3dbbc4225edfece9aca04b929d6e75613329ca6f1d31c0bb4", + "b0057716d5917badaf911b193b12b910811c1497b5bada8d7711f758981c3773", + "77c5495fbb039eed474fc940f29955ed0531693cc9212911efd35dff0373153f", + "d99b5b29e6da2528bf458b26237a6cf8655a3e3276c1cdc0de1f98cefee81c01", + "9b9c613a36396172eab2d34d72331c8ca83a358781883a535d2941f66db07b24", + "0874049f95d55fb76916262dc70571701b5c4cc5900c0691af75f1a8a52c8268", + "21d7212f3b4e5332fd465877b64926e3532653e2798a11255a46f533852dfe46", +]; + +export const accounts = { + deployerAccount: GANACHE_ACCOUNTS[0], + arbitraryAccount: GANACHE_ACCOUNTS[1], + tokenOwnerAccount: GANACHE_ACCOUNTS[3], + blacklisterAccount: GANACHE_ACCOUNTS[4], + arbitraryAccount2: GANACHE_ACCOUNTS[5], + masterMinterAccount: GANACHE_ACCOUNTS[6], + minterAccount: GANACHE_ACCOUNTS[7], + pauserAccount: GANACHE_ACCOUNTS[8], + mintOwnerAccount: GANACHE_ACCOUNTS[9], + controller1Account: GANACHE_ACCOUNTS[11], + rescuerAccount: GANACHE_ACCOUNTS[12], + lostAndFoundAccount: GANACHE_ACCOUNTS[13], + proxyOwnerAccount: GANACHE_ACCOUNTS[14], +}; + +export const accountPrivateKeys = { + deployerAccount: GANACHE_PRIVATE_KEYS[0], + arbitraryAccount: GANACHE_PRIVATE_KEYS[1], + tokenOwnerAccount: GANACHE_PRIVATE_KEYS[3], + blacklisterAccount: GANACHE_PRIVATE_KEYS[4], + arbitraryAccount2: GANACHE_PRIVATE_KEYS[5], + masterMinterAccount: GANACHE_PRIVATE_KEYS[6], + minterAccount: GANACHE_PRIVATE_KEYS[7], + pauserAccount: GANACHE_PRIVATE_KEYS[8], + mintOwnerAccount: GANACHE_PRIVATE_KEYS[9], + controller1Account: GANACHE_PRIVATE_KEYS[11], + rescuerAccount: GANACHE_PRIVATE_KEYS[12], + lostAndFoundAccount: GANACHE_PRIVATE_KEYS[13], + proxyOwnerAccount: GANACHE_PRIVATE_KEYS[14], +}; diff --git a/test/helpers/index.ts b/test/helpers/index.ts index e9ac56dca..383013fa8 100644 --- a/test/helpers/index.ts +++ b/test/helpers/index.ts @@ -1,5 +1,38 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { ecsign } from "ethereumjs-util"; import { assert } from "chai"; +import { solidityPack } from "ethereumjs-abi"; +import { + FiatTokenProxyInstance, + FiatTokenV11Instance, + FiatTokenV1Instance, + FiatTokenV21Instance, + FiatTokenV22Instance, + FiatTokenV2Instance, +} from "../../@types/generated"; +import _ from "lodash"; + +const FiatTokenV1 = artifacts.require("FiatTokenV1"); +const FiatTokenV2 = artifacts.require("FiatTokenV2"); +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); export async function expectRevert( promise: Promise, @@ -9,7 +42,7 @@ export async function expectRevert( try { await promise; } catch (e) { - err = e; + err = e as Error; } if (!err) { @@ -51,6 +84,11 @@ export interface Signature { s: string; } +export function packSignature(signature: Signature): Buffer { + const { v, r, s } = signature; + return solidityPack(["bytes32", "bytes32", "uint8"], [r, s, v]); +} + export function ecSign(digest: string, privateKey: string): Signature { const { v, r, s } = ecsign( bufferFromHexString(digest), @@ -63,3 +101,77 @@ export function ecSign(digest: string, privateKey: string): Signature { export function bytes32FromAddress(address: string): string { return prepend0x(strip0x(address).toLowerCase().padStart(64, "0")); } + +export function makeDomainSeparator( + name: string, + version: string, + chainId: number, + address: string +): string { + return web3.utils.keccak256( + web3.eth.abi.encodeParameters( + ["bytes32", "bytes32", "bytes32", "uint256", "address"], + [ + web3.utils.keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ), + web3.utils.keccak256(name), + web3.utils.keccak256(version), + chainId, + address, + ] + ) + ); +} + +/** + * Helper function to generate a number of fake accounts. + * @param n the number of accounts to generate. + * @returns a list of accounts. + */ +export function generateAccounts(n: number): string[] { + return _.range(0, n).map(() => web3.eth.accounts.create().address); +} + +export async function initializeToVersion( + proxyOrImplementation: + | FiatTokenProxyInstance + | FiatTokenV1Instance + | FiatTokenV11Instance + | FiatTokenV2Instance + | FiatTokenV21Instance + | FiatTokenV22Instance, + version: "1" | "1.1" | "2" | "2.1" | "2.2", + fiatTokenOwner: string, + lostAndFound: string, + accountsToBlacklist: string[] = [] +): Promise { + const proxyAsV1 = await FiatTokenV1.at(proxyOrImplementation.address); + await proxyAsV1.initialize( + "USD Coin", + "USDC", + "USD", + 6, + fiatTokenOwner, + fiatTokenOwner, + fiatTokenOwner, + fiatTokenOwner + ); + + if (version >= "2") { + const proxyAsV2 = await FiatTokenV2.at(proxyOrImplementation.address); + await proxyAsV2.initializeV2("USD Coin", { + from: fiatTokenOwner, + }); + } + + if (version >= "2.1") { + const proxyAsV2_1 = await FiatTokenV2_1.at(proxyOrImplementation.address); + await proxyAsV2_1.initializeV2_1(lostAndFound); + } + + if (version >= "2.2") { + const proxyAsV2_2 = await FiatTokenV2_2.at(proxyOrImplementation.address); + await proxyAsV2_2.initializeV2_2(accountsToBlacklist, "USDCUSDC"); + } +} diff --git a/test/helpers/storageSlots.behavior.ts b/test/helpers/storageSlots.behavior.ts index 89de422cd..38bf1b775 100644 --- a/test/helpers/storageSlots.behavior.ts +++ b/test/helpers/storageSlots.behavior.ts @@ -1,9 +1,36 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import BN from "bn.js"; import { FiatTokenProxyInstance } from "../../@types/generated"; +import { POW_2_255_BN } from "./constants"; const FiatTokenProxy = artifacts.require("FiatTokenProxy"); const FiatTokenV1 = artifacts.require("FiatTokenV1"); const FiatTokenV1_1 = artifacts.require("FiatTokenV1_1"); +const FiatTokenV2 = artifacts.require("FiatTokenV2"); +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); + +export const STORAGE_SLOT_NUMBERS = { + _deprecatedBlacklisted: 3, + balanceAndBlacklistStates: 9, +}; export function usesOriginalStorageSlotPositions< T extends Truffle.ContractInstance @@ -13,7 +40,7 @@ export function usesOriginalStorageSlotPositions< accounts, }: { Contract: Truffle.Contract; - version: 1 | 1.1 | 2 | 2.1; + version: 1 | 1.1 | 2 | 2.1 | 2.2; accounts: Truffle.Accounts; }): void { describe("uses original storage slot positions", () => { @@ -24,6 +51,10 @@ export function usesOriginalStorageSlotPositions< 30e6, 10e6, ]; + const [mintedBN, transferredBN] = [minted, transferred].map( + (v) => new BN(v, 10) + ); + const [ owner, proxyAdmin, @@ -35,10 +66,12 @@ export function usesOriginalStorageSlotPositions< alice, bob, charlie, + lostAndFound, ] = accounts; let fiatToken: T; let proxy: FiatTokenProxyInstance; + let domainSeparator: string; beforeEach(async () => { fiatToken = await Contract.new(); @@ -63,6 +96,7 @@ export function usesOriginalStorageSlotPositions< await proxyAsFiatTokenV1.mint(alice, minted, { from: minter }); await proxyAsFiatTokenV1.transfer(bob, transferred, { from: alice }); await proxyAsFiatTokenV1.approve(charlie, allowance, { from: alice }); + await proxyAsFiatTokenV1.blacklist(bob, { from: blacklister }); await proxyAsFiatTokenV1.blacklist(charlie, { from: blacklister }); await proxyAsFiatTokenV1.pause({ from: pauser }); @@ -72,6 +106,19 @@ export function usesOriginalStorageSlotPositions< from: owner, }); } + if (version >= 2) { + const proxyAsFiatTokenV2 = await FiatTokenV2.at(proxy.address); + await proxyAsFiatTokenV2.initializeV2(name); + domainSeparator = await proxyAsFiatTokenV2.DOMAIN_SEPARATOR(); + } + if (version >= 2.1) { + const proxyAsFiatTokenV2_1 = await FiatTokenV2_1.at(proxy.address); + await proxyAsFiatTokenV2_1.initializeV2_1(lostAndFound); + } + if (version >= 2.2) { + const proxyAsFiatTokenV2_2 = await FiatTokenV2_2.at(proxy.address); + await proxyAsFiatTokenV2_2.initializeV2_2([], symbol); + } }); it("retains original storage slots 0 through 13", async () => { @@ -91,7 +138,7 @@ export function usesOriginalStorageSlotPositions< // slot 2 - blacklister expect(parseAddress(slots[2])).to.equal(blacklister); // blacklister - // slot 3 - blacklisted (mapping, slot is unused) + // slot 3 - _deprecatedBlacklisted (mapping, slot is unused) expect(slots[3]).to.equal("0"); // slot 4 - name @@ -110,7 +157,7 @@ export function usesOriginalStorageSlotPositions< expect(slots[8].slice(0, 2)).to.equal("01"); // initialized expect(parseAddress(slots[8].slice(2))).to.equal(masterMinter); // masterMinter - // slot 9 - balances (mapping, slot is unused) + // slot 9 - balanceAndBlacklistStates (mapping, slot is unused) expect(slots[9]).to.equal("0"); // slot 10 - allowed (mapping, slot is unused) @@ -133,36 +180,100 @@ export function usesOriginalStorageSlotPositions< }); } - it("retains original storage slots for blacklisted mapping", async () => { - // blacklisted[alice] + if (version >= 2) { + it("retains slot 15 for DOMAIN_SEPARATOR", async () => { + const slot = await readSlot(proxy.address, 15); + + // Cached domain separator is deprecated in v2.2. But we still need to ensure the storage slot is retained. + expect("0x" + slot).to.equal(domainSeparator); + }); + } + + it("retains original storage slots for _deprecatedBlacklisted mapping", async () => { + // _deprecatedBlacklisted[alice] let v = parseInt( - await readSlot(proxy.address, addressMappingSlot(alice, 3)), + await readSlot( + proxy.address, + addressMappingSlot(alice, STORAGE_SLOT_NUMBERS._deprecatedBlacklisted) + ), 16 ); expect(v).to.equal(0); - // blacklisted[charlie] + // _deprecatedBlacklisted[bob] - this should be set to true in pre-v2.2 versions, + // and left untouched in v2.2+ versions. v = parseInt( - await readSlot(proxy.address, addressMappingSlot(charlie, 3)), + await readSlot( + proxy.address, + addressMappingSlot(bob, STORAGE_SLOT_NUMBERS._deprecatedBlacklisted) + ), 16 ); - expect(v).to.equal(1); - }); + if (version >= 2.2) { + expect(v).to.equal(0); + } else { + expect(v).to.equal(1); + } - it("retains original storage slots for balances mapping", async () => { - // balance[alice] - let v = parseInt( - await readSlot(proxy.address, addressMappingSlot(alice, 9)), + // _deprecatedBlacklisted[charlie] - this should be set to true in pre-v2.2 versions, + // and left untouched in v2.2+ versions. + v = parseInt( + await readSlot( + proxy.address, + addressMappingSlot( + charlie, + STORAGE_SLOT_NUMBERS._deprecatedBlacklisted + ) + ), 16 ); - expect(v).to.equal(minted - transferred); + if (version >= 2.2) { + expect(v).to.equal(0); + } else { + expect(v).to.equal(1); + } + }); - // balances[bob] - v = parseInt( - await readSlot(proxy.address, addressMappingSlot(bob, 9)), - 16 + it("retains original storage slots for balanceAndBlacklistStates mapping", async () => { + // balanceAndBlacklistStates[alice] - not blacklisted, has balance + let v = parseUint( + await readSlot( + proxy.address, + addressMappingSlot( + alice, + STORAGE_SLOT_NUMBERS.balanceAndBlacklistStates + ) + ) + ); + let expectedValue = mintedBN.sub(transferredBN); + expect(v.eq(expectedValue)).to.be.true; + + // balanceAndBlacklistStates[bob] - blacklisted, has balance + v = parseUint( + await readSlot( + proxy.address, + addressMappingSlot( + bob, + STORAGE_SLOT_NUMBERS.balanceAndBlacklistStates + ) + ) + ); + expectedValue = + version >= 2.2 ? POW_2_255_BN.add(transferredBN) : transferredBN; + expect(v.eq(expectedValue)).to.be.true; + + // balanceAndBlacklistStates[charlie] - blacklisted, no balance + v = parseUint( + await readSlot( + proxy.address, + addressMappingSlot( + charlie, + STORAGE_SLOT_NUMBERS.balanceAndBlacklistStates + ) + ) ); - expect(v).to.equal(transferred); + expectedValue = version >= 2.2 ? POW_2_255_BN : new BN(0); + expect(v.eq(expectedValue)).to.be.true; }); it("retains original storage slots for allowed mapping", async () => { @@ -214,7 +325,7 @@ export function usesOriginalStorageSlotPositions< }); } -async function readSlot( +export async function readSlot( address: string, slot: number | string ): Promise { @@ -234,7 +345,7 @@ function parseString(hex: string): string { return Buffer.from(hex.slice(0, len), "hex").toString("utf8"); } -function parseUint(hex: string): BN { +export function parseUint(hex: string): BN { return new BN(hex, 16); } @@ -246,7 +357,7 @@ function encodeAddress(addr: string): string { return addr.replace(/^0x/, "").toLowerCase().padStart(64, "0"); } -function addressMappingSlot(addr: string, pos: number): string { +export function addressMappingSlot(addr: string, pos: number): string { return web3.utils.keccak256("0x" + encodeAddress(addr) + encodeUint(pos)); } diff --git a/test/minting/AccountUtils.js b/test/minting/AccountUtils.js index a2c42b858..39107229f 100644 --- a/test/minting/AccountUtils.js +++ b/test/minting/AccountUtils.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + // set to true to enable verbose logging in the tests const debugLogging = false; const assertDiff = require("assert-diff"); @@ -7,54 +25,7 @@ const Q = require("q"); const clone = require("clone"); const util = require("util"); -// named list of all accounts -const Accounts = { - deployerAccount: "0x90F8BF6A479F320EAD074411A4B0E7944EA8C9C1", // accounts[0] - arbitraryAccount: "0xFFCF8FDEE72AC11B5C542428B35EEF5769C409F0", // accounts[1] - tokenOwnerAccount: "0xE11BA2B4D45EAED5996CD0823791E0C93114882D", // Accounts.arbitraryAccount - blacklisterAccount: "0xD03EA8624C8C5987235048901FB614FDCA89B117", // accounts[4] - arbitraryAccount2: "0x95CED938F7991CD0DFCB48F0A06A40FA1AF46EBC", // accounts[5] - masterMinterAccount: "0x3E5E9111AE8EB78FE1CC3BB8915D5D461F3EF9A9", // accounts[6] - minterAccount: "0x28A8746E75304C0780E011BED21C72CD78CD535E", // accounts[7] - pauserAccount: "0xACA94EF8BD5FFEE41947B4585A84BDA5A3D3DA6E", // accounts[8] - mintOwnerAccount: "0x1DF62F291B2E969FB0849D99D9CE41E2F137006E", // accounts[9] - controller1Account: "0x855FA758C77D68A04990E992AA4DCDEF899F654A", // accounts[11] - proxyOwnerAccount: "0x2F560290FEF1B3ADA194B6AA9C40AA71F8E95598", // accounts[14] -}; - -// named list of known private keys -const AccountPrivateKeys = { - deployerPrivateKey: - "4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d", // accounts[0] - arbitraryPrivateKey: - "6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1", // accounts[1] - issuerControllerPrivateKey: - "6370fd033278c143179d81c5526140625662b8daa446c22ee2d73db3707e620c", // accounts[2] - tokenOwnerPrivateKey: - "646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a7913", // Accounts.arbitraryAccount - blacklisterPrivateKey: - "add53f9a7e588d003326d1cbf9e4a43c061aadd9bc938c843a79e7b4fd2ad743", // accounts[4] - arbitrary2PrivateKey: - "395df67f0c2d2d9fe1ad08d1bc8b6627011959b79c53d7dd6a3536a33ab8a4fd", // accounts[5] - masterMinterPrivateKey: - "e485d098507f54e7733a205420dfddbe58db035fa577fc294ebd14db90767a52", // accounts[6] - minterPrivateKeyt: - "a453611d9419d0e56f499079478fd72c37b251a94bfde4d19872c44cf65386e3", // accounts[7] - pauserPrivateKey: - "829e924fdf021ba3dbbc4225edfece9aca04b929d6e75613329ca6f1d31c0bb4", // accounts[8] - mintOwnerPrivateKey: - "b0057716d5917badaf911b193b12b910811c1497b5bada8d7711f758981c3773", // accounts[9] - mintProtectorPrivateKey: - "77c5495fbb039eed474fc940f29955ed0531693cc9212911efd35dff0373153f", // accounts[10] - controller1PrivateKey: - "d99b5b29e6da2528bf458b26237a6cf8655a3e3276c1cdc0de1f98cefee81c01", // accounts[11] - controller2PrivateKey: - "9b9c613a36396172eab2d34d72331c8ca83a358781883a535d2941f66db07b24", // accounts[12] - issuerOwnerPrivateKey: - "0874049f95d55fb76916262dc70571701b5c4cc5900c0691af75f1a8a52c8268", // accounts[13] - proxyOwnerAccount: - "21d7212f3b4e5332fd465877b64926e3532653e2798a11255a46f533852dfe46", // accounts[14] -}; +const { accounts, accountPrivateKeys } = require("../helpers/constants"); function addressEquals(address1, address2) { if (address1.toUpperCase() === address2.toUpperCase()) { @@ -153,17 +124,17 @@ async function checkState( // accounts: an object containing account addresses. Eg: {owner: 0xffad9033, minter: 0x45289432} // returns an object containing the results of calling accountQuery on each account // E.g. {owner: value1, minter: value2} -async function getAccountState(accountQuery, accounts) { +async function getAccountState(accountQuery, _accounts) { // create an array of promises const promises = []; - for (const account in accounts) { - const promiseQuery = accountQuery(Accounts[account]); + for (const account in _accounts) { + const promiseQuery = accountQuery(accounts[account]); promises.push(promiseQuery); } const results = await Q.allSettled(promises); const state = {}; let u = 0; - for (const account in accounts) { + for (const account in _accounts) { state[account] = results[u].value; ++u; } @@ -176,8 +147,8 @@ function isLiteral(object) { } module.exports = { - Accounts: Accounts, - AccountPrivateKeys: AccountPrivateKeys, + Accounts: accounts, + AccountPrivateKeys: accountPrivateKeys, setAccountDefault: setAccountDefault, checkState: checkState, getAccountState: getAccountState, diff --git a/test/minting/ControllerTestUtils.js b/test/minting/ControllerTestUtils.js index bdc746152..7f070bb28 100644 --- a/test/minting/ControllerTestUtils.js +++ b/test/minting/ControllerTestUtils.js @@ -1,5 +1,24 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const Q = require("q"); +const { ZERO_ADDRESS } = require("../helpers/constants"); const AccountUtils = require("./AccountUtils.js"); const Accounts = AccountUtils.Accounts; const setAccountDefault = AccountUtils.setAccountDefault; @@ -17,7 +36,7 @@ function ControllerState(owner, controllers) { // Default state of Controller when it is deployed const controllerEmptyState = new ControllerState( Accounts.mintOwnerAccount, - setAccountDefault(Accounts, "0x0000000000000000000000000000000000000000") + setAccountDefault(Accounts, ZERO_ADDRESS) ); // Checks the state of an array of controller contracts diff --git a/test/minting/MintControllerTests.js b/test/minting/MintControllerTests.js index c3a04db17..b7fd54789 100644 --- a/test/minting/MintControllerTests.js +++ b/test/minting/MintControllerTests.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MintController = artifacts.require("minting/MintController"); const tokenUtils = require("../v1/TokenTestUtils.js"); @@ -56,7 +74,7 @@ async function run_tests(newToken) { expectedTokenState.push( { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: newBigNumber(amount), }, { variable: "totalSupply", expectedValue: newBigNumber(amount) } diff --git a/test/minting/MintControllerUtils.js b/test/minting/MintControllerUtils.js index 44430ade6..4f1e2515a 100644 --- a/test/minting/MintControllerUtils.js +++ b/test/minting/MintControllerUtils.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const tokenUtils = require("../v1/TokenTestUtils.js"); const bigZero = tokenUtils.bigZero; const initializeTokenWithProxy = tokenUtils.initializeTokenWithProxy; diff --git a/test/minting/MintP0_ArgumentTests.js b/test/minting/MintP0_ArgumentTests.js index 7bce73e2b..e2ccdd30f 100644 --- a/test/minting/MintP0_ArgumentTests.js +++ b/test/minting/MintP0_ArgumentTests.js @@ -1,7 +1,26 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MintController = artifacts.require("minting/MintController"); const MasterMinter = artifacts.require("minting/MasterMinter"); const FiatToken = artifacts.require("FiatTokenV1"); +const { MAX_UINT256_HEX, ZERO_ADDRESS } = require("../helpers/constants"); const tokenUtils = require("../v1/TokenTestUtils"); const newBigNumber = tokenUtils.newBigNumber; const checkMINTp0 = tokenUtils.checkMINTp0; @@ -18,10 +37,6 @@ const addressEquals = AccountUtils.addressEquals; const initializeTokenWithProxyAndMintController = mintUtils.initializeTokenWithProxyAndMintController; -const zeroAddress = "0x0000000000000000000000000000000000000000"; -const maxAmount = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - async function run_tests_MintController(newToken, accounts) { run_MINT_tests(newToken, MintController, accounts); } @@ -64,7 +79,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { it("arg001 transferOwnership(0) reverts", async function () { await expectRevert( - mintController.transferOwnership(zeroAddress, { + mintController.transferOwnership(ZERO_ADDRESS, { from: Accounts.mintOwnerAccount, }) ); @@ -82,7 +97,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { it("arg003 configureController(0, M) throws", async function () { await expectError( - mintController.configureController(zeroAddress, Accounts.minterAccount, { + mintController.configureController(ZERO_ADDRESS, Accounts.minterAccount, { from: Accounts.mintOwnerAccount, }), "Controller must be a non-zero address" @@ -121,7 +136,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { await expectError( mintController.configureController( Accounts.controller1Account, - zeroAddress, + ZERO_ADDRESS, { from: Accounts.mintOwnerAccount } ), "Worker must be a non-zero address" @@ -131,7 +146,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { it("arg007 removeController(0) throws", async function () { // expect no changes await expectError( - mintController.removeController(zeroAddress, { + mintController.removeController(ZERO_ADDRESS, { from: Accounts.mintOwnerAccount, }), "Controller must be a non-zero address" @@ -143,10 +158,10 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { }); it("arg008 setMinterManager(0) works", async function () { - await mintController.setMinterManager(zeroAddress, { + await mintController.setMinterManager(ZERO_ADDRESS, { from: Accounts.mintOwnerAccount, }); - expectedMintControllerState.minterManager = zeroAddress; + expectedMintControllerState.minterManager = ZERO_ADDRESS; await checkMINTp0( [token, mintController], [expectedTokenState, expectedMintControllerState] @@ -247,7 +262,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { Accounts.minterAccount, { from: Accounts.mintOwnerAccount } ); - await mintController.configureMinter(maxAmount, { + await mintController.configureMinter(MAX_UINT256_HEX, { from: Accounts.controller1Account, }); @@ -257,7 +272,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { { variable: "isAccountMinter.minterAccount", expectedValue: true }, { variable: "minterAllowance.minterAccount", - expectedValue: newBigNumber(maxAmount), + expectedValue: newBigNumber(MAX_UINT256_HEX), } ); await checkMINTp0( @@ -320,7 +335,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { from: Accounts.controller1Account, }); await expectRevert( - mintController.incrementMinterAllowance(maxAmount, { + mintController.incrementMinterAllowance(MAX_UINT256_HEX, { from: Accounts.controller1Account, }) ); @@ -332,7 +347,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { Accounts.minterAccount, { from: Accounts.mintOwnerAccount } ); - await mintController.configureMinter(maxAmount, { + await mintController.configureMinter(MAX_UINT256_HEX, { from: Accounts.controller1Account, }); await expectRevert( @@ -344,7 +359,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { it("arg019 configureController(0, 0) throws", async function () { await expectError( - mintController.configureController(zeroAddress, zeroAddress, { + mintController.configureController(ZERO_ADDRESS, ZERO_ADDRESS, { from: Accounts.mintOwnerAccount, }), "Controller must be a non-zero address" @@ -372,7 +387,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { [expectedTokenState, expectedMintControllerState] ); actualMinter = await mintController.getWorker(Accounts.controller1Account); - addressEquals(actualMinter, zeroAddress); + addressEquals(actualMinter, ZERO_ADDRESS); }); it("arg021 removeController throws if worker is already address(0)", async function () { @@ -396,7 +411,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { [expectedTokenState, expectedMintControllerState] ); actualMinter = await mintController.getWorker(Accounts.controller1Account); - addressEquals(actualMinter, zeroAddress); + addressEquals(actualMinter, ZERO_ADDRESS); // attempting to remove the controller1Account again should throw because the worker is already set to address(0). await expectError( diff --git a/test/minting/MintP0_BasicTests.js b/test/minting/MintP0_BasicTests.js index d2d058ebb..e96534e9a 100644 --- a/test/minting/MintP0_BasicTests.js +++ b/test/minting/MintP0_BasicTests.js @@ -1,3 +1,22 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { ZERO_ADDRESS, MAX_UINT256_HEX } = require("../helpers/constants"); const MintController = artifacts.require("minting/MintController"); const MasterMinter = artifacts.require("minting/MasterMinter"); const FiatToken = artifacts.require("FiatTokenV1"); @@ -8,7 +27,6 @@ const checkMINTp0 = tokenUtils.checkMINTp0; const expectRevert = tokenUtils.expectRevert; const expectError = tokenUtils.expectError; const bigZero = tokenUtils.bigZero; -const maxAmount = tokenUtils.maxAmount; const clone = require("clone"); @@ -20,8 +38,6 @@ const addressEquals = AccountUtils.addressEquals; const initializeTokenWithProxyAndMintController = mintUtils.initializeTokenWithProxyAndMintController; -const zeroAddress = "0x0000000000000000000000000000000000000000"; - async function run_tests_MintController(newToken, accounts) { run_MINT_tests(newToken, MintController, accounts); } @@ -148,7 +164,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { await mintController.removeController(Accounts.controller1Account, { from: Accounts.mintOwnerAccount, }); - expectedMintControllerState.controllers.controller1Account = zeroAddress; + expectedMintControllerState.controllers.controller1Account = ZERO_ADDRESS; await checkMINTp0( [token, mintController], [expectedTokenState, expectedMintControllerState] @@ -337,7 +353,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { await mintController.removeController(Accounts.controller1Account, { from: Accounts.mintOwnerAccount, }); - expectedMintControllerState.controllers.controller1Account = zeroAddress; + expectedMintControllerState.controllers.controller1Account = ZERO_ADDRESS; await checkMINTp0( [token, mintController], [expectedTokenState, expectedMintControllerState] @@ -936,7 +952,8 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { it("bt049 incrementMinterAllowance(M,amt) reverts when minterAllowance[M] + amt > 2^256", async function () { const initialAmount = - "0x" + newBigNumber(maxAmount).sub(newBigNumber(45)).toString(16, 64); + "0x" + + newBigNumber(MAX_UINT256_HEX).sub(newBigNumber(45)).toString(16, 64); const incrementAmount = 64; await mintController.configureController( Accounts.controller1Account, @@ -1049,7 +1066,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { Accounts.minterAccount, { from: Accounts.mintOwnerAccount } ); - await mintController.configureMinter(maxAmount, { + await mintController.configureMinter(MAX_UINT256_HEX, { from: Accounts.controller1Account, }); @@ -1132,7 +1149,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { Accounts.minterAccount, { from: Accounts.mintOwnerAccount } ); - await mintController.configureMinter(maxAmount, { + await mintController.configureMinter(MAX_UINT256_HEX, { from: Accounts.controller1Account, }); @@ -1186,10 +1203,10 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { it("bt058 decrementMinterAllowance reverts when minterManager is 0", async function () { // set minterManager to zero - await mintController.setMinterManager(zeroAddress, { + await mintController.setMinterManager(ZERO_ADDRESS, { from: Accounts.mintOwnerAccount, }); - expectedMintControllerState.minterManager = zeroAddress; + expectedMintControllerState.minterManager = ZERO_ADDRESS; await checkMINTp0( [token, mintController], [expectedTokenState, expectedMintControllerState] @@ -1311,7 +1328,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { }); it("bt063 decrementMinterAllowance(M,amt) works when minterAllowance is MAX", async function () { - const amount = maxAmount; + const amount = MAX_UINT256_HEX; await mintController.configureController( Accounts.controller1Account, Accounts.minterAccount, @@ -1327,7 +1344,7 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { const minterAllowance = await minterManager.minterAllowance( Accounts.minterAccount ); - assert(minterAllowance.cmp(newBigNumber(maxAmount)) === 0); + assert(minterAllowance.cmp(newBigNumber(MAX_UINT256_HEX)) === 0); await mintController.decrementMinterAllowance(amount, { from: Accounts.controller1Account, }); diff --git a/test/minting/MintP0_EndToEndTests.js b/test/minting/MintP0_EndToEndTests.js index 9de45a70a..91051e628 100644 --- a/test/minting/MintP0_EndToEndTests.js +++ b/test/minting/MintP0_EndToEndTests.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MintController = artifacts.require("minting/MintController"); const MasterMinter = artifacts.require("minting/MasterMinter"); @@ -557,7 +575,10 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { variable: "minterAllowance.minterAccount", expectedValue: newBigNumber(5), }, - { variable: "balances.arbitraryAccount", expectedValue: newBigNumber(5) }, + { + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: newBigNumber(5), + }, { variable: "totalSupply", expectedValue: newBigNumber(5) } ); await checkMINTp0( @@ -643,7 +664,10 @@ async function run_MINT_tests(newToken, MintControllerArtifact) { expectedMintControllerState.controllers.arbitraryAccount = Accounts.minterAccount; expectedTokenState.push( - { variable: "balances.minterAccount", expectedValue: newBigNumber(5) }, + { + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: newBigNumber(5), + }, { variable: "totalSupply", expectedValue: newBigNumber(5) } ); await checkMINTp0( diff --git a/test/minting/MintP0_EventsTests.js b/test/minting/MintP0_EventsTests.js index 0ea216719..0a0a3a03f 100644 --- a/test/minting/MintP0_EventsTests.js +++ b/test/minting/MintP0_EventsTests.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MintController = artifacts.require("minting/MintController"); const MasterMinter = artifacts.require("minting/MasterMinter"); diff --git a/test/misc/publicToExternal.test.ts b/test/misc/publicToExternal.test.ts index 31e91a1a4..da66e76a3 100644 --- a/test/misc/publicToExternal.test.ts +++ b/test/misc/publicToExternal.test.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { ContractWithPublicFunctionsInstance, ContractWithExternalFunctionsInstance, diff --git a/test/util/ECRecover.test.ts b/test/util/ECRecover.test.ts index 31a13784a..5ef94a2e3 100644 --- a/test/util/ECRecover.test.ts +++ b/test/util/ECRecover.test.ts @@ -1,69 +1,109 @@ -import { ecSign, expectRevert } from "../helpers"; +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { bufferFromHexString, ecSign, expectRevert } from "../helpers"; import { ACCOUNTS_AND_KEYS, ZERO_BYTES32 } from "../helpers/constants"; import { EcRecoverTestInstance } from "../../@types/generated/EcRecoverTest"; +import { packSig } from "./SignatureChecker.test"; +import { toCompactSig } from "ethereumjs-util"; const ECRecoverTest = artifacts.require("ECRecoverTest"); -contract("ECRecover", (_accounts) => { +describe("ECRecover", () => { + const digest = web3.utils.keccak256("Hello world!"); + const [account1, account2, account3] = ACCOUNTS_AND_KEYS; + const sig1 = ecSign(digest, account1.key); + const sig2 = ecSign(digest, account2.key); + const sig3 = ecSign(digest, account3.key); + let ecRecover: EcRecoverTestInstance; beforeEach(async () => { ecRecover = await ECRecoverTest.new(); }); - describe("recover", () => { - const digest = web3.utils.keccak256("Hello world!"); - const [account1, account2, account3] = ACCOUNTS_AND_KEYS; - const sig1 = ecSign(digest, account1.key); - const sig2 = ecSign(digest, account2.key); - const sig3 = ecSign(digest, account3.key); - it("recovers signer address from a valid signature", async () => { expect(sig1).not.to.deep.equal(sig2); expect(sig1).not.to.deep.equal(sig3); expect(sig2).not.to.deep.equal(sig3); - expect(await ecRecover.recover(digest, sig1.v, sig1.r, sig1.s)).to.equal( + expect(await ecRecover.recover(digest, packSig(sig1))).to.equal( account1.address ); - expect(await ecRecover.recover(digest, sig2.v, sig2.r, sig2.s)).to.equal( + expect(await ecRecover.recover(digest, packSig(sig2))).to.equal( account2.address ); - expect(await ecRecover.recover(digest, sig3.v, sig3.r, sig3.s)).to.equal( + expect(await ecRecover.recover(digest, packSig(sig3))).to.equal( account3.address ); }); it("reverts if an invalid signature is given", async () => { await expectRevert( - ecRecover.recover(digest, 27, ZERO_BYTES32, ZERO_BYTES32), + ecRecover.recover( + digest, + packSig({ v: 27, r: ZERO_BYTES32, s: ZERO_BYTES32 }) + ), "invalid signature" ); }); it("reverts if an invalid v value is given", async () => { await expectRevert( - ecRecover.recover(digest, sig1.v - 2, sig1.r, sig1.s), + ecRecover.recover( + digest, + packSig({ v: sig1.v - 2, r: sig1.r, s: sig1.s }) + ), "invalid signature 'v' value" ); await expectRevert( - ecRecover.recover(digest, sig2.v - 2, sig2.r, sig2.s), + ecRecover.recover( + digest, + packSig({ v: sig2.v - 2, r: sig2.r, s: sig2.s }) + ), "invalid signature 'v' value" ); await expectRevert( - ecRecover.recover(digest, sig3.v - 2, sig3.r, sig3.s), + ecRecover.recover( + digest, + packSig({ v: sig3.v - 2, r: sig3.r, s: sig3.s }) + ), "invalid signature 'v' value" ); await expectRevert( - ecRecover.recover(digest, sig1.v + 2, sig1.r, sig1.s), + ecRecover.recover( + digest, + packSig({ v: sig1.v + 2, r: sig1.r, s: sig1.s }) + ), "invalid signature 'v' value" ); await expectRevert( - ecRecover.recover(digest, sig2.v + 2, sig2.r, sig2.s), + ecRecover.recover( + digest, + packSig({ v: sig2.v + 2, r: sig2.r, s: sig2.s }) + ), "invalid signature 'v' value" ); await expectRevert( - ecRecover.recover(digest, sig3.v + 2, sig3.r, sig3.s), + ecRecover.recover( + digest, + packSig({ v: sig3.v + 2, r: sig3.r, s: sig3.s }) + ), "invalid signature 'v' value" ); }); @@ -78,9 +118,22 @@ contract("ECRecover", (_accounts) => { "0xe0a0fc89be718fbc1033e1d30d78be1c68081562ed2e97af876f286f3453231d"; await expectRevert( - ecRecover.recover(dig, v, r, s), + ecRecover.recover(dig, packSig({ v, r, s })), "invalid signature 's' value" ); }); + + it("reverts if signature has incorrect length", async () => { + const compactSig: string = toCompactSig( + sig1.v, + bufferFromHexString(sig1.r), + bufferFromHexString(sig1.s) + ); + + await expectRevert( + ecRecover.recover(digest, compactSig), + "invalid signature length" + ); + }); }); }); diff --git a/test/util/EIP712Test.ts b/test/util/EIP712Test.ts index dde4a9513..254fb912d 100644 --- a/test/util/EIP712Test.ts +++ b/test/util/EIP712Test.ts @@ -1,9 +1,25 @@ -import crypto from "crypto"; +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { Eip712TestInstance } from "../../@types/generated"; import { wordlist } from "ethereum-cryptography/bip39/wordlists/english"; import sampleSize from "lodash/sampleSize"; -import { ACCOUNTS_AND_KEYS } from "../helpers/constants"; -import { prepend0x, strip0x, ecSign } from "../helpers"; +import { makeDomainSeparator } from "../helpers"; const EIP712Test = artifacts.require("EIP712Test"); @@ -39,48 +55,4 @@ contract("EIP712", (_accounts) => { ).to.equal(domainSeparator); }); }); - - describe("recover", () => { - it("recovers the signer's address from signed data", async () => { - const randomAccount = - ACCOUNTS_AND_KEYS[Math.floor(Math.random() * ACCOUNTS_AND_KEYS.length)]; - const randomData = prepend0x(crypto.randomBytes(256).toString("hex")); - const eip712Data = prepend0x( - "1901" + - strip0x(domainSeparator) + - strip0x(web3.utils.keccak256(randomData)) - ); - - const { v, r, s } = ecSign( - web3.utils.keccak256(eip712Data), - randomAccount.key - ); - - expect( - await eip712.recover(domainSeparator, v, r, s, randomData) - ).to.equal(randomAccount.address); - }); - }); }); - -function makeDomainSeparator( - name: string, - version: string, - chainId: number, - address: string -): string { - return web3.utils.keccak256( - web3.eth.abi.encodeParameters( - ["bytes32", "bytes32", "bytes32", "uint256", "address"], - [ - web3.utils.keccak256( - "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" - ), - web3.utils.keccak256(name), - web3.utils.keccak256(version), - chainId, - address, - ] - ) - ); -} diff --git a/test/util/MessageHashUtils.test.ts b/test/util/MessageHashUtils.test.ts new file mode 100644 index 000000000..8bda78dc3 --- /dev/null +++ b/test/util/MessageHashUtils.test.ts @@ -0,0 +1,56 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + bufferFromHexString, + hexStringFromBuffer, + makeDomainSeparator, +} from "../helpers"; +import { MessageHashUtilsTestInstance } from "../../@types/generated"; + +const MessageHashUtils = artifacts.require("MessageHashUtilsTest"); + +contract("MessageHashUtils", function () { + context("toTypedDataHash", function () { + it("returns the digest correctly", async function () { + const messageHashUtils: MessageHashUtilsTestInstance = await MessageHashUtils.new(); + const structhash: string = web3.utils.randomHex(32); + const domainSeparator: string = makeDomainSeparator( + "USD Coin", + "2", + 1, + messageHashUtils.address + ); + expect( + await messageHashUtils.toTypedDataHash(domainSeparator, structhash) + ).to.equal(hashTypedData(domainSeparator, structhash)); + }); + }); +}); + +function hashTypedData(domainSeparator: string, structHash: string): string { + return web3.utils.keccak256( + hexStringFromBuffer( + Buffer.concat( + ["0x1901", domainSeparator, structHash].map((str) => + bufferFromHexString(str) + ) + ) + ) + ); +} diff --git a/test/util/SignatureChecker.test.ts b/test/util/SignatureChecker.test.ts new file mode 100644 index 000000000..0024baf4a --- /dev/null +++ b/test/util/SignatureChecker.test.ts @@ -0,0 +1,200 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Signature, + ecSign, + hexStringFromBuffer, + packSignature, +} from "../helpers"; +import { + ACCOUNTS_AND_KEYS, + ZERO_ADDRESS, + ZERO_BYTES32, +} from "../helpers/constants"; +import { SignatureCheckerInstance } from "../../@types/generated/SignatureChecker"; +import { + MockErc1271WalletInstance, + MockErc1271WalletReturningBytes32Instance, + MockErc1271WalletWithCustomValidationInstance, + MockStateModifyingErc1271WalletInstance, +} from "../../@types/generated"; + +const SignatureChecker = artifacts.require("SignatureChecker"); +const MockERC1271Wallet = artifacts.require("MockERC1271Wallet"); +const MockERC1271WalletReturningBytes32 = artifacts.require( + "MockERC1271WalletReturningBytes32" +); +const MockERC1271WalletWithCustomValidation = artifacts.require( + "MockERC1271WalletWithCustomValidation" +); +const MockStateModifyingERC1271Wallet = artifacts.require( + "MockStateModifyingERC1271Wallet" +); + +describe("SignatureChecker", () => { + const digest = web3.utils.keccak256("Hello world!"); + const [account1, account2, account3] = ACCOUNTS_AND_KEYS; + const sig1 = ecSign(digest, account1.key); + const sig2 = ecSign(digest, account2.key); + const sig3 = ecSign(digest, account3.key); + + let signatureChecker: SignatureCheckerInstance; + let standardWallet: MockErc1271WalletInstance; + let walletReturningBytes32: MockErc1271WalletReturningBytes32Instance; + let customWallet: MockErc1271WalletWithCustomValidationInstance; + let stateModifyingWallet: MockStateModifyingErc1271WalletInstance; + + beforeEach(async () => { + signatureChecker = await SignatureChecker.new(); + standardWallet = await MockERC1271Wallet.new(account1.address); + walletReturningBytes32 = await MockERC1271WalletReturningBytes32.new(); + customWallet = await MockERC1271WalletWithCustomValidation.new( + account1.address + ); + stateModifyingWallet = await MockStateModifyingERC1271Wallet.new(); + }); + + context("EOA Wallet", () => { + it("returns true when given a valid signature", async () => { + expect(sig1).not.to.deep.equal(sig2); + expect(sig1).not.to.deep.equal(sig3); + expect(sig2).not.to.deep.equal(sig3); + + await expectValidSignature(account1.address, digest, packSig(sig1)); + await expectValidSignature(account2.address, digest, packSig(sig2)); + await expectValidSignature(account3.address, digest, packSig(sig3)); + }); + + it("returns false when given a invalid signature", async () => { + expect( + await signatureChecker.isValidSignatureNow( + account1.address, + digest, + packSig(sig2) + ) + ).to.equal(false); + }); + + it("returns false if signer is zero address", async () => { + expect( + await signatureChecker.isValidSignatureNow( + ZERO_ADDRESS, + digest, + packSig(sig1) + ) + ).to.equal(false); + }); + }); + + context("AA Wallet - standard", () => { + it("returns true when given a valid signature", async () => { + await expectValidSignature(standardWallet.address, digest, packSig(sig1)); + }); + + it("returns false when given a invalid signature", async () => { + await expectInvalidSignature( + standardWallet.address, + digest, + packSig(sig2) + ); + }); + }); + + context("AA Wallet - walletReturningBytes32", () => { + it("returns false when given a signature", async () => { + await expectInvalidSignature( + walletReturningBytes32.address, + digest, + packSig(sig1) + ); + }); + }); + + context("AA Wallet - custom validation", () => { + it("returns true when wallet considers signature to be valid", async () => { + await customWallet.setSignatureValid(true); + await expectValidSignature(customWallet.address, ZERO_BYTES32, "0x0"); + }); + + it("returns false when wallet considers signature to be invalid", async () => { + await customWallet.setSignatureValid(false); + await expectInvalidSignature(customWallet.address, ZERO_BYTES32, "0x0"); + }); + }); + + context("AA Wallet - state modifying", () => { + it("returns false for wallet contracts that omit the `view` modifier", async () => { + expect(await stateModifyingWallet.evoked()).to.equal(false); + + await expectInvalidSignature( + stateModifyingWallet.address, + ZERO_BYTES32, + "0x0" + ); + + // isValidSignature inside mock wallet is never evoked + expect(await stateModifyingWallet.evoked()).to.equal(false); + }); + }); + + async function expectSignatureValidationResult( + accountAddress: string, + digest: string, + signature: string, + expectValidSignature: boolean + ) { + expect( + await signatureChecker.isValidSignatureNow( + accountAddress, + digest, + signature + ) + ).to.equal(expectValidSignature); + } + + async function expectValidSignature( + accountAddress: string, + digest: string, + signature: string + ) { + await expectSignatureValidationResult( + accountAddress, + digest, + signature, + true + ); + } + + async function expectInvalidSignature( + accountAddress: string, + digest: string, + signature: string + ) { + await expectSignatureValidationResult( + accountAddress, + digest, + signature, + false + ); + } +}); + +export function packSig(sig: Signature): string { + return hexStringFromBuffer(packSignature(sig)); +} diff --git a/test/v1.1/FiatTokenV1_1.test.ts b/test/v1.1/FiatTokenV1_1.test.ts index 82cf59dc0..d798a0027 100644 --- a/test/v1.1/FiatTokenV1_1.test.ts +++ b/test/v1.1/FiatTokenV1_1.test.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { behavesLikeRescuable } from "./Rescuable.behavior"; import { FiatTokenV11Instance, diff --git a/test/v1.1/Rescuable.behavior.ts b/test/v1.1/Rescuable.behavior.ts index 1b1ad26c3..27727eaf3 100644 --- a/test/v1.1/Rescuable.behavior.ts +++ b/test/v1.1/Rescuable.behavior.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { RescuableInstance } from "../../@types/generated/Rescuable"; import { expectRevert } from "../helpers"; import { DummyErc20Instance } from "../../@types/generated"; diff --git a/test/v1.1/Rescuable.test.ts b/test/v1.1/Rescuable.test.ts index 04d81252b..d22b740b0 100644 --- a/test/v1.1/Rescuable.test.ts +++ b/test/v1.1/Rescuable.test.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { RescuableInstance } from "../../@types/generated/Rescuable"; import { behavesLikeRescuable } from "./Rescuable.behavior"; import { ZERO_ADDRESS } from "../helpers/constants"; diff --git a/test/v1/FiatTokenV1.test.ts b/test/v1/FiatTokenV1.test.ts index 04eef0daf..376ec1a81 100644 --- a/test/v1/FiatTokenV1.test.ts +++ b/test/v1/FiatTokenV1.test.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { usesOriginalStorageSlotPositions } from "../helpers/storageSlots.behavior"; const FiatTokenV1 = artifacts.require("FiatTokenV1"); diff --git a/test/v1/Pausable.test.js b/test/v1/Pausable.test.js index ffd55650e..e533bb68e 100644 --- a/test/v1/Pausable.test.js +++ b/test/v1/Pausable.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const { expectRevert, deployerAccount, diff --git a/test/v1/TokenTestUtils.js b/test/v1/TokenTestUtils.js index c5ab49002..d4ab9012a 100644 --- a/test/v1/TokenTestUtils.js +++ b/test/v1/TokenTestUtils.js @@ -1,17 +1,38 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const util = require("util"); const _ = require("lodash"); const BN = require("bn.js"); const Q = require("q"); const BigNumber = require("bignumber.js"); +const { + arbitraryAccount, + tokenOwnerAccount, + masterMinterAccount, + minterAccount, + pauserAccount, + blacklisterAccount, + proxyOwnerAccount, + upgraderAccount, +} = require("./helpers/tokenTest"); const FiatTokenV1 = artifacts.require("FiatTokenV1"); -const UpgradedFiatToken = artifacts.require("UpgradedFiatToken"); -const UpgradedFiatTokenNewFields = artifacts.require( - "UpgradedFiatTokenNewFieldsTest" -); -const UpgradedFiatTokenNewFieldsNewLogic = artifacts.require( - "UpgradedFiatTokenNewFieldsNewLogicTest" -); const FiatTokenProxy = artifacts.require("FiatTokenProxy"); const name = "Sample Fiat Token"; @@ -20,42 +41,6 @@ const currency = "USD"; const decimals = 2; const trueInStorageFormat = "0x01"; const bigZero = new BN(0); -const bigHundred = new BN(100); -const maxAmount = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; -const nullAccount = "0x0000000000000000000000000000000000000000"; -const deployerAccount = "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"; // accounts[0] -const arbitraryAccount = "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0"; // accounts[1] -const tokenOwnerAccount = "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d"; // accounts[3] -const blacklisterAccount = "0xd03ea8624C8C5987235048901fB614fDcA89b117"; // accounts[4] -const arbitraryAccount2 = "0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC"; // accounts[5] -const masterMinterAccount = "0x3E5e9111Ae8eB78Fe1CC3bb8915d5D461F3Ef9A9"; // accounts[6] -const minterAccount = "0x28a8746e75304c0780E011BEd21C72cD78cd535E"; // accounts[7] -const pauserAccount = "0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E"; // accounts[8] - -const proxyOwnerAccount = "0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598"; // accounts[14] -const upgraderAccount = proxyOwnerAccount; // accounts[14] - -const deployerAccountPrivateKey = - "4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"; // accounts[0] -const arbitraryAccountPrivateKey = - "6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1"; // accounts[1]; -const tokenOwnerPrivateKey = - "646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a7913"; // accounts[3] -const blacklisterAccountPrivateKey = - "add53f9a7e588d003326d1cbf9e4a43c061aadd9bc938c843a79e7b4fd2ad743"; // accounts[4] -const arbitraryAccount2PrivateKey = - "395df67f0c2d2d9fe1ad08d1bc8b6627011959b79c53d7dd6a3536a33ab8a4fd"; // accounts[5] -const masterMinterAccountPrivateKey = - "e485d098507f54e7733a205420dfddbe58db035fa577fc294ebd14db90767a52"; // accounts[6] -const minterAccountPrivateKey = - "a453611d9419d0e56f499079478fd72c37b251a94bfde4d19872c44cf65386e3"; // accounts[7] -const pauserAccountPrivateKey = - "829e924fdf021ba3dbbc4225edfece9aca04b929d6e75613329ca6f1d31c0bb4"; // accounts[9] -const proxyOwnerAccountPrivateKey = - "21d7212f3b4e5332fd465877b64926e3532653e2798a11255a46f533852dfe46"; // accounts[14] -const upgraderAccountPrivateKey = proxyOwnerAccountPrivateKey; -// var blacklisterAccountPrivateKey = "b0057716d5917badaf911b193b12b910811c1497b5bada8d7711f758981c3773"; // accounts[9] const adminSlot = "0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b"; @@ -84,43 +69,6 @@ async function expectError(contractPromise, errorMsg) { } } -function checkBlacklistEvent(blacklistEvent, account) { - assert.strictEqual(blacklistEvent.logs[0].event, "Blacklisted"); - assert.strictEqual(blacklistEvent.logs[0].args._account, account); -} - -function checkUnblacklistEvent(unblacklistEvent, account) { - assert.strictEqual(unblacklistEvent.logs[0].event, "UnBlacklisted"); - assert.strictEqual(unblacklistEvent.logs[0].args._account, account); -} - -function checkMintEvent(minting, to, amount, minter) { - // Mint Event - assert.strictEqual(minting.logs[0].event, "Mint"); - assert.strictEqual(minting.logs[0].args.minter, minter); - assert.strictEqual(minting.logs[0].args.to, to); - assert.isTrue(minting.logs[0].args.amount.eq(new BN(amount))); - - // Transfer from 0 Event - assert.strictEqual(minting.logs[1].event, "Transfer"); - assert.strictEqual(minting.logs[1].args.from, nullAccount); - assert.strictEqual(minting.logs[1].args.to, to); - assert.isTrue(minting.logs[1].args.value.eq(new BN(amount))); -} - -function checkBurnEvents(burning, amount, burner) { - // Burn Event - assert.strictEqual(burning.logs[0].event, "Burn"); - assert.strictEqual(burning.logs[0].args.burner, burner); - assert.isTrue(burning.logs[0].args.amount.eq(new BN(amount))); - - // Transfer to 0 Event - assert.strictEqual(burning.logs[1].event, "Transfer"); - assert.strictEqual(burning.logs[1].args.from, burner); - assert.strictEqual(burning.logs[1].args.to, nullAccount); - assert.isTrue(burning.logs[1].args.value.eq(new BN(amount))); -} - // Creates a state object, with default values replaced by // customVars where appropriate. function buildExpectedState(token, customVars) { @@ -137,7 +85,7 @@ function buildExpectedState(token, customVars) { proxiedTokenAddress: token.proxiedTokenAddress, initializedV1: trueInStorageFormat, upgrader: proxyOwnerAccount, - balances: { + balanceAndBlacklistStates: { arbitraryAccount: bigZero, masterMinterAccount: bigZero, minterAccount: bigZero, @@ -262,7 +210,6 @@ function buildExpectedState(token, customVars) { ); } } else { - // TODO: test the error throw new Error( "variable " + customVars[i].variable + " not found in expectedState" ); @@ -537,7 +484,7 @@ async function getActualState(token) { proxiedTokenAddress: hexToAddress(proxiedTokenAddress), upgrader: hexToAddress(upgrader), initializedV1, - balances: { + balanceAndBlacklistStates: { arbitraryAccount: balancesA, masterMinterAccount: balancesMM, minterAccount: balancesM, @@ -646,65 +593,6 @@ async function getActualState(token) { ); } -async function setMinter(token, minter, amount) { - const update = await token.configureMinter(minter, amount, { - from: masterMinterAccount, - }); - assert.strictEqual(update.logs[0].event, "MinterConfigured"); - assert.strictEqual(update.logs[0].args.minter, minter); - assert.isTrue(update.logs[0].args.minterAllowedAmount.eq(new BN(amount))); - const minterAllowance = await token.minterAllowance(minter); - - assert.isTrue(minterAllowance.eq(new BN(amount))); -} - -async function burn(token, amount, burner) { - const burning = await token.burn(amount, { from: burner }); - checkBurnEvents(burning, amount, burner); -} - -async function mint(token, to, amount, minter) { - await setMinter(token, minter, amount); - await mintRaw(token, to, amount, minter); -} - -async function mintRaw(token, to, amount, minter) { - const initialTotalSupply = await token.totalSupply(); - const initialMinterAllowance = await token.minterAllowance(minter); - const minting = await token.mint(to, amount, { from: minter }); - checkMintEvent(minting, to, amount, minter); - - const totalSupply = await token.totalSupply(); - assert.isTrue(totalSupply.eq(initialTotalSupply.add(new BN(amount)))); - const minterAllowance = await token.minterAllowance(minter); - assert.isTrue(initialMinterAllowance.sub(new BN(amount)).eq(minterAllowance)); -} - -async function blacklist(token, account) { - const blacklist = await token.blacklist(account, { - from: blacklisterAccount, - }); - checkBlacklistEvent(blacklist, account); -} - -async function unBlacklist(token, account) { - const unblacklist = await token.unBlacklist(account, { - from: blacklisterAccount, - }); - checkUnblacklistEvent(unblacklist, account); -} - -async function approve(token, to, amount, from) { - await token.approve(to, amount, { from }); -} - -async function redeem(token, account, amount) { - const redeemResult = await token.redeem(amount, { from: account }); - assert.strictEqual(redeemResult.logs[0].event, "Redeem"); - assert.strictEqual(redeemResult.logs[0].args.redeemedAddress, account); - assert.isTrue(redeemResult.logs[0].args.amount.eq(new BN(amount))); -} - async function initializeTokenWithProxy(rawToken) { return customInitializeTokenWithProxy( rawToken, @@ -746,19 +634,6 @@ async function customInitializeTokenWithProxy( return tokenConfig; } -async function upgradeTo(proxy, upgradedToken, proxyUpgraderAccount) { - if (proxyUpgraderAccount == null) { - proxyUpgraderAccount = proxyOwnerAccount; - } - await proxy.upgradeTo(upgradedToken.address, { from: proxyUpgraderAccount }); - const proxiedToken = await FiatTokenV1.at(proxy.address); - assert.strictEqual(proxiedToken.address, proxy.address); - return { - proxy, - token: proxiedToken, - }; -} - async function expectRevert(contractPromise) { try { await contractPromise; @@ -822,50 +697,10 @@ async function checkMINTp0(_contracts, _customVars) { } module.exports = { - FiatTokenV1, - FiatTokenProxy, - UpgradedFiatToken, - UpgradedFiatTokenNewFields, - UpgradedFiatTokenNewFieldsNewLogic, - name, - symbol, - currency, - decimals, bigZero, - bigHundred, - debugLogging, - maxAmount, checkMINTp0, - mint, - burn, - blacklist, - unBlacklist, - approve, - redeem, - initializeTokenWithProxy, - upgradeTo, expectRevert, expectError, - nullAccount, - deployerAccount, - arbitraryAccount, - tokenOwnerAccount, - arbitraryAccount2, - masterMinterAccount, - minterAccount, - pauserAccount, - blacklisterAccount, - proxyOwnerAccount, - proxyOwnerAccountPrivateKey, - upgraderAccount, - arbitraryAccountPrivateKey, - upgraderAccountPrivateKey, - tokenOwnerPrivateKey, - blacklisterAccountPrivateKey, - arbitraryAccount2PrivateKey, - masterMinterAccountPrivateKey, - minterAccountPrivateKey, - pauserAccountPrivateKey, - deployerAccountPrivateKey, + initializeTokenWithProxy, newBigNumber, }; diff --git a/test/v1/abiHacking.test.js b/test/v1/abiHacking.test.js index 14f02e8ad..ca82183ef 100644 --- a/test/v1/abiHacking.test.js +++ b/test/v1/abiHacking.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const { Transaction } = require("ethereumjs-tx"); const wrapTests = require("./helpers/wrapTests"); const { diff --git a/test/v1/events.test.js b/test/v1/events.test.js index 4926d3690..26a8a154e 100644 --- a/test/v1/events.test.js +++ b/test/v1/events.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const wrapTests = require("./helpers/wrapTests"); const { FiatTokenV1, @@ -25,14 +43,14 @@ const { checkBlacklisterChangedEvent, checkUpgradeEvent, checkAdminChangedEvent, - UpgradedFiatTokenNewFields, + deployUpgradedFiatTokenNewFields, checkPauseEvent, checkTransferEvents, } = require("./helpers/tokenTest"); const amount = 100; -function runTests(_newToken, _accounts) { +function runTests(_newToken, _accounts, version) { let proxy, token; beforeEach(async () => { @@ -110,7 +128,7 @@ function runTests(_newToken, _accounts) { }); it("et008 should check Upgraded event", async () => { - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const initializeData = encodeCall( "initV2", ["bool", "address", "uint256"], diff --git a/test/v1/extendedPositive.test.js b/test/v1/extendedPositive.test.js index 8603290f0..d023471e4 100644 --- a/test/v1/extendedPositive.test.js +++ b/test/v1/extendedPositive.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const BN = require("bn.js"); const wrapTests = require("./helpers/wrapTests"); const { @@ -10,13 +28,13 @@ const { minterAccount, pauserAccount, initializeTokenWithProxy, - UpgradedFiatToken, + deployUpgradedFiatToken, upgradeTo, } = require("./helpers/tokenTest"); const amount = 100; -function runTests(newToken, _accounts) { +function runTests(newToken, _accounts, version) { let proxy, token; beforeEach(async () => { @@ -112,7 +130,7 @@ function runTests(newToken, _accounts) { }); it("ept008 should upgrade while paused", async () => { - const newRawToken = await UpgradedFiatToken.new(); + const newRawToken = await deployUpgradedFiatToken(version); await token.pause({ from: pauserAccount }); const tokenConfig = await upgradeTo(proxy, newRawToken); const newProxiedToken = tokenConfig.token; @@ -248,7 +266,7 @@ function runTests(newToken, _accounts) { it("ept022 should upgrade when msg.sender blacklisted", async () => { await token.blacklist(upgraderAccount, { from: blacklisterAccount }); - const newRawToken = await UpgradedFiatToken.new(); + const newRawToken = await deployUpgradedFiatToken(version); const tokenConfig = await upgradeTo(proxy, newRawToken); const newProxiedToken = tokenConfig.token; @@ -260,7 +278,7 @@ function runTests(newToken, _accounts) { }); it("ept023 should upgrade to blacklisted address", async () => { - const newRawToken = await UpgradedFiatToken.new(); + const newRawToken = await deployUpgradedFiatToken(version); await token.blacklist(newRawToken.address, { from: blacklisterAccount }); const tokenConfig = await upgradeTo(proxy, newRawToken); diff --git a/test/v1/helpers/abi.js b/test/v1/helpers/abi.js index 402c65721..e6eddea41 100644 --- a/test/v1/helpers/abi.js +++ b/test/v1/helpers/abi.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const { Transaction } = require("ethereumjs-tx"); async function makeRawTransaction(data, from, hexPrivateKey, contractAddress) { diff --git a/test/v1/helpers/tokenTest.js b/test/v1/helpers/tokenTest.js index a223104b1..4dfb3a94b 100644 --- a/test/v1/helpers/tokenTest.js +++ b/test/v1/helpers/tokenTest.js @@ -1,14 +1,43 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const util = require("util"); const abi = require("ethereumjs-abi"); const _ = require("lodash"); const BN = require("bn.js"); const Q = require("q"); +const { + accounts, + accountPrivateKeys, + ZERO_ADDRESS, +} = require("../../helpers/constants"); + const FiatTokenV1 = artifacts.require("FiatTokenV1"); const UpgradedFiatToken = artifacts.require("UpgradedFiatToken"); +const SignatureChecker = artifacts.require("SignatureChecker"); +const UpgradedFiatTokenV2_2 = artifacts.require("UpgradedFiatTokenV2_2"); const UpgradedFiatTokenNewFields = artifacts.require( "UpgradedFiatTokenNewFieldsTest" ); +const UpgradedFiatTokenV2_2NewFields = artifacts.require( + "UpgradedFiatTokenV2_2NewFieldsTest" +); const UpgradedFiatTokenNewFieldsNewLogic = artifacts.require( "UpgradedFiatTokenNewFieldsNewLogicTest" ); @@ -22,43 +51,33 @@ const trueInStorageFormat = "0x01"; const bigZero = new BN(0); const bigHundred = new BN(100); -const nullAccount = "0x0000000000000000000000000000000000000000"; -const deployerAccount = "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"; // accounts[0] -const arbitraryAccount = "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0"; // accounts[1] -const tokenOwnerAccount = "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d"; // accounts[3] -const blacklisterAccount = "0xd03ea8624C8C5987235048901fB614fDcA89b117"; // accounts[4] -const arbitraryAccount2 = "0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC"; // accounts[5] -const masterMinterAccount = "0x3E5e9111Ae8eB78Fe1CC3bb8915d5D461F3Ef9A9"; // accounts[6] -const minterAccount = "0x28a8746e75304c0780E011BEd21C72cD78cd535E"; // accounts[7] -const pauserAccount = "0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E"; // accounts[8] -const rescuerAccount = "0x1dF62f291b2E969fB0849d99D9Ce41e2F137006e"; // accounts[9] -const lostAndFoundAccount = "0x610Bb1573d1046FCb8A70Bbbd395754cD57C2b60"; // accounts[10] - -const proxyOwnerAccount = "0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598"; // accounts[14] +const { + deployerAccount, + arbitraryAccount, + tokenOwnerAccount, + blacklisterAccount, + arbitraryAccount2, + masterMinterAccount, + minterAccount, + pauserAccount, + proxyOwnerAccount, + rescuerAccount, + lostAndFoundAccount, +} = accounts; +const { + deployerAccount: deployerAccountPrivateKey, + arbitraryAccount: arbitraryAccountPrivateKey, + tokenOwnerAccount: tokenOwnerPrivateKey, + blacklisterAccount: blacklisterAccountPrivateKey, + arbitraryAccount2: arbitraryAccount2PrivateKey, + masterMinterAccount: masterMinterAccountPrivateKey, + minterAccount: minterAccountPrivateKey, + pauserAccount: pauserAccountPrivateKey, + proxyOwnerAccount: proxyOwnerAccountPrivateKey, + rescuerAccount: rescuerAccountPrivateKey, + lostAndFoundAccount: lostAndFoundAccountPrivateKey, +} = accountPrivateKeys; const upgraderAccount = proxyOwnerAccount; - -const deployerAccountPrivateKey = - "4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d"; // accounts[0] -const arbitraryAccountPrivateKey = - "6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1"; // accounts[1]; -const tokenOwnerPrivateKey = - "646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a7913"; // accounts[3] -const blacklisterAccountPrivateKey = - "add53f9a7e588d003326d1cbf9e4a43c061aadd9bc938c843a79e7b4fd2ad743"; // accounts[4] -const arbitraryAccount2PrivateKey = - "395df67f0c2d2d9fe1ad08d1bc8b6627011959b79c53d7dd6a3536a33ab8a4fd"; // accounts[5] -const masterMinterAccountPrivateKey = - "e485d098507f54e7733a205420dfddbe58db035fa577fc294ebd14db90767a52"; // accounts[6] -const minterAccountPrivateKey = - "a453611d9419d0e56f499079478fd72c37b251a94bfde4d19872c44cf65386e3"; // accounts[7] -const pauserAccountPrivateKey = - "829e924fdf021ba3dbbc4225edfece9aca04b929d6e75613329ca6f1d31c0bb4"; // accounts[8] -const rescuerAccountPrivateKey = - "b0057716d5917badaf911b193b12b910811c1497b5bada8d7711f758981c3773"; // accounts[9] -const lostAndFoundAccountPrivateKey = - "77c5495fbb039eed474fc940f29955ed0531693cc9212911efd35dff0373153f"; // accounts[10] -const proxyOwnerAccountPrivateKey = - "21d7212f3b4e5332fd465877b64926e3532653e2798a11255a46f533852dfe46"; // accounts[14] const upgraderAccountPrivateKey = proxyOwnerAccountPrivateKey; const adminSlot = @@ -193,7 +212,7 @@ function checkMintEvent(minting, to, amount, minter) { // Transfer from 0 Event assert.strictEqual(minting.logs[1].event, "Transfer"); - assert.strictEqual(minting.logs[1].args.from, nullAccount); + assert.strictEqual(minting.logs[1].args.from, ZERO_ADDRESS); assert.strictEqual(minting.logs[1].args.to, to); assert.isTrue(minting.logs[1].args.value.eq(new BN(amount))); } @@ -207,7 +226,7 @@ function checkBurnEvents(burning, amount, burner) { // Transfer to 0 Event assert.strictEqual(burning.logs[1].event, "Transfer"); assert.strictEqual(burning.logs[1].args.from, burner); - assert.strictEqual(burning.logs[1].args.to, nullAccount); + assert.strictEqual(burning.logs[1].args.to, ZERO_ADDRESS); assert.isTrue(burning.logs[1].args.value.eq(new BN(amount))); } @@ -227,7 +246,7 @@ function buildExpectedState(token, customVars) { proxiedTokenAddress: token.proxiedTokenAddress, initializedV1: trueInStorageFormat, upgrader: proxyOwnerAccount, - balances: { + balanceAndBlacklistStates: { arbitraryAccount: bigZero, masterMinterAccount: bigZero, minterAccount: bigZero, @@ -626,7 +645,7 @@ async function getActualState(token) { proxiedTokenAddress: hexToAddress(proxiedTokenAddress), upgrader: hexToAddress(upgrader), initializedV1, - balances: { + balanceAndBlacklistStates: { arbitraryAccount: balancesA, masterMinterAccount: balancesMM, minterAccount: balancesM, @@ -959,10 +978,31 @@ async function getInitializedV1(token) { return initialized; } +async function deployUpgradedFiatToken(version) { + if (version < 2.2) { + return UpgradedFiatToken.new(); + } else { + await SignatureChecker.new(); + UpgradedFiatTokenV2_2.link(SignatureChecker); + return UpgradedFiatTokenV2_2.new(); + } +} + +async function deployUpgradedFiatTokenNewFields(version) { + if (version < 2.2) { + return UpgradedFiatTokenNewFields.new(); + } else { + await SignatureChecker.new(); + UpgradedFiatTokenV2_2NewFields.link(SignatureChecker); + return UpgradedFiatTokenV2_2NewFields.new(); + } +} + module.exports = { FiatTokenV1, FiatTokenProxy, UpgradedFiatToken, + UpgradedFiatTokenV2_2, UpgradedFiatTokenNewFields, UpgradedFiatTokenNewFieldsNewLogic, name, @@ -993,6 +1033,8 @@ module.exports = { buildExpectedState, checkVariables, setMinter, + deployUpgradedFiatToken, + deployUpgradedFiatTokenNewFields, mint, burn, mintRaw, @@ -1009,7 +1051,7 @@ module.exports = { expectRevert, encodeCall, getInitializedV1, - nullAccount, + nullAccount: ZERO_ADDRESS, deployerAccount, arbitraryAccount, tokenOwnerAccount, diff --git a/test/v1/helpers/wrapTests.js b/test/v1/helpers/wrapTests.js index 34f2bdc14..8276769e9 100644 --- a/test/v1/helpers/wrapTests.js +++ b/test/v1/helpers/wrapTests.js @@ -1,34 +1,48 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const FiatTokenV1 = artifacts.require("FiatTokenV1"); const FiatTokenV1_1 = artifacts.require("FiatTokenV1_1"); const FiatTokenV2 = artifacts.require("FiatTokenV2"); - -// The following helpers make fresh original/upgraded tokens before each test. - -function newFiatTokenV1() { - return FiatTokenV1.new(); -} - -function newFiatTokenV1_1() { - return FiatTokenV1_1.new(); -} - -function newFiatTokenV2() { - return FiatTokenV2.new(); -} +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); // Executes the run_tests_function using an original and // an upgraded token. The test_suite_name is printed standard output. function wrapTests(testSuiteName, runTestsFunction) { contract(`FiatTokenV1: ${testSuiteName}`, (accounts) => { - runTestsFunction(newFiatTokenV1, accounts); + runTestsFunction(FiatTokenV1.new, accounts, 1); }); contract(`FiatTokenV1_1: ${testSuiteName}`, (accounts) => { - runTestsFunction(newFiatTokenV1_1, accounts); + runTestsFunction(FiatTokenV1_1.new, accounts, 1.1); }); contract(`FiatTokenV2: ${testSuiteName}`, (accounts) => { - runTestsFunction(newFiatTokenV2, accounts); + runTestsFunction(FiatTokenV2.new, accounts, 2); + }); + + contract(`FiatTokenV2_1: ${testSuiteName}`, (accounts) => { + runTestsFunction(FiatTokenV2_1.new, accounts, 2.1); + }); + + contract(`FiatTokenV2_2: ${testSuiteName}`, (accounts) => { + runTestsFunction(FiatTokenV2_2.new, accounts, 2.2); }); } diff --git a/test/v1/legacy.test.js b/test/v1/legacy.test.js index a4373a93a..6418d6c5e 100644 --- a/test/v1/legacy.test.js +++ b/test/v1/legacy.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const BN = require("bn.js"); const wrapTests = require("./helpers/wrapTests"); const { @@ -27,16 +45,15 @@ const { initializeTokenWithProxy, upgradeTo, UpgradedFiatToken, - FiatTokenV1, getAdmin, } = require("./helpers/tokenTest"); // these tests are for reference and do not track side effects on all variables -function runTests(_newToken, accounts) { +function runTests(newToken, accounts, version) { let proxy, token; beforeEach(async () => { - const rawToken = await FiatTokenV1.new(); + const rawToken = await newToken(); const tokenConfig = await initializeTokenWithProxy(rawToken); ({ proxy, token } = tokenConfig); assert.strictEqual(proxy.address, token.address); @@ -428,24 +445,50 @@ function runTests(_newToken, accounts) { assert.isTrue(new BN(balance).eqn(1900)); }); - it("should blacklist and make approve impossible", async () => { - await mint(token, accounts[1], 1900, minterAccount); - await blacklist(token, accounts[1]); + if (version < 2.2) { + it("should blacklist and make approve impossible", async () => { + await mint(token, accounts[1], 1900, minterAccount); + await blacklist(token, accounts[1]); - await expectRevert(token.approve(accounts[2], 600, { from: accounts[1] })); - const approval = await token.allowance(accounts[1], accounts[2]); - assert.isTrue(new BN(approval).eqn(0)); - }); + await expectRevert( + token.approve(accounts[2], 600, { from: accounts[1] }) + ); + const approval = await token.allowance(accounts[1], accounts[2]); + assert.isTrue(new BN(approval).eqn(0)); + }); - it("should make giving approval to blacklisted account impossible", async () => { - await mint(token, accounts[2], 1900, minterAccount); - await blacklist(token, accounts[1]); + it("should make giving approval to blacklisted account impossible", async () => { + await mint(token, accounts[2], 1900, minterAccount); + await blacklist(token, accounts[1]); - await expectRevert(token.approve(accounts[1], 600, { from: accounts[2] })); + await expectRevert( + token.approve(accounts[1], 600, { from: accounts[2] }) + ); - const approval = await token.allowance(accounts[2], accounts[1]); - assert.isTrue(new BN(approval).eqn(0)); - }); + const approval = await token.allowance(accounts[2], accounts[1]); + assert.isTrue(new BN(approval).eqn(0)); + }); + } else { + // version >= 2.2 + + it("should approve when owner is blacklisted", async () => { + await mint(token, accounts[1], 1900, minterAccount); + await blacklist(token, accounts[1]); + + await approve(token, accounts[1], 100, accounts[2]); + const allowance = await token.allowance(accounts[2], accounts[1]); + assert.isTrue(new BN(allowance).eqn(100)); + }); + + it("should approve when spender is blacklisted", async () => { + await mint(token, accounts[2], 1900, minterAccount); + await blacklist(token, accounts[2]); + + await approve(token, accounts[1], 100, accounts[2]); + const allowance = await token.allowance(accounts[2], accounts[1]); + assert.isTrue(new BN(allowance).eqn(100)); + }); + } it("should blacklist then unblacklist to make a transfer possible", async () => { await mint(token, accounts[2], 1900, minterAccount); diff --git a/test/v1/misc.test.js b/test/v1/misc.test.js index db9f82ab1..b167251c2 100644 --- a/test/v1/misc.test.js +++ b/test/v1/misc.test.js @@ -1,4 +1,30 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const BN = require("bn.js"); +const { + POW_2_255_HEX, + POW_2_255_BN, + POW_2_255_MINUS1_BN, + POW_2_255_MINUS1_HEX, + MAX_UINT256_HEX, + MAX_UINT256_BN, +} = require("../helpers/constants"); const wrapTests = require("./helpers/wrapTests"); const { checkVariables, @@ -15,12 +41,9 @@ const { FiatTokenProxy, } = require("./helpers/tokenTest"); -const maxAmount = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; -const maxAmountBN = new BN(maxAmount.slice(2), 16); const amount = 100; -function runTests(newToken, _accounts) { +function runTests(newToken, _accounts, version) { let proxy, token; beforeEach(async () => { @@ -65,7 +88,7 @@ function runTests(newToken, _accounts) { }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -92,7 +115,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -121,7 +144,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -152,7 +175,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -184,7 +207,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -258,7 +281,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount2), }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount1 + mintAmount2), }, { @@ -289,7 +312,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount1), }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount1 + mintAmount2), }, { @@ -362,7 +385,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -431,7 +454,7 @@ function runTests(newToken, _accounts) { { variable: "isAccountBlacklisted.minterAccount", expectedValue: true }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, ]; @@ -459,7 +482,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(mintAmount + mintAmount), }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount + mintAmount), }, ]; @@ -491,11 +514,11 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount2), }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(mintAmount1), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount2), }, { @@ -519,11 +542,11 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount2), }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(mintAmount1 - burnAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount2 - burnAmount), }, { @@ -635,7 +658,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -678,7 +701,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -723,33 +746,40 @@ function runTests(newToken, _accounts) { }); it("ms047 configureMinter works on amount=2^256-1", async () => { - await token.configureMinter(minterAccount, maxAmount, { + await token.configureMinter(minterAccount, MAX_UINT256_HEX, { from: masterMinterAccount, }); const customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { variable: "minterAllowance.minterAccount", - expectedValue: maxAmountBN, + expectedValue: MAX_UINT256_BN, }, ]; await checkVariables([token], [customVars]); }); - it("ms048 mint works on amount=2^256-1", async () => { - await token.configureMinter(minterAccount, maxAmount, { + it(`ms048 mint works on amount=${ + version < 2.2 ? "2^256-1" : "2^255-1" + }`, async () => { + const [amount, amountBN] = + version < 2.2 + ? [MAX_UINT256_HEX, MAX_UINT256_BN] + : [POW_2_255_MINUS1_HEX, POW_2_255_MINUS1_BN]; + + await token.configureMinter(minterAccount, amount, { from: masterMinterAccount, }); let customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { variable: "minterAllowance.minterAccount", - expectedValue: maxAmountBN, + expectedValue: amountBN, }, ]; await checkVariables([token], [customVars]); - await token.mint(arbitraryAccount, maxAmount, { from: minterAccount }); + await token.mint(arbitraryAccount, amount, { from: minterAccount }); customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { @@ -757,30 +787,70 @@ function runTests(newToken, _accounts) { expectedValue: new BN(0), }, { - variable: "balances.arbitraryAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: amountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: amountBN }, ]; await checkVariables([token], [customVars]); }); - it("ms049 burn on works on amount=2^256-1", async () => { - await token.configureMinter(minterAccount, maxAmount, { + if (version >= 2.2) { + it("ms048(b) mint does not work on amount=2^255", async () => { + await token.configureMinter(minterAccount, POW_2_255_HEX, { + from: masterMinterAccount, + }); + let customVars = [ + { variable: "isAccountMinter.minterAccount", expectedValue: true }, + { + variable: "minterAllowance.minterAccount", + expectedValue: POW_2_255_BN, + }, + ]; + await checkVariables([token], [customVars]); + + await expectRevert( + token.mint(arbitraryAccount, POW_2_255_HEX, { from: minterAccount }) + ); + customVars = [ + { variable: "isAccountMinter.minterAccount", expectedValue: true }, + { + variable: "minterAllowance.minterAccount", + expectedValue: POW_2_255_BN, + }, + { + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: new BN(0), + }, + { variable: "totalSupply", expectedValue: new BN(0) }, + ]; + await checkVariables([token], [customVars]); + }); + } + + it(`ms049 burn on works on amount=${ + version < 2.2 ? "2^256-1" : "2^255-1" + }`, async () => { + const [amount, amountBN] = + version < 2.2 + ? [MAX_UINT256_HEX, MAX_UINT256_BN] + : [POW_2_255_MINUS1_HEX, POW_2_255_MINUS1_BN]; + + await token.configureMinter(minterAccount, amount, { from: masterMinterAccount, }); - await token.mint(minterAccount, maxAmount, { from: minterAccount }); + await token.mint(minterAccount, amount, { from: minterAccount }); let customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.minterAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: amountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: amountBN }, ]; await checkVariables([token], [customVars]); - await token.burn(maxAmount, { from: minterAccount }); + await token.burn(amount, { from: minterAccount }); customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, ]; @@ -788,93 +858,130 @@ function runTests(newToken, _accounts) { }); it("ms050 approve works on amount=2^256-1", async () => { - await token.configureMinter(minterAccount, maxAmount, { + const [mintAmount, mintAmountBN] = + version < 2.2 + ? [MAX_UINT256_HEX, MAX_UINT256_BN] + : [POW_2_255_MINUS1_HEX, POW_2_255_MINUS1_BN]; + + await token.configureMinter(minterAccount, mintAmount, { from: masterMinterAccount, }); - await token.mint(arbitraryAccount, maxAmount, { from: minterAccount }); + await token.mint(arbitraryAccount, mintAmount, { + from: minterAccount, + }); let customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.arbitraryAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: mintAmountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { + variable: "balanceAndBlacklistStates.pauserAccount", + expectedValue: new BN(0), + }, + { variable: "totalSupply", expectedValue: mintAmountBN }, ]; await checkVariables([token], [customVars]); - await token.approve(pauserAccount, maxAmount, { from: arbitraryAccount }); + await token.approve(pauserAccount, MAX_UINT256_HEX, { + from: arbitraryAccount, + }); customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.arbitraryAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: mintAmountBN, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", + expectedValue: new BN(0), }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: mintAmountBN }, { variable: "allowance.arbitraryAccount.pauserAccount", - expectedValue: maxAmountBN, + expectedValue: MAX_UINT256_BN, }, ]; await checkVariables([token], [customVars]); }); - it("ms051 transfer works on amount=2^256-1", async () => { - await token.configureMinter(minterAccount, maxAmount, { + it(`ms051 transfer works on amount=${ + version < 2.2 ? "2^256-1" : "2^255-1" + }`, async () => { + const [amount, amountBN] = + version < 2.2 + ? [MAX_UINT256_HEX, MAX_UINT256_BN] + : [POW_2_255_MINUS1_HEX, POW_2_255_MINUS1_BN]; + + await token.configureMinter(minterAccount, amount, { from: masterMinterAccount, }); - await token.mint(arbitraryAccount, maxAmount, { from: minterAccount }); + await token.mint(arbitraryAccount, amount, { from: minterAccount }); let customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.arbitraryAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: amountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: amountBN }, ]; await checkVariables([token], [customVars]); - await token.transfer(pauserAccount, maxAmount, { from: arbitraryAccount }); + await token.transfer(pauserAccount, amount, { + from: arbitraryAccount, + }); customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.pauserAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.pauserAccount", + expectedValue: amountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: amountBN }, ]; await checkVariables([token], [customVars]); }); - it("ms052 transferFrom works on amount=2^256-1", async () => { - await token.configureMinter(minterAccount, maxAmount, { + it(`ms052 transferFrom works on amount=${ + version < 2.2 ? "2^256-1" : "2^255-1" + }`, async () => { + const [amount, amountBN] = + version < 2.2 + ? [MAX_UINT256_HEX, MAX_UINT256_BN] + : [POW_2_255_MINUS1_HEX, POW_2_255_MINUS1_BN]; + + await token.configureMinter(minterAccount, amount, { from: masterMinterAccount, }); - await token.mint(arbitraryAccount, maxAmount, { from: minterAccount }); - await token.approve(pauserAccount, maxAmount, { from: arbitraryAccount }); + await token.mint(arbitraryAccount, amount, { + from: minterAccount, + }); + await token.approve(pauserAccount, amount, { + from: arbitraryAccount, + }); let customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.arbitraryAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: amountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: amountBN }, { variable: "allowance.arbitraryAccount.pauserAccount", - expectedValue: maxAmountBN, + expectedValue: amountBN, }, ]; await checkVariables([token], [customVars]); - await token.transferFrom(arbitraryAccount, pauserAccount, maxAmount, { + await token.transferFrom(arbitraryAccount, pauserAccount, amount, { from: pauserAccount, }); customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.pauserAccount", - expectedValue: maxAmountBN, + variable: "balanceAndBlacklistStates.pauserAccount", + expectedValue: amountBN, }, - { variable: "totalSupply", expectedValue: maxAmountBN }, + { variable: "totalSupply", expectedValue: amountBN }, ]; await checkVariables([token], [customVars]); }); diff --git a/test/v1/negative.test.js b/test/v1/negative.test.js index d443791a2..c697bba92 100644 --- a/test/v1/negative.test.js +++ b/test/v1/negative.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const wrapTests = require("./helpers/wrapTests"); const BN = require("bn.js"); const { @@ -19,7 +37,7 @@ const { const amount = 100; -function runTests(newToken, _accounts) { +function runTests(newToken, _accounts, version) { let proxy, token; beforeEach(async () => { @@ -135,30 +153,32 @@ function runTests(newToken, _accounts) { // Approve - it("nt008 should fail to approve when spender is blacklisted", async () => { - await token.blacklist(minterAccount, { from: blacklisterAccount }); - const customVars = [ - { variable: "isAccountBlacklisted.minterAccount", expectedValue: true }, - ]; - await expectRevert( - token.approve(minterAccount, 100, { from: arbitraryAccount }) - ); - await checkVariables([token], [customVars]); - }); + if (version < 2.2) { + it("nt008 should fail to approve when spender is blacklisted", async () => { + await token.blacklist(minterAccount, { from: blacklisterAccount }); + const customVars = [ + { variable: "isAccountBlacklisted.minterAccount", expectedValue: true }, + ]; + await expectRevert( + token.approve(minterAccount, 100, { from: arbitraryAccount }) + ); + await checkVariables([token], [customVars]); + }); - it("nt009 should fail to approve when msg.sender is blacklisted", async () => { - await token.blacklist(arbitraryAccount, { from: blacklisterAccount }); - const customVars = [ - { - variable: "isAccountBlacklisted.arbitraryAccount", - expectedValue: true, - }, - ]; - await expectRevert( - token.approve(minterAccount, 100, { from: arbitraryAccount }) - ); - await checkVariables([token], [customVars]); - }); + it("nt009 should fail to approve when msg.sender is blacklisted", async () => { + await token.blacklist(arbitraryAccount, { from: blacklisterAccount }); + const customVars = [ + { + variable: "isAccountBlacklisted.arbitraryAccount", + expectedValue: true, + }, + ]; + await expectRevert( + token.approve(minterAccount, 100, { from: arbitraryAccount }) + ); + await checkVariables([token], [customVars]); + }); + } it("nt010 should fail to approve when contract is paused", async () => { await token.pause({ from: pauserAccount }); @@ -193,7 +213,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -232,7 +252,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -272,7 +292,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.blacklisterAccount", + variable: "balanceAndBlacklistStates.blacklisterAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -316,7 +336,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.tokenOwnerAccount", + variable: "balanceAndBlacklistStates.tokenOwnerAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -360,7 +380,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -403,7 +423,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -443,7 +463,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -484,7 +504,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -516,7 +536,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -549,7 +569,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.tokenOwnerAccount", + variable: "balanceAndBlacklistStates.tokenOwnerAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -586,7 +606,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -623,7 +643,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - 50), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(50), }, { variable: "totalSupply", expectedValue: new BN(50) }, @@ -704,7 +724,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(0), }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(amount), }, { variable: "totalSupply", expectedValue: new BN(amount) }, @@ -734,7 +754,10 @@ function runTests(newToken, _accounts) { variable: "minterAllowance.minterAccount", expectedValue: new BN(amount - 50), }, - { variable: "balances.minterAccount", expectedValue: new BN(50) }, + { + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: new BN(50), + }, { variable: "totalSupply", expectedValue: new BN(50) }, { variable: "isAccountBlacklisted.minterAccount", expectedValue: true }, ]; @@ -763,7 +786,10 @@ function runTests(newToken, _accounts) { variable: "minterAllowance.minterAccount", expectedValue: new BN(amount - 50), }, - { variable: "balances.minterAccount", expectedValue: new BN(50) }, + { + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: new BN(50), + }, { variable: "totalSupply", expectedValue: new BN(50) }, { variable: "paused", expectedValue: true }, ]; @@ -791,7 +817,10 @@ function runTests(newToken, _accounts) { variable: "minterAllowance.minterAccount", expectedValue: new BN(amount - 50), }, - { variable: "balances.minterAccount", expectedValue: new BN(50) }, + { + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: new BN(50), + }, { variable: "totalSupply", expectedValue: new BN(50) }, ]; await expectRevert(token.burn(50, { from: arbitraryAccount })); @@ -818,7 +847,10 @@ function runTests(newToken, _accounts) { variable: "minterAllowance.minterAccount", expectedValue: new BN(amount - 50), }, - { variable: "balances.minterAccount", expectedValue: new BN(50) }, + { + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: new BN(50), + }, { variable: "totalSupply", expectedValue: new BN(50) }, ]; await checkVariables([token], [customVars]); @@ -830,7 +862,10 @@ function runTests(newToken, _accounts) { variable: "minterAllowance.minterAccount", expectedValue: new BN(0), }, - { variable: "balances.minterAccount", expectedValue: new BN(50) }, + { + variable: "balanceAndBlacklistStates.minterAccount", + expectedValue: new BN(50), + }, { variable: "totalSupply", expectedValue: new BN(50) }, ]; await expectRevert(token.burn(50, { from: minterAccount })); @@ -942,7 +977,7 @@ function runTests(newToken, _accounts) { const customVars = [ { variable: "isAccountMinter.minterAccount", expectedValue: true }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(amount), }, { variable: "totalSupply", expectedValue: new BN(amount) }, diff --git a/test/v1/positive.test.js b/test/v1/positive.test.js index 6e239b6ca..c3eb0abf4 100644 --- a/test/v1/positive.test.js +++ b/test/v1/positive.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const BN = require("bn.js"); const wrapTests = require("./helpers/wrapTests"); const { @@ -125,7 +143,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -148,7 +166,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(0), }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -163,7 +181,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(0), }, { - variable: "balances.minterAccount", + variable: "balanceAndBlacklistStates.minterAccount", expectedValue: new BN(mintAmount - burnAmount), }, { @@ -190,7 +208,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -200,7 +218,7 @@ function runTests(newToken, _accounts) { await token.removeMinter(minterAccount, { from: masterMinterAccount }); customVars = [ { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -233,7 +251,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -247,9 +265,12 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -280,7 +301,7 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { - variable: "balances.arbitraryAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -299,9 +320,12 @@ function runTests(newToken, _accounts) { variable: "minterAllowance.minterAccount", expectedValue: new BN(amount - mintAmount), }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, diff --git a/test/v1/proxyNegative.test.js b/test/v1/proxyNegative.test.js index 65363b76b..db783b29f 100644 --- a/test/v1/proxyNegative.test.js +++ b/test/v1/proxyNegative.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const BN = require("bn.js"); const wrapTests = require("./helpers/wrapTests"); const { @@ -20,12 +38,12 @@ const { encodeCall, FiatTokenV1, UpgradedFiatToken, - UpgradedFiatTokenNewFields, + deployUpgradedFiatTokenNewFields, } = require("./helpers/tokenTest"); const amount = 100; -function runTests(newToken, _accounts) { +function runTests(newToken, _accounts, version) { let rawToken, proxy, token; beforeEach(async () => { @@ -134,7 +152,7 @@ function runTests(newToken, _accounts) { }); it("nut010 should fail to call updateToAndCall with non-adminAccount", async () => { - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const initializeData = encodeCall( "initialize", ["bool", "address", "uint256"], @@ -164,7 +182,7 @@ function runTests(newToken, _accounts) { await token.mint(arbitraryAccount, mintAmount, { from: minterAccount }); await token.transfer(pauserAccount, mintAmount, { from: arbitraryAccount }); - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const data = encodeCall( "initialize", [ @@ -206,9 +224,12 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, diff --git a/test/v1/proxyPositive.test.js b/test/v1/proxyPositive.test.js index 9b128bb73..c71a33843 100644 --- a/test/v1/proxyPositive.test.js +++ b/test/v1/proxyPositive.test.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const wrapTests = require("./helpers/wrapTests"); const BN = require("bn.js"); const { @@ -25,12 +43,13 @@ const { UpgradedFiatTokenNewFields, UpgradedFiatTokenNewFieldsNewLogic, getAdmin, + deployUpgradedFiatTokenNewFields, } = require("./helpers/tokenTest"); const { makeRawTransaction, sendRawTransaction } = require("./helpers/abi"); const amount = 100; -function runTests(newToken, _accounts) { +function runTests(newToken, _accounts, version) { let rawToken, proxy, token; beforeEach(async () => { @@ -63,8 +82,14 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, - { variable: "balances.pauserAccount", expectedValue: new BN(mintAmount) }, + { + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", + expectedValue: new BN(mintAmount), + }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, { variable: "proxiedTokenAddress", expectedValue: upgradedToken.address }, ]; @@ -80,7 +105,7 @@ function runTests(newToken, _accounts) { await token.mint(arbitraryAccount, mintAmount, { from: minterAccount }); await token.transfer(pauserAccount, mintAmount, { from: arbitraryAccount }); - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const initializeData = encodeCall( "initV2", ["bool", "address", "uint256"], @@ -103,8 +128,14 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, - { variable: "balances.pauserAccount", expectedValue: new BN(mintAmount) }, + { + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", + expectedValue: new BN(mintAmount), + }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, { variable: "proxiedTokenAddress", expectedValue: upgradedToken.address }, ]; @@ -148,9 +179,12 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -160,7 +194,7 @@ function runTests(newToken, _accounts) { }); it("upt008 should deploy upgraded version of contract with new data fields and without previous deployment and ensure new fields correct", async () => { - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const newProxy = await FiatTokenProxy.new(upgradedToken.address, { from: proxyOwnerAccount, }); @@ -308,9 +342,12 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount - 1), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount + 1), }, { variable: "totalSupply", expectedValue: new BN(mintAmount + 1) }, @@ -362,9 +399,12 @@ function runTests(newToken, _accounts) { expectedValue: new BN(amount - mintAmount), }, { variable: "isAccountMinter.minterAccount", expectedValue: true }, - { variable: "balances.arbitraryAccount", expectedValue: bigZero }, { - variable: "balances.pauserAccount", + variable: "balanceAndBlacklistStates.arbitraryAccount", + expectedValue: bigZero, + }, + { + variable: "balanceAndBlacklistStates.pauserAccount", expectedValue: new BN(mintAmount), }, { variable: "totalSupply", expectedValue: new BN(mintAmount) }, @@ -382,7 +422,7 @@ function runTests(newToken, _accounts) { it("upt011 should upgradeToAndCall while paused and upgraded contract should be paused as a result", async () => { await token.pause({ from: pauserAccount }); - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const initializeData = encodeCall( "initV2", ["bool", "address", "uint256"], @@ -405,7 +445,7 @@ function runTests(newToken, _accounts) { it("upt012 should upgradeToAndCall while upgrader is blacklisted", async () => { await token.blacklist(proxyOwnerAccount, { from: blacklisterAccount }); - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); const initializeData = encodeCall( "initV2", ["bool", "address", "uint256"], @@ -424,7 +464,7 @@ function runTests(newToken, _accounts) { }); it("upt013 should upgradeToAndCall while new logic is blacklisted", async () => { - const upgradedToken = await UpgradedFiatTokenNewFields.new(); + const upgradedToken = await deployUpgradedFiatTokenNewFields(version); await token.blacklist(upgradedToken.address, { from: blacklisterAccount }); const initializeData = encodeCall( diff --git a/test/v2/FiatTokenV2.test.ts b/test/v2/FiatTokenV2.test.ts index 36ec77756..48e1e264d 100644 --- a/test/v2/FiatTokenV2.test.ts +++ b/test/v2/FiatTokenV2.test.ts @@ -1,12 +1,42 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { behavesLikeRescuable } from "../v1.1/Rescuable.behavior"; -import { FiatTokenV2Instance, RescuableInstance } from "../../@types/generated"; +import { + MockErc1271WalletInstance, + FiatTokenV2Instance, + RescuableInstance, +} from "../../@types/generated"; +import { AnyFiatTokenV2Instance } from "../../@types/AnyFiatTokenV2Instance"; import { usesOriginalStorageSlotPositions } from "../helpers/storageSlots.behavior"; import { hasSafeAllowance } from "./safeAllowance.behavior"; import { hasGasAbstraction } from "./GasAbstraction/GasAbstraction.behavior"; -import { makeDomainSeparator } from "./GasAbstraction/helpers"; +import { + SignatureBytesType, + TestParams, + WalletType, + makeDomainSeparator, +} from "./GasAbstraction/helpers"; import { expectRevert } from "../helpers"; +import { testTransferWithMultipleAuthorizations } from "./GasAbstraction/testTransferWithMultipleAuthorizations"; const FiatTokenV2 = artifacts.require("FiatTokenV2"); +const MockERC1271Wallet = artifacts.require("MockERC1271Wallet"); contract("FiatTokenV2", (accounts) => { const fiatTokenOwner = accounts[9]; @@ -27,12 +57,18 @@ contract("FiatTokenV2", (accounts) => { await fiatToken.initializeV2("USD Coin", { from: fiatTokenOwner }); }); - behavesLikeFiatTokenV2(accounts, () => fiatToken, fiatTokenOwner); + behavesLikeFiatTokenV2(accounts, 2, () => fiatToken, fiatTokenOwner); + usesOriginalStorageSlotPositions({ + Contract: FiatTokenV2, + version: 2, + accounts, + }); }); export function behavesLikeFiatTokenV2( accounts: Truffle.Accounts, - getFiatToken: () => FiatTokenV2Instance, + version: number, + getFiatToken: () => AnyFiatTokenV2Instance, fiatTokenOwner: string ): void { let domainSeparator: string; @@ -48,24 +84,26 @@ export function behavesLikeFiatTokenV2( behavesLikeRescuable(getFiatToken as () => RescuableInstance, accounts); - usesOriginalStorageSlotPositions({ - Contract: FiatTokenV2, - version: 2, - accounts, - }); - it("has the expected domain separator", async () => { expect(await getFiatToken().DOMAIN_SEPARATOR()).to.equal(domainSeparator); }); - hasSafeAllowance(getFiatToken, fiatTokenOwner, accounts); + hasSafeAllowance(version, getFiatToken, fiatTokenOwner, accounts); - hasGasAbstraction( + const testParams: TestParams = { + version, getFiatToken, - () => domainSeparator, + getDomainSeparator: () => domainSeparator, + getERC1271Wallet, fiatTokenOwner, - accounts - ); + accounts, + signerWalletType: WalletType.EOA, + signatureBytesType: SignatureBytesType.Unpacked, + }; + + hasGasAbstraction(testParams); + + testTransferWithMultipleAuthorizations(testParams); it("disallows calling initializeV2 twice", async () => { // It was called once in beforeEach. Try to call again. @@ -74,3 +112,9 @@ export function behavesLikeFiatTokenV2( ); }); } + +export async function getERC1271Wallet( + owner: string +): Promise { + return await MockERC1271Wallet.new(owner); +} diff --git a/test/v2/FiatTokenV2_1.test.ts b/test/v2/FiatTokenV2_1.test.ts index 44f49c4ed..51aeb2960 100644 --- a/test/v2/FiatTokenV2_1.test.ts +++ b/test/v2/FiatTokenV2_1.test.ts @@ -1,5 +1,24 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { FiatTokenV21Instance } from "../../@types/generated"; import { expectRevert } from "../helpers"; +import { usesOriginalStorageSlotPositions } from "../helpers/storageSlots.behavior"; import { behavesLikeFiatTokenV2 } from "./FiatTokenV2.test"; const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); @@ -23,7 +42,12 @@ contract("FiatTokenV2_1", (accounts) => { await fiatToken.initializeV2("USD Coin", { from: fiatTokenOwner }); }); - behavesLikeFiatTokenV2(accounts, () => fiatToken, fiatTokenOwner); + behavesLikeFiatTokenV2(accounts, 2.1, () => fiatToken, fiatTokenOwner); + usesOriginalStorageSlotPositions({ + Contract: FiatTokenV2_1, + version: 2.1, + accounts, + }); describe("initializeV2_1", () => { const [, user, lostAndFound] = accounts; diff --git a/test/v2/FiatTokenV2_2.test.ts b/test/v2/FiatTokenV2_2.test.ts new file mode 100644 index 000000000..6b0bdfe10 --- /dev/null +++ b/test/v2/FiatTokenV2_2.test.ts @@ -0,0 +1,478 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BN from "bn.js"; +import crypto from "crypto"; +import { + AnyFiatTokenV2Instance, + FiatTokenV22InstanceExtended, +} from "../../@types/AnyFiatTokenV2Instance"; +import { + expectRevert, + generateAccounts, + hexStringFromBuffer, + initializeToVersion, +} from "../helpers"; +import { + ACCOUNTS_AND_KEYS, + MAX_UINT256_HEX, + POW_2_255_BN, +} from "../helpers/constants"; +import { + STORAGE_SLOT_NUMBERS, + addressMappingSlot, + parseUint, + readSlot, + usesOriginalStorageSlotPositions, +} from "../helpers/storageSlots.behavior"; +import { behavesLikeFiatTokenV2, getERC1271Wallet } from "./FiatTokenV2.test"; +import { hasGasAbstraction } from "./GasAbstraction/GasAbstraction.behavior"; +import { + SignatureBytesType, + WalletType, + makeDomainSeparator, + permitSignature, + permitSignatureV22, + prepareSignature, + transferWithAuthorizationSignature, + transferWithAuthorizationSignatureV22, + cancelAuthorizationSignature, + cancelAuthorizationSignatureV22, + receiveWithAuthorizationSignature, + receiveWithAuthorizationSignatureV22, + signTransferAuthorization, + signReceiveAuthorization, +} from "./GasAbstraction/helpers"; +import { encodeCall } from "../v1/helpers/tokenTest"; + +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); + +contract("FiatTokenV2_2", (accounts) => { + const fiatTokenOwner = accounts[9]; + const lostAndFound = accounts[2]; + const proxyOwnerAccount = accounts[14]; + const newSymbol = "USDCUSDC"; + + let fiatToken: FiatTokenV22InstanceExtended; + + const getFiatToken = ( + signatureBytesType: SignatureBytesType + ): (() => AnyFiatTokenV2Instance) => { + return () => { + initializeOverloadedMethods(fiatToken, signatureBytesType); + return fiatToken; + }; + }; + + beforeEach(async () => { + fiatToken = await FiatTokenV2_2.new(); + await initializeToVersion(fiatToken, "2.1", fiatTokenOwner, lostAndFound); + }); + + describe("initializeV2_2", () => { + it("disallows calling initializeV2_2 twice", async () => { + await fiatToken.initializeV2_2([], newSymbol); + await expectRevert(fiatToken.initializeV2_2([], newSymbol)); + }); + + it("should update symbol", async () => { + await fiatToken.initializeV2_2([], newSymbol); + expect(await fiatToken.symbol()).to.eql(newSymbol); + }); + + it("should blacklist all accountsToBlacklist", async () => { + const [unblacklistedAccount, ...accountsToBlacklist] = generateAccounts( + 10 + ); + + // Prepare a proxy that's tied to a V2_1 implementation so that we can blacklist + // the account in _deprecatedBlacklisted first. + const _fiatTokenV2_1 = await FiatTokenV2_1.new(); + const _proxy = await FiatTokenProxy.new(_fiatTokenV2_1.address, { + from: proxyOwnerAccount, + }); + const _proxyAsV2_1 = await FiatTokenV2_1.at(_proxy.address); + await initializeToVersion( + _proxyAsV2_1, + "2.1", + fiatTokenOwner, + lostAndFound + ); + await Promise.all( + accountsToBlacklist.map((a) => + _proxyAsV2_1.blacklist(a, { from: fiatTokenOwner }) + ) + ); + + // Sanity check that _deprecatedBlacklisted is set, and balanceAndBlacklistStates is not set for + // every accountsToBlacklist. + expect( + ( + await readDeprecatedBlacklisted(_proxy.address, accountsToBlacklist) + ).every((result) => result === 1) + ).to.be.true; + expect( + ( + await readBalanceAndBlacklistStates( + _proxy.address, + accountsToBlacklist + ) + ).every((result) => result.eq(new BN(0))) + ).to.be.true; + + // Sanity check that _deprecatedBlacklisted is set, and balanceAndBlacklistStates is not set + // for `address(this)` + expect( + (await readDeprecatedBlacklisted(_proxy.address, [_proxy.address]))[0] + ).to.equal(1); + expect( + ( + await readBalanceAndBlacklistStates(_proxy.address, [_proxy.address]) + )[0].eq(new BN(0)) + ).to.be.true; + + // Call the initializeV2_2 function through an upgrade call. + const initializeData = encodeCall( + "initializeV2_2", + ["address[]", "string"], + [accountsToBlacklist, newSymbol] + ); + await _proxy.upgradeToAndCall(fiatToken.address, initializeData, { + from: proxyOwnerAccount, + }); + + // Validate that isBlacklisted returns true for every accountsToBlacklist. + const _proxyAsV2_2 = await FiatTokenV2_2.at(_proxy.address); + const areAccountsBlacklisted = await Promise.all( + accountsToBlacklist.map((account) => + _proxyAsV2_2.isBlacklisted(account) + ) + ); + expect(areAccountsBlacklisted.every((b) => b)).to.be.true; + + // Validate that _deprecatedBlacklisted is unset, and balanceAndBlacklistStates is set for every + // accountsToBlacklist. + expect( + ( + await readDeprecatedBlacklisted(_proxy.address, accountsToBlacklist) + ).every((result) => result === 0) + ).to.be.true; + expect( + ( + await readBalanceAndBlacklistStates( + _proxy.address, + accountsToBlacklist + ) + ).every((result) => result.eq(POW_2_255_BN)) + ).to.be.true; + + // Validate that _deprecatedBlacklisted is unset, and balanceAndBlacklistStates is set for + // `address(this)` + expect( + (await readDeprecatedBlacklisted(_proxy.address, [_proxy.address]))[0] + ).to.equal(0); + expect( + ( + await readBalanceAndBlacklistStates(_proxy.address, [_proxy.address]) + )[0].eq(POW_2_255_BN) + ).to.be.true; + + // Sanity check that an unblacklisted account does not get blacklisted. + expect(await _proxyAsV2_2.isBlacklisted(unblacklistedAccount)).to.be + .false; + }); + + it("should revert if an accountToBlacklist was not blacklisted", async () => { + const accountsToBlacklist = generateAccounts(1); + await expectRevert( + fiatToken.initializeV2_2(accountsToBlacklist, newSymbol), + "FiatTokenV2_2: Blacklisting previously unblacklisted account!" + ); + + // Sanity check that the account is not blacklisted after revert. + expect(await fiatToken.isBlacklisted(accountsToBlacklist[0])).to.be.false; + }); + }); + + describe("initialized contract", () => { + beforeEach(async () => { + await fiatToken.initializeV2_2([], newSymbol); + }); + + behavesLikeFiatTokenV2( + accounts, + 2.2, + getFiatToken(SignatureBytesType.Unpacked), + fiatTokenOwner + ); + + behavesLikeFiatTokenV22( + accounts, + getFiatToken(SignatureBytesType.Packed), + fiatTokenOwner + ); + usesOriginalStorageSlotPositions({ + Contract: FiatTokenV2_2, + version: 2.2, + accounts, + }); + }); +}); + +export function behavesLikeFiatTokenV22( + accounts: Truffle.Accounts, + getFiatToken: () => AnyFiatTokenV2Instance, + fiatTokenOwner: string +): void { + const [minter, arbitraryAccount] = accounts.slice(3); + let domainSeparator: string; + let fiatToken: FiatTokenV22InstanceExtended; + + beforeEach(async () => { + fiatToken = getFiatToken() as FiatTokenV22InstanceExtended; + domainSeparator = makeDomainSeparator( + "USD Coin", + "2", + 1, // hardcoded to 1 because of ganache bug: https://github.com/trufflesuite/ganache/issues/1643 + fiatToken.address + ); + }); + + const v22TestParams = { + version: 2.2, + getFiatToken, + getDomainSeparator: () => domainSeparator, + getERC1271Wallet, + fiatTokenOwner, + accounts, + }; + + // Test gas abstraction functionalities with both EOA and AA wallets + hasGasAbstraction({ + ...v22TestParams, + signerWalletType: WalletType.EOA, + signatureBytesType: SignatureBytesType.Packed, + }); + hasGasAbstraction({ + ...v22TestParams, + signerWalletType: WalletType.AA, + signatureBytesType: SignatureBytesType.Packed, + }); + + // Additional negative test cases. + describe("will trigger exceeded 2^255 balance error", () => { + const incrementAmount = 1000; + const recipient = arbitraryAccount; + const errorMessage = "FiatTokenV2_2: Balance exceeds (2^255 - 1)"; + + beforeEach(async () => { + const recipientInitialBalance = POW_2_255_BN.sub(new BN(incrementAmount)); + await fiatToken.configureMinter(minter, POW_2_255_BN, { + from: fiatTokenOwner, + }); + await fiatToken.mint(recipient, recipientInitialBalance, { + from: minter, + }); + expect((await fiatToken.balanceOf(recipient)).eq(recipientInitialBalance)) + .to.be.true; + }); + + it("should fail to mint to recipient if balance will exceed 2^255", async () => { + await expectRevert( + fiatToken.mint(recipient, incrementAmount, { from: minter }), + errorMessage + ); + }); + + it("should fail to transfer to recipient if balance will exceed 2^255", async () => { + await fiatToken.mint(minter, incrementAmount, { from: minter }); + await expectRevert( + fiatToken.transfer(recipient, incrementAmount, { from: minter }), + errorMessage + ); + }); + + it("should fail call transferFrom to recipient if balance will exceed 2^255", async () => { + await fiatToken.mint(minter, incrementAmount, { from: minter }); + await fiatToken.approve(arbitraryAccount, incrementAmount, { + from: minter, + }); + + await expectRevert( + fiatToken.transferFrom(minter, recipient, incrementAmount, { + from: arbitraryAccount, + }), + errorMessage + ); + }); + + context("EIP3009", () => { + const signer = ACCOUNTS_AND_KEYS[0]; + const from = signer.address; + const to = recipient; + const value = incrementAmount; + const validAfter = 0; + const validBefore = MAX_UINT256_HEX; + const nonce = hexStringFromBuffer(crypto.randomBytes(32)); + + beforeEach(async () => { + await fiatToken.mint(signer.address, incrementAmount, { + from: minter, + }); + }); + + it("should fail to call transferWithAuthorization to recipient if balance will exceed 2^255", async () => { + const signature = signTransferAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + domainSeparator, + signer.key + ); + + await expectRevert( + fiatToken.transferWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + ...prepareSignature(signature, SignatureBytesType.Packed), + { from: to } + ), + errorMessage + ); + }); + + it("should fail to call receiveWithAuthorization to recipient if balance will exceed 2^255", async () => { + const signature = signReceiveAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + domainSeparator, + signer.key + ); + + await expectRevert( + fiatToken.receiveWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + ...prepareSignature(signature, SignatureBytesType.Packed), + { from: to } + ), + errorMessage + ); + }); + }); + }); +} + +/** + * With v2.2 we introduce overloaded functions for `permit`, + * `transferWithAuthorization`, `receiveWithAuthorization`, + * and `cancelAuthorization`. + * + * Since function overloading isn't supported by Javascript, + * the typechain library generates type interfaces for overloaded functions differently. + * For instance, we can no longer access the `permit` function with + * `fiattoken.permit`. Instead, we need to need to use the full function signature e.g. + * `fiattoken.methods["permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"]` OR + * `fiattoken.methods["permit(address,address,uint256,uint256,bytes)"]` (v22 interface). + * + * To preserve type-coherence and reuse test suites written for v2 & v2.1 contracts, + * here we re-assign the overloaded method definition to the method name shorthand. + */ +export function initializeOverloadedMethods( + fiatToken: FiatTokenV22InstanceExtended, + signatureBytesType: SignatureBytesType +): void { + if (signatureBytesType == SignatureBytesType.Unpacked) { + fiatToken.permit = fiatToken.methods[permitSignature]; + fiatToken.transferWithAuthorization = + fiatToken.methods[transferWithAuthorizationSignature]; + fiatToken.receiveWithAuthorization = + fiatToken.methods[receiveWithAuthorizationSignature]; + fiatToken.cancelAuthorization = + fiatToken.methods[cancelAuthorizationSignature]; + } else { + fiatToken.permit = fiatToken.methods[permitSignatureV22]; + fiatToken.transferWithAuthorization = + fiatToken.methods[transferWithAuthorizationSignatureV22]; + fiatToken.receiveWithAuthorization = + fiatToken.methods[receiveWithAuthorizationSignatureV22]; + fiatToken.cancelAuthorization = + fiatToken.methods[cancelAuthorizationSignatureV22]; + } +} + +/** + * Helper method to read the _deprecatedBlacklisted map. + * @param proxyOrImplementation the address of the proxy or implementation contract. + * @param accounts the accounts to read states for. + * @returns the results (in order) from reading the map. + */ +async function readDeprecatedBlacklisted( + proxyOrImplementation: string, + accounts: string[] +): Promise { + return ( + await Promise.all( + accounts.map((a) => + readSlot( + proxyOrImplementation, + addressMappingSlot(a, STORAGE_SLOT_NUMBERS._deprecatedBlacklisted) + ) + ) + ) + ).map((result) => parseInt(result, 16)); +} + +/** + * Helper method to read the balanceAndBlacklistStates map. + * @param proxyOrImplementation the address of the proxy or implementation contract. + * @param accounts the accounts to read states for. + * @returns the results (in order) from reading the map. + */ +async function readBalanceAndBlacklistStates( + proxyOrImplementation: string, + accounts: string[] +): Promise { + return ( + await Promise.all( + accounts.map((a) => + readSlot( + proxyOrImplementation, + addressMappingSlot(a, STORAGE_SLOT_NUMBERS.balanceAndBlacklistStates) + ) + ) + ) + ).map((result) => parseUint(result)); +} diff --git a/test/v2/GasAbstraction/GasAbstraction.behavior.ts b/test/v2/GasAbstraction/GasAbstraction.behavior.ts index bdb0ae363..a54aef7f1 100644 --- a/test/v2/GasAbstraction/GasAbstraction.behavior.ts +++ b/test/v2/GasAbstraction/GasAbstraction.behavior.ts @@ -1,30 +1,33 @@ -import { FiatTokenV2Instance } from "../../../@types/generated"; +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { TestParams } from "./helpers"; import { testTransferWithAuthorization } from "./testTransferWithAuthorization"; import { testCancelAuthorization } from "./testCancelAuthorization"; import { testPermit } from "./testPermit"; -import { testTransferWithMultipleAuthorizations } from "./testTransferWithMultipleAuthorizations"; import { testReceiveWithAuthorization } from "./testReceiveWithAuthorization"; -export function hasGasAbstraction( - getFiatToken: () => FiatTokenV2Instance, - getDomainSeparator: () => string, - fiatTokenOwner: string, - accounts: Truffle.Accounts -): void { +export function hasGasAbstraction(testParams: TestParams): void { describe("GasAbstraction", () => { - const testParams: TestParams = { - getFiatToken, - getDomainSeparator, - fiatTokenOwner, - accounts, - }; - describe("EIP-3009", () => { testTransferWithAuthorization(testParams); testReceiveWithAuthorization(testParams); testCancelAuthorization(testParams); - testTransferWithMultipleAuthorizations(testParams); }); describe("EIP-2612", () => { diff --git a/test/v2/GasAbstraction/helpers.ts b/test/v2/GasAbstraction/helpers.ts index 190fd0619..587935432 100644 --- a/test/v2/GasAbstraction/helpers.ts +++ b/test/v2/GasAbstraction/helpers.ts @@ -1,11 +1,45 @@ -import { FiatTokenV2Instance } from "../../../@types/generated"; +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AnyFiatTokenV2Instance } from "../../../@types/AnyFiatTokenV2Instance"; +import { MockErc1271WalletInstance } from "../../../@types/generated"; import { Signature, ecSign, strip0x } from "../../helpers"; +import { packSignature } from "../../helpers"; + +export enum WalletType { + EOA = "EOA", + AA = "AA", +} + +export enum SignatureBytesType { + Packed = "Packed", // Signature provided in the format of a single byte array, packed in the order of r, s, v for EOA wallets + Unpacked = "Unpacked", // Signature values provided as separate inputs (v, r, s) +} export interface TestParams { - getFiatToken: () => FiatTokenV2Instance; + version: number; + getFiatToken: () => AnyFiatTokenV2Instance; getDomainSeparator: () => string; fiatTokenOwner: string; accounts: Truffle.Accounts; + signerWalletType: WalletType; + signatureBytesType: SignatureBytesType; + getERC1271Wallet: (owner: string) => Promise; } export function makeDomainSeparator( @@ -30,6 +64,17 @@ export function makeDomainSeparator( ); } +export function prepareSignature( + signature: Signature, + signatureBytesType: SignatureBytesType +): Array { + if (signatureBytesType == SignatureBytesType.Unpacked) { + return [signature.v, signature.r, signature.s]; + } else { + return [packSignature(signature)]; + } +} + export const transferWithAuthorizationTypeHash = web3.utils.keccak256( "TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)" ); @@ -46,6 +91,36 @@ export const permitTypeHash = web3.utils.keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); +/** + * Overloaded method signatures + */ +export const permitSignature = + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"; + +export const permitSignatureV22 = + "permit(address,address,uint256,uint256,bytes)"; + +export const transferWithAuthorizationSignature = + "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)"; + +export const transferWithAuthorizationSignatureV22 = + "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)"; + +export const receiveWithAuthorizationSignature = + "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)"; + +export const receiveWithAuthorizationSignatureV22 = + "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)"; + +export const cancelAuthorizationSignature = + "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)"; + +export const cancelAuthorizationSignatureV22 = + "cancelAuthorization(address,bytes32,bytes)"; + +/** + * Signature generation helper functions + */ export function signTransferAuthorization( from: string, to: string, diff --git a/test/v2/GasAbstraction/testCancelAuthorization.ts b/test/v2/GasAbstraction/testCancelAuthorization.ts index 969d6b1a2..acfba4a9e 100644 --- a/test/v2/GasAbstraction/testCancelAuthorization.ts +++ b/test/v2/GasAbstraction/testCancelAuthorization.ts @@ -1,35 +1,73 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import crypto from "crypto"; -import { FiatTokenV2Instance } from "../../../@types/generated"; -import { ACCOUNTS_AND_KEYS, MAX_UINT256 } from "../../helpers/constants"; +import { ACCOUNTS_AND_KEYS, MAX_UINT256_HEX } from "../../helpers/constants"; import { expectRevert, hexStringFromBuffer } from "../../helpers"; import { cancelAuthorizationTypeHash, signTransferAuthorization, signCancelAuthorization, TestParams, + WalletType, + prepareSignature, } from "./helpers"; +import { AnyFiatTokenV2Instance } from "../../../@types/AnyFiatTokenV2Instance"; +import { MockErc1271WalletInstance } from "../../../@types/generated"; export function testCancelAuthorization({ getFiatToken, + getERC1271Wallet, getDomainSeparator, fiatTokenOwner, accounts, + signerWalletType, + signatureBytesType, }: TestParams): void { - describe("cancelAuthorization", () => { - let fiatToken: FiatTokenV2Instance; - let domainSeparator: string; + describe(`cancelAuthorization with ${signerWalletType} wallet, ${signatureBytesType} signature interface`, async () => { const [alice, bob] = ACCOUNTS_AND_KEYS; const charlie = accounts[1]; - let nonce: string; + const nonce = hexStringFromBuffer(crypto.randomBytes(32)); + + let fiatToken: AnyFiatTokenV2Instance; + let aliceWallet: MockErc1271WalletInstance; + let domainSeparator: string; + + let from: string; beforeEach(async () => { fiatToken = getFiatToken(); + aliceWallet = await getERC1271Wallet(alice.address); domainSeparator = getDomainSeparator(); - nonce = hexStringFromBuffer(crypto.randomBytes(32)); + + // Initialize `from` address either as Alice's EOA address or Alice's wallet address + if (signerWalletType == WalletType.AA) { + from = aliceWallet.address; + } else { + from = alice.address; + } + await fiatToken.configureMinter(fiatTokenOwner, 1000000e6, { from: fiatTokenOwner, }); - await fiatToken.mint(alice.address, 10e6, { from: fiatTokenOwner }); + await fiatToken.mint(from, 10e6, { + from: fiatTokenOwner, + }); }); it("has the expected type hash", async () => { @@ -39,11 +77,10 @@ export function testCancelAuthorization({ }); it("cancels unused transfer authorization if signature is valid", async () => { - const from = alice.address; const to = bob.address; const value = 7e6; const validAfter = 0; - const validBefore = MAX_UINT256; + const validBefore = MAX_UINT256_HEX; // create a signed authorization const authorization = signTransferAuthorization( @@ -72,9 +109,7 @@ export function testCancelAuthorization({ await fiatToken.cancelAuthorization( from, nonce, - cancellation.v, - cancellation.r, - cancellation.s, + ...prepareSignature(cancellation, signatureBytesType), { from: charlie } ); @@ -90,9 +125,7 @@ export function testCancelAuthorization({ validAfter, validBefore, nonce, - authorization.v, - authorization.r, - authorization.s, + ...prepareSignature(authorization, signatureBytesType), { from: charlie } ), "authorization is used or canceled" @@ -100,11 +133,10 @@ export function testCancelAuthorization({ }); it("cannot be used to cancel someone else's authorization", async () => { - const from = alice.address; const to = bob.address; const value = 7e6; const validAfter = 0; - const validBefore = MAX_UINT256; + const validBefore = MAX_UINT256_HEX; // create a signed authorization const authorization = signTransferAuthorization( @@ -134,9 +166,7 @@ export function testCancelAuthorization({ fiatToken.cancelAuthorization( from, nonce, - cancellation.v, - cancellation.r, - cancellation.s, + ...prepareSignature(cancellation, signatureBytesType), { from: charlie } ), "invalid signature" @@ -153,19 +183,16 @@ export function testCancelAuthorization({ validAfter, validBefore, nonce, - authorization.v, - authorization.r, - authorization.s, + ...prepareSignature(authorization, signatureBytesType), { from: charlie } ); }); it("reverts if the authorization has already been used", async () => { - const from = alice.address; const to = bob.address; const value = 7e6; const validAfter = 0; - const validBefore = MAX_UINT256; + const validBefore = MAX_UINT256_HEX; // create a signed authorization const authorization = signTransferAuthorization( @@ -187,9 +214,7 @@ export function testCancelAuthorization({ validAfter, validBefore, nonce, - authorization.v, - authorization.r, - authorization.s, + ...prepareSignature(authorization, signatureBytesType), { from: charlie } ); @@ -206,9 +231,7 @@ export function testCancelAuthorization({ fiatToken.cancelAuthorization( from, nonce, - cancellation.v, - cancellation.r, - cancellation.s, + ...prepareSignature(cancellation, signatureBytesType), { from: charlie } ), "authorization is used or canceled" @@ -218,7 +241,7 @@ export function testCancelAuthorization({ it("reverts if the authorization has already been canceled", async () => { // create cancellation const cancellation = signCancelAuthorization( - alice.address, + from, nonce, domainSeparator, alice.key @@ -226,22 +249,18 @@ export function testCancelAuthorization({ // submit the cancellation await fiatToken.cancelAuthorization( - alice.address, + from, nonce, - cancellation.v, - cancellation.r, - cancellation.s, + ...prepareSignature(cancellation, signatureBytesType), { from: charlie } ); // try to submit the same cancellation again await expectRevert( fiatToken.cancelAuthorization( - alice.address, + from, nonce, - cancellation.v, - cancellation.r, - cancellation.s, + ...prepareSignature(cancellation, signatureBytesType), { from: charlie } ), "authorization is used or canceled" @@ -250,8 +269,8 @@ export function testCancelAuthorization({ it("reverts if the contract is paused", async () => { // create a cancellation - const { v, r, s } = signCancelAuthorization( - alice.address, + const cancellation = signCancelAuthorization( + from, nonce, domainSeparator, alice.key @@ -262,9 +281,15 @@ export function testCancelAuthorization({ // try to submit the cancellation await expectRevert( - fiatToken.cancelAuthorization(alice.address, nonce, v, r, s, { - from: charlie, - }), + fiatToken.cancelAuthorization( + from, + nonce, + ...prepareSignature(cancellation, signatureBytesType), + + { + from: charlie, + } + ), "paused" ); }); diff --git a/test/v2/GasAbstraction/testPermit.ts b/test/v2/GasAbstraction/testPermit.ts index 420b746ba..f2e71b86d 100644 --- a/test/v2/GasAbstraction/testPermit.ts +++ b/test/v2/GasAbstraction/testPermit.ts @@ -1,9 +1,27 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import crypto from "crypto"; -import { FiatTokenV2Instance } from "../../../@types/generated"; +import { MockErc1271WalletInstance } from "../../../@types/generated"; import { Approval } from "../../../@types/generated/FiatTokenV2"; import { ACCOUNTS_AND_KEYS, - MAX_UINT256, + MAX_UINT256_HEX, ZERO_ADDRESS, } from "../../helpers/constants"; import { expectRevert, hexStringFromBuffer } from "../../helpers"; @@ -12,32 +30,50 @@ import { TestParams, signTransferAuthorization, permitTypeHash, + WalletType, + prepareSignature, } from "./helpers"; +import { AnyFiatTokenV2Instance } from "../../../@types/AnyFiatTokenV2Instance"; export function testPermit({ + version, getFiatToken, + getERC1271Wallet, getDomainSeparator, fiatTokenOwner, accounts, + signerWalletType, + signatureBytesType, }: TestParams): void { - describe("permit", () => { - let fiatToken: FiatTokenV2Instance; - let domainSeparator: string; + describe(`permit with ${signerWalletType} wallet, ${signatureBytesType} signature interface`, async () => { const [alice, bob] = ACCOUNTS_AND_KEYS; const charlie = accounts[1]; const initialBalance = 10e6; const permitParams = { - owner: alice.address, + owner: "", spender: bob.address, value: 7e6, nonce: 0, - deadline: MAX_UINT256, + deadline: Math.floor(Date.now() / 1000) + 60 * 60 * 24, }; + let fiatToken: AnyFiatTokenV2Instance; + let aliceWallet: MockErc1271WalletInstance; + let domainSeparator: string; + beforeEach(async () => { fiatToken = getFiatToken(); + aliceWallet = await getERC1271Wallet(alice.address); domainSeparator = getDomainSeparator(); + + // Initialize `owner` address either as Alice's EOA address or Alice's wallet address + if (signerWalletType == WalletType.AA) { + permitParams.owner = aliceWallet.address; + } else { + permitParams.owner = alice.address; + } + await fiatToken.configureMinter(fiatTokenOwner, 1000000e6, { from: fiatTokenOwner, }); @@ -56,7 +92,7 @@ export function testPermit({ // create a signed permit to grant Bob permission to spend Alice's funds // on behalf, and sign with Alice's key let nonce = 0; - let { v, r, s } = signPermit( + const signature1 = signPermit( owner, spender, value, @@ -79,9 +115,7 @@ export function testPermit({ spender, value, deadline, - v, - r, - s, + ...prepareSignature(signature1, signatureBytesType), { from: charlie } ); @@ -103,7 +137,7 @@ export function testPermit({ // increment nonce nonce = 1; value = 1e6; - ({ v, r, s } = signPermit( + const signature2 = signPermit( owner, spender, 1e6, @@ -111,7 +145,7 @@ export function testPermit({ deadline, domainSeparator, alice.key - )); + ); // submit the permit result = await fiatToken.permit( @@ -119,9 +153,7 @@ export function testPermit({ spender, value, deadline, - v, - r, - s, + ...prepareSignature(signature2, signatureBytesType), { from: charlie } ); @@ -138,10 +170,54 @@ export function testPermit({ expect(log.args[2].toNumber()).to.equal(1e6); }); + it("grants allowance when a valid permit is given with (2^256 - 1) as deadline", async () => { + const { owner, spender, value, nonce } = permitParams; + const deadline = MAX_UINT256_HEX; + + const signature = signPermit( + owner, + spender, + value, + nonce, + deadline, + domainSeparator, + alice.key + ); + + // check that the allowance is initially zero + expect((await fiatToken.allowance(owner, spender)).toNumber()).to.equal( + 0 + ); + // check that the next nonce expected is zero + expect((await fiatToken.nonces(owner)).toNumber()).to.equal(0); + + // a third-party, Charlie (not Alice) submits the permit + const result = await fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { from: charlie } + ); + + // check that allowance is updated + expect((await fiatToken.allowance(owner, spender)).toNumber()).to.equal( + value + ); + + // check that Approval event is emitted + const log = result.logs[0] as Truffle.TransactionLog; + expect(log.event).to.equal("Approval"); + expect(log.args[0]).to.equal(owner); + expect(log.args[1]).to.equal(spender); + expect(log.args[2].toNumber()).to.equal(value); + }); + it("reverts if the signature does not match given parameters", async () => { const { owner, spender, value, nonce, deadline } = permitParams; // create a signed permit - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -158,9 +234,7 @@ export function testPermit({ spender, value * 2, // pass incorrect value deadline, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "invalid signature" @@ -171,7 +245,7 @@ export function testPermit({ const { owner, spender, value, nonce, deadline } = permitParams; // create a signed permit to grant Bob permission to spend // Alice's funds on behalf, but sign with Bob's key instead of Alice's - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -184,9 +258,16 @@ export function testPermit({ // try to cheat by submitting the permit that is signed by a // wrong person await expectRevert( - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }), + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ), "invalid signature" ); }); @@ -196,7 +277,7 @@ export function testPermit({ // create a signed permit that won't be valid until 10 seconds // later const deadline = Math.floor(Date.now() / 1000) - 1; - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -208,9 +289,16 @@ export function testPermit({ // try to submit the permit that is expired await expectRevert( - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }), + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ), "permit is expired" ); }); @@ -219,7 +307,7 @@ export function testPermit({ const { owner, spender, value, deadline } = permitParams; const nonce = 1; // create a signed permit - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -233,9 +321,16 @@ export function testPermit({ // try to submit the permit await expectRevert( - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }), + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ), "invalid signature" ); }); @@ -243,7 +338,7 @@ export function testPermit({ it("reverts if the permit has already been used", async () => { const { owner, spender, value, nonce, deadline } = permitParams; // create a signed permit - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -254,15 +349,29 @@ export function testPermit({ ); // submit the permit - await fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }); + await fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ); // try to submit the permit again await expectRevert( - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }), + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ), "invalid signature" ); }); @@ -286,9 +395,7 @@ export function testPermit({ spender, value, deadline, - permit.v, - permit.r, - permit.s, + ...prepareSignature(permit, signatureBytesType), { from: charlie } ); @@ -311,9 +418,7 @@ export function testPermit({ spender, 1e6, deadline, - permit2.v, - permit2.r, - permit2.s, + ...prepareSignature(permit2, signatureBytesType), { from: charlie } ), "invalid signature" @@ -325,7 +430,7 @@ export function testPermit({ // create a signed permit that attempts to grant allowance to the // zero address const spender = ZERO_ADDRESS; - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -337,9 +442,16 @@ export function testPermit({ // try to submit the permit with invalid approval parameters await expectRevert( - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }), + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ), "approve to the zero address" ); }); @@ -354,7 +466,7 @@ export function testPermit({ // create a signed permit for a transfer const validAfter = 0; const nonce = hexStringFromBuffer(crypto.randomBytes(32)); - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -367,9 +479,16 @@ export function testPermit({ // try to submit the transfer permit await expectRevert( - fiatToken.permit(from, to, value, validBefore, v, r, s, { - from: charlie, - }), + fiatToken.permit( + from, + to, + value, + validBefore, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ), "invalid signature" ); }); @@ -377,7 +496,7 @@ export function testPermit({ it("reverts if the contract is paused", async () => { const { owner, spender, value, nonce, deadline } = permitParams; // create a signed permit - const { v, r, s } = signPermit( + const signature = signPermit( owner, spender, value, @@ -392,43 +511,106 @@ export function testPermit({ // try to submit the permit await expectRevert( - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }), + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { from: charlie } + ), "paused" ); }); - it("reverts if the owner or the spender is blacklisted", async () => { - const { owner, spender, value, nonce, deadline } = permitParams; - // create a signed permit - const { v, r, s } = signPermit( - owner, - spender, - value, - nonce, - deadline, - domainSeparator, - alice.key - ); - - // owner is blacklisted - await fiatToken.blacklist(owner, { from: fiatTokenOwner }); - - const submitTx = () => - fiatToken.permit(owner, spender, value, deadline, v, r, s, { - from: charlie, - }); - - // try to submit the permit - await expectRevert(submitTx(), "account is blacklisted"); - - // spender is blacklisted - await fiatToken.unBlacklist(owner, { from: fiatTokenOwner }); - await fiatToken.blacklist(spender, { from: fiatTokenOwner }); - - // try to submit the permit - await expectRevert(submitTx(), "account is blacklisted"); - }); + if (version < 2.2) { + it("reverts if the owner or the spender is blacklisted", async () => { + const { owner, spender, value, nonce, deadline } = permitParams; + // create a signed permit + const signature = signPermit( + owner, + spender, + value, + nonce, + deadline, + domainSeparator, + alice.key + ); + + // owner is blacklisted + await fiatToken.blacklist(owner, { from: fiatTokenOwner }); + + const submitTx = () => + fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ); + + // try to submit the permit + await expectRevert(submitTx(), "account is blacklisted"); + + // spender is blacklisted + await fiatToken.unBlacklist(owner, { from: fiatTokenOwner }); + await fiatToken.blacklist(spender, { from: fiatTokenOwner }); + + // try to submit the permit + await expectRevert(submitTx(), "account is blacklisted"); + }); + } else { + // version >= 2.2 + + it("grants allowance normally when the owner or the spender is blacklisted", async () => { + const { owner, spender, value, deadline } = permitParams; + + const submitTxWithNonce = (nonce: number, value: number) => { + const signature = signPermit( + owner, + spender, + value, + nonce, + deadline, + domainSeparator, + alice.key + ); + return fiatToken.permit( + owner, + spender, + value, + deadline, + ...prepareSignature(signature, signatureBytesType), + { + from: charlie, + } + ); + }; + + // owner is blacklisted + await fiatToken.blacklist(owner, { from: fiatTokenOwner }); + + // try to submit the permit + await submitTxWithNonce(0, value); + // check that allowance is updated + expect((await fiatToken.allowance(owner, spender)).toNumber()).to.equal( + value + ); + + // spender is blacklisted + await fiatToken.unBlacklist(owner, { from: fiatTokenOwner }); + await fiatToken.blacklist(spender, { from: fiatTokenOwner }); + + // try to submit the permit + await submitTxWithNonce(1, value * 2); + // check that allowance is updated + expect((await fiatToken.allowance(owner, spender)).toNumber()).to.equal( + value * 2 + ); + }); + } }); } diff --git a/test/v2/GasAbstraction/testReceiveWithAuthorization.ts b/test/v2/GasAbstraction/testReceiveWithAuthorization.ts index 1dc01d646..fcd445608 100644 --- a/test/v2/GasAbstraction/testReceiveWithAuthorization.ts +++ b/test/v2/GasAbstraction/testReceiveWithAuthorization.ts @@ -1,43 +1,77 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import crypto from "crypto"; -import { FiatTokenV2Instance } from "../../../@types/generated"; +import { MockErc1271WalletInstance } from "../../../@types/generated"; import { AuthorizationUsed, Transfer, } from "../../../@types/generated/FiatTokenV2"; -import { ACCOUNTS_AND_KEYS, MAX_UINT256 } from "../../helpers/constants"; +import { ACCOUNTS_AND_KEYS, MAX_UINT256_HEX } from "../../helpers/constants"; import { expectRevert, hexStringFromBuffer } from "../../helpers"; import { + prepareSignature, receiveWithAuthorizationTypeHash, signReceiveAuthorization, TestParams, + WalletType, } from "./helpers"; +import { AnyFiatTokenV2Instance } from "../../../@types/AnyFiatTokenV2Instance"; export function testReceiveWithAuthorization({ getFiatToken, + getERC1271Wallet, getDomainSeparator, fiatTokenOwner, accounts, + signerWalletType, + signatureBytesType, }: TestParams): void { - describe("receiveWithAuthorization", () => { - let fiatToken: FiatTokenV2Instance; - let domainSeparator: string; + describe(`receiveWithAuthorization with ${signerWalletType} wallet, ${signatureBytesType} signature interface`, async () => { const [alice, charlie] = ACCOUNTS_AND_KEYS; const [, bob, david] = accounts; - let nonce: string; - + const nonce: string = hexStringFromBuffer(crypto.randomBytes(32)); const initialBalance = 10e6; const receiveParams = { - from: alice.address, + from: "", to: bob, value: 7e6, validAfter: 0, - validBefore: MAX_UINT256, + validBefore: MAX_UINT256_HEX, + nonce, }; + let fiatToken: AnyFiatTokenV2Instance; + let aliceWallet: MockErc1271WalletInstance; + let domainSeparator: string; + beforeEach(async () => { fiatToken = getFiatToken(); + aliceWallet = await getERC1271Wallet(alice.address); domainSeparator = getDomainSeparator(); - nonce = hexStringFromBuffer(crypto.randomBytes(32)); + + // Initialize `from` address either as Alice's EOA address or Alice's wallet address + if (signerWalletType == WalletType.AA) { + receiveParams.from = aliceWallet.address; + } else { + receiveParams.from = alice.address; + } + await fiatToken.configureMinter(fiatTokenOwner, 1000000e6, { from: fiatTokenOwner, }); @@ -56,7 +90,7 @@ export function testReceiveWithAuthorization({ const { from, to, value, validAfter, validBefore } = receiveParams; // create an authorization to transfer money from Alice to Bob and sign // with Alice's key - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -82,9 +116,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ); @@ -114,7 +146,7 @@ export function testReceiveWithAuthorization({ it("reverts if the caller is not the payee", async () => { const { from, to, value, validAfter, validBefore } = receiveParams; // create a signed authorization - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -134,9 +166,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: david } ), "caller must be the payee" @@ -146,7 +176,7 @@ export function testReceiveWithAuthorization({ it("reverts if the signature does not match given parameters", async () => { const { from, to, value, validAfter, validBefore } = receiveParams; // create a signed authorization - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -166,9 +196,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "invalid signature" @@ -179,7 +207,7 @@ export function testReceiveWithAuthorization({ const { from, to, value, validAfter, validBefore } = receiveParams; // create an authorization to transfer money from Alice to Bob, but // sign with Bob's key instead of Alice's - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -200,9 +228,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "invalid signature" @@ -214,7 +240,7 @@ export function testReceiveWithAuthorization({ // create a signed authorization that won't be valid until 10 seconds // later const validAfter = Math.floor(Date.now() / 1000) + 10; - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -234,9 +260,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "authorization is not yet valid" @@ -247,7 +271,7 @@ export function testReceiveWithAuthorization({ // create a signed authorization that expires immediately const { from, to, value, validAfter } = receiveParams; const validBefore = Math.floor(Date.now() / 1000); - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -267,9 +291,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "authorization is expired" @@ -280,7 +302,7 @@ export function testReceiveWithAuthorization({ const { from, to, validAfter, validBefore } = receiveParams; // create a signed authorization const value = 1e6; - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -299,9 +321,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ); @@ -314,9 +334,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "authorization is used or canceled" @@ -345,9 +363,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - authorization.v, - authorization.r, - authorization.s, + ...prepareSignature(authorization, signatureBytesType), { from: bob } ); @@ -373,9 +389,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - authorization2.v, - authorization2.r, - authorization2.s, + ...prepareSignature(authorization2, signatureBytesType), { from: bob } ), "authorization is used or canceled" @@ -387,7 +401,7 @@ export function testReceiveWithAuthorization({ // create a signed authorization that attempts to transfer an amount // that exceeds the sender's balance const value = initialBalance + 1; - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -407,9 +421,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "transfer amount exceeds balance" @@ -419,7 +431,7 @@ export function testReceiveWithAuthorization({ it("reverts if the contract is paused", async () => { const { from, to, value, validAfter, validBefore } = receiveParams; // create a signed authorization - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -442,9 +454,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ), "paused" @@ -454,7 +464,7 @@ export function testReceiveWithAuthorization({ it("reverts if the payer or the payee is blacklisted", async () => { const { from, to, value, validAfter, validBefore } = receiveParams; // create a signed authorization - const { v, r, s } = signReceiveAuthorization( + const signature = signReceiveAuthorization( from, to, value, @@ -476,9 +486,7 @@ export function testReceiveWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: bob } ); diff --git a/test/v2/GasAbstraction/testTransferWithAuthorization.ts b/test/v2/GasAbstraction/testTransferWithAuthorization.ts index b7aa71f72..df866a6cf 100644 --- a/test/v2/GasAbstraction/testTransferWithAuthorization.ts +++ b/test/v2/GasAbstraction/testTransferWithAuthorization.ts @@ -1,43 +1,77 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import crypto from "crypto"; -import { FiatTokenV2Instance } from "../../../@types/generated"; +import { MockErc1271WalletInstance } from "../../../@types/generated"; import { AuthorizationUsed, Transfer, } from "../../../@types/generated/FiatTokenV2"; -import { ACCOUNTS_AND_KEYS, MAX_UINT256 } from "../../helpers/constants"; +import { ACCOUNTS_AND_KEYS, MAX_UINT256_HEX } from "../../helpers/constants"; import { expectRevert, hexStringFromBuffer } from "../../helpers"; import { transferWithAuthorizationTypeHash, signTransferAuthorization, TestParams, + WalletType, + prepareSignature, } from "./helpers"; +import { AnyFiatTokenV2Instance } from "../../../@types/AnyFiatTokenV2Instance"; export function testTransferWithAuthorization({ getFiatToken, + getERC1271Wallet, getDomainSeparator, fiatTokenOwner, accounts, + signerWalletType, + signatureBytesType, }: TestParams): void { - describe("transferWithAuthorization", () => { - let fiatToken: FiatTokenV2Instance; - let domainSeparator: string; + describe(`transferWithAuthorization with ${signerWalletType} wallet, ${signatureBytesType} signature interface`, async () => { const [alice, bob] = ACCOUNTS_AND_KEYS; const charlie = accounts[1]; - let nonce: string; - + const nonce: string = hexStringFromBuffer(crypto.randomBytes(32)); const initialBalance = 10e6; const transferParams = { - from: alice.address, + from: "", to: bob.address, value: 7e6, validAfter: 0, - validBefore: MAX_UINT256, + validBefore: MAX_UINT256_HEX, + nonce, }; + let fiatToken: AnyFiatTokenV2Instance; + let aliceWallet: MockErc1271WalletInstance; + let domainSeparator: string; + beforeEach(async () => { fiatToken = getFiatToken(); + aliceWallet = await getERC1271Wallet(alice.address); domainSeparator = getDomainSeparator(); - nonce = hexStringFromBuffer(crypto.randomBytes(32)); + + // Initialize `from` address either as Alice's EOA address or Alice's wallet address + if (signerWalletType == WalletType.AA) { + transferParams.from = aliceWallet.address; + } else { + transferParams.from = alice.address; + } + await fiatToken.configureMinter(fiatTokenOwner, 1000000e6, { from: fiatTokenOwner, }); @@ -56,7 +90,7 @@ export function testTransferWithAuthorization({ const { from, to, value, validAfter, validBefore } = transferParams; // create an authorization to transfer money from Alice to Bob and sign // with Alice's key - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -82,9 +116,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ); @@ -114,7 +146,7 @@ export function testTransferWithAuthorization({ it("reverts if the signature does not match given parameters", async () => { const { from, to, value, validAfter, validBefore } = transferParams; // create a signed authorization - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -134,9 +166,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "invalid signature" @@ -147,7 +177,7 @@ export function testTransferWithAuthorization({ const { from, to, value, validAfter, validBefore } = transferParams; // create an authorization to transfer money from Alice to Bob, but // sign with Bob's key instead of Alice's - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -168,9 +198,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "invalid signature" @@ -182,7 +210,7 @@ export function testTransferWithAuthorization({ // create a signed authorization that won't be valid until 10 seconds // later const validAfter = Math.floor(Date.now() / 1000) + 10; - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -202,9 +230,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "authorization is not yet valid" @@ -215,7 +241,7 @@ export function testTransferWithAuthorization({ // create a signed authorization that expires immediately const { from, to, value, validAfter } = transferParams; const validBefore = Math.floor(Date.now() / 1000); - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -235,9 +261,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "authorization is expired" @@ -248,7 +272,7 @@ export function testTransferWithAuthorization({ const { from, to, validAfter, validBefore } = transferParams; // create a signed authorization const value = 1e6; - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -267,9 +291,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ); @@ -282,9 +304,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "authorization is used or canceled" @@ -313,9 +333,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - authorization.v, - authorization.r, - authorization.s, + ...prepareSignature(authorization, signatureBytesType), { from: charlie } ); @@ -341,9 +359,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - authorization2.v, - authorization2.r, - authorization2.s, + ...prepareSignature(authorization2, signatureBytesType), { from: charlie } ), "authorization is used or canceled" @@ -355,7 +371,7 @@ export function testTransferWithAuthorization({ // create a signed authorization that attempts to transfer an amount // that exceeds the sender's balance const value = initialBalance + 1; - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -375,9 +391,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "transfer amount exceeds balance" @@ -387,7 +401,7 @@ export function testTransferWithAuthorization({ it("reverts if the contract is paused", async () => { const { from, to, value, validAfter, validBefore } = transferParams; // create a signed authorization - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -410,9 +424,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ), "paused" @@ -422,7 +434,7 @@ export function testTransferWithAuthorization({ it("reverts if the payer or the payee is blacklisted", async () => { const { from, to, value, validAfter, validBefore } = transferParams; // create a signed authorization - const { v, r, s } = signTransferAuthorization( + const signature = signTransferAuthorization( from, to, value, @@ -444,9 +456,7 @@ export function testTransferWithAuthorization({ validAfter, validBefore, nonce, - v, - r, - s, + ...prepareSignature(signature, signatureBytesType), { from: charlie } ); diff --git a/test/v2/GasAbstraction/testTransferWithMultipleAuthorizations.ts b/test/v2/GasAbstraction/testTransferWithMultipleAuthorizations.ts index de10459de..2953bd24f 100644 --- a/test/v2/GasAbstraction/testTransferWithMultipleAuthorizations.ts +++ b/test/v2/GasAbstraction/testTransferWithMultipleAuthorizations.ts @@ -1,9 +1,24 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import crypto from "crypto"; -import { - FiatTokenV2Instance, - FiatTokenUtilInstance, -} from "../../../@types/generated"; -import { ACCOUNTS_AND_KEYS, MAX_UINT256 } from "../../helpers/constants"; +import { FiatTokenUtilInstance } from "../../../@types/generated"; +import { ACCOUNTS_AND_KEYS, MAX_UINT256_HEX } from "../../helpers/constants"; import { expectRevert, hexStringFromBuffer, @@ -13,6 +28,7 @@ import { } from "../../helpers"; import { signTransferAuthorization, TestParams } from "./helpers"; import { TransactionRawLog } from "../../../@types/TransactionRawLog"; +import { AnyFiatTokenV2Instance } from "../../../@types/AnyFiatTokenV2Instance"; const FiatTokenUtil = artifacts.require("FiatTokenUtil"); const ContractThatReverts = artifacts.require("ContractThatReverts"); @@ -22,29 +38,31 @@ export function testTransferWithMultipleAuthorizations({ getDomainSeparator, fiatTokenOwner, accounts, + signerWalletType, }: TestParams): void { - describe("transferWithMultipleAuthorizations", () => { - let fiatToken: FiatTokenV2Instance; - let fiatTokenUtil: FiatTokenUtilInstance; - let domainSeparator: string; + describe(`transferWithMultipleAuthorization with ${signerWalletType} wallet`, async () => { const [alice, bob] = ACCOUNTS_AND_KEYS; const charlie = accounts[1]; - let nonce: string; - + const nonce: string = hexStringFromBuffer(crypto.randomBytes(32)); const initialBalance = 10e6; const transferParams = { from: alice.address, to: bob.address, value: 7e6, validAfter: 0, - validBefore: MAX_UINT256, + validBefore: MAX_UINT256_HEX, + nonce, }; + let fiatToken: AnyFiatTokenV2Instance; + let fiatTokenUtil: FiatTokenUtilInstance; + let domainSeparator: string; + beforeEach(async () => { fiatToken = getFiatToken(); fiatTokenUtil = await FiatTokenUtil.new(fiatToken.address); domainSeparator = getDomainSeparator(); - nonce = hexStringFromBuffer(crypto.randomBytes(32)); + await fiatToken.configureMinter(fiatTokenOwner, 1000000e6, { from: fiatTokenOwner, }); diff --git a/test/v2/MockFiatTokenWithEditableBalanceAndBlacklistStates.test.ts b/test/v2/MockFiatTokenWithEditableBalanceAndBlacklistStates.test.ts new file mode 100644 index 000000000..25612028a --- /dev/null +++ b/test/v2/MockFiatTokenWithEditableBalanceAndBlacklistStates.test.ts @@ -0,0 +1,220 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BN from "bn.js"; +import { MockFiatTokenWithEditableBalanceAndBlacklistStatesInstance } from "../../@types/generated"; +import { expectRevert, initializeToVersion } from "../helpers"; +import { ACCOUNTS_AND_KEYS, POW_2_255_BN } from "../helpers/constants"; + +const SignatureChecker = artifacts.require("SignatureChecker"); +const MockFiatTokenWithEditableBalanceAndBlacklistStates = artifacts.require( + "MockFiatTokenWithEditableBalanceAndBlacklistStates" +); + +contract("MockFiatTokenWithEditableBalanceAndBlacklistStates", (accounts) => { + const fiatTokenOwner = accounts[9]; + const userOne = ACCOUNTS_AND_KEYS[0].address; + + let fiatToken: MockFiatTokenWithEditableBalanceAndBlacklistStatesInstance; + + const ZERO = new BN(0); + const SEVEN = new BN(7, 10); + + beforeEach(async () => { + await SignatureChecker.new(); + MockFiatTokenWithEditableBalanceAndBlacklistStates.link(SignatureChecker); + fiatToken = await MockFiatTokenWithEditableBalanceAndBlacklistStates.new(); + const [, , lostAndFound] = accounts; + await initializeToVersion(fiatToken, "2.2", fiatTokenOwner, lostAndFound); + }); + + async function expectBalanceAndBlacklistStatesToBe( + account: string, + expectedState: BN + ) { + const currentState = await fiatToken.getBalanceAndBlacklistStates(account); + expect(currentState.eq(expectedState)).to.be.true; + } + + describe("internal_setBlacklistState", () => { + context("when _shouldBlacklist is true", () => { + const _shouldBlacklist = true; + + it("should store 2^255 if the account was not blacklisted", async () => { + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + + await fiatToken.internal_setBlacklistState(userOne, _shouldBlacklist); + + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + }); + + it("should retain 2^255 if the account was blacklisted", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, POW_2_255_BN); + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + + await fiatToken.internal_setBlacklistState(userOne, _shouldBlacklist); + + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + }); + + it("should store (2^255 + previous balance) if the account has a balance", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, SEVEN); + await expectBalanceAndBlacklistStatesToBe(userOne, SEVEN); + + await fiatToken.internal_setBlacklistState(userOne, _shouldBlacklist); + + await expectBalanceAndBlacklistStatesToBe( + userOne, + POW_2_255_BN.add(SEVEN) + ); + }); + }); + + context("when _shouldBlacklist is false", () => { + const _shouldBlacklist = false; + + it("should store 0 if the account was blacklisted", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, POW_2_255_BN); + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + + await fiatToken.internal_setBlacklistState(userOne, _shouldBlacklist); + + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + }); + + it("should retain 0 if the account was not blacklisted", async () => { + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + + await fiatToken.internal_setBlacklistState(userOne, _shouldBlacklist); + + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + }); + + it("should store previous balance if the account has a balance", async () => { + await fiatToken.setBalanceAndBlacklistStates( + userOne, + POW_2_255_BN.add(SEVEN) + ); + await expectBalanceAndBlacklistStatesToBe( + userOne, + POW_2_255_BN.add(SEVEN) + ); + + await fiatToken.internal_setBlacklistState(userOne, _shouldBlacklist); + + await expectBalanceAndBlacklistStatesToBe(userOne, SEVEN); + }); + }); + }); + + describe("internal_setBalance", () => { + it("should revert if new balance is greater than or equal to 2^255", async () => { + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + + const newBalance = POW_2_255_BN; // 2^255 + await expectRevert( + fiatToken.internal_setBalance(userOne, newBalance), + "FiatTokenV2_2: Balance exceeds (2^255 - 1)" + ); + + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + }); + + it("should revert if the account is blacklisted", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, POW_2_255_BN); + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + + const newBalance = SEVEN; + await expectRevert( + fiatToken.internal_setBalance(userOne, newBalance), + "FiatTokenV2_2: Account is blacklisted" + ); + + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + }); + + it("should always reset balances to the _balance parameter if new balance is less than 2^255 and account is not blacklisted", async () => { + const newBalance = POW_2_255_BN.sub(new BN(1)); // 2^255 - 1 + await expectBalanceAndBlacklistStatesToBe(userOne, ZERO); + + // Set to some high value. + await fiatToken.internal_setBalance(userOne, newBalance); + await expectBalanceAndBlacklistStatesToBe(userOne, newBalance); + + // Then, choose a lower value, ensuring that it sets to the value. + await fiatToken.internal_setBalance(userOne, SEVEN); + await expectBalanceAndBlacklistStatesToBe(userOne, SEVEN); + + // Then, choose a higher value, ensuring that it sets to the value. + await fiatToken.internal_setBalance(userOne, newBalance); + await expectBalanceAndBlacklistStatesToBe(userOne, newBalance); + }); + }); + + describe("internal_isBlacklisted", () => { + it("should return false if the high bit is 0", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, SEVEN); + expect(await fiatToken.internal_isBlacklisted(userOne)).to.be.false; + }); + + it("should return true if the high bit is 1", async () => { + await fiatToken.setBalanceAndBlacklistStates( + userOne, + POW_2_255_BN.add(SEVEN) + ); + expect(await fiatToken.internal_isBlacklisted(userOne)).to.be.true; + }); + + it("should not change balanceAndBlacklistState", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, SEVEN); + await fiatToken.internal_isBlacklisted(userOne); + await expectBalanceAndBlacklistStatesToBe(userOne, SEVEN); + + await fiatToken.setBalanceAndBlacklistStates(userOne, POW_2_255_BN); + await fiatToken.internal_isBlacklisted(userOne); + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + }); + }); + + describe("internal_balanceOf", () => { + it("should return the correct balance when the high bit is 0", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, SEVEN); + expect((await fiatToken.internal_balanceOf(userOne)).eq(SEVEN)).to.be + .true; + }); + + it("should return the correct balance when the high bit is 1", async () => { + await fiatToken.setBalanceAndBlacklistStates( + userOne, + POW_2_255_BN.add(SEVEN) + ); + expect((await fiatToken.internal_balanceOf(userOne)).eq(SEVEN)).to.be + .true; + }); + + it("should not change balanceAndBlacklistState", async () => { + await fiatToken.setBalanceAndBlacklistStates(userOne, SEVEN); + await fiatToken.internal_balanceOf(userOne); + await expectBalanceAndBlacklistStatesToBe(userOne, SEVEN); + + await fiatToken.setBalanceAndBlacklistStates(userOne, POW_2_255_BN); + await fiatToken.internal_balanceOf(userOne); + await expectBalanceAndBlacklistStatesToBe(userOne, POW_2_255_BN); + }); + }); +}); diff --git a/test/v2/MockFiatTokenWithEditableChainId.test.ts b/test/v2/MockFiatTokenWithEditableChainId.test.ts new file mode 100644 index 000000000..d68adfb67 --- /dev/null +++ b/test/v2/MockFiatTokenWithEditableChainId.test.ts @@ -0,0 +1,75 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MockFiatTokenWithEditableChainIdInstance } from "../../@types/generated"; +import { makeDomainSeparator } from "../helpers"; + +const SignatureChecker = artifacts.require("SignatureChecker"); +const MockFiatTokenWithEditableChainId = artifacts.require( + "MockFiatTokenWithEditableChainId" +); + +contract("MockFiatTokenWithEditableChainId", (accounts) => { + const fiatTokenOwner = accounts[9]; + let fiatToken: MockFiatTokenWithEditableChainIdInstance; + + const name = "USD Coin"; + const version = "2"; + + beforeEach(async () => { + await SignatureChecker.new(); + MockFiatTokenWithEditableChainId.link(SignatureChecker); + fiatToken = await MockFiatTokenWithEditableChainId.new(); + + await fiatToken.initialize( + name, + "USDC", + "USD", + 6, + fiatTokenOwner, + fiatTokenOwner, + fiatTokenOwner, + fiatTokenOwner + ); + await fiatToken.initializeV2("USD Coin", { from: fiatTokenOwner }); + const [, , lostAndFound] = accounts; + await fiatToken.initializeV2_1(lostAndFound); + await fiatToken.initializeV2_2([], "USDCUSDC"); + }); + + describe("DOMAIN_SEPARATOR", () => { + it("domain separator gets recalculated after chain ID changes", async () => { + const chainId: number = (await fiatToken.chainId()).toNumber(); + const originalDomainSeparator: string = await fiatToken.DOMAIN_SEPARATOR(); + assert.equal( + originalDomainSeparator, + makeDomainSeparator(name, version, chainId, fiatToken.address) + ); + + const newChainId = 1234; + await fiatToken.setChainId(newChainId); + + const newDomainSeparator: string = await fiatToken.DOMAIN_SEPARATOR(); + + assert.equal( + newDomainSeparator, + makeDomainSeparator(name, version, newChainId, fiatToken.address) + ); + }); + }); +}); diff --git a/test/v2/V2Upgrader.test.ts b/test/v2/V2Upgrader.test.ts index ab60cd522..1ecba64cf 100644 --- a/test/v2/V2Upgrader.test.ts +++ b/test/v2/V2Upgrader.test.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import crypto from "crypto"; import { FiatTokenV1Instance, @@ -5,7 +23,7 @@ import { FiatTokenProxyInstance, } from "../../@types/generated"; import { signTransferAuthorization } from "./GasAbstraction/helpers"; -import { MAX_UINT256, ACCOUNTS_AND_KEYS } from "../helpers/constants"; +import { MAX_UINT256_HEX, ACCOUNTS_AND_KEYS } from "../helpers/constants"; import { hexStringFromBuffer, expectRevert } from "../helpers"; const FiatTokenProxy = artifacts.require("FiatTokenProxy"); @@ -52,7 +70,7 @@ contract("V2Upgrader", (accounts) => { expect(await upgrader.newProxyAdmin()).to.equal(originalProxyAdmin); expect(await upgrader.newName()).to.equal("USD Coin"); - // Transfer 0.2 USDC to the contract + // Transfer 0.2 FiatToken to the contract await proxyAsV1.transfer(upgrader.address, 2e5, { from: minter }); // Transfer admin role to the contract @@ -94,7 +112,7 @@ contract("V2Upgrader", (accounts) => { minter, 1e5, 0, - MAX_UINT256, + MAX_UINT256_HEX, nonce, await proxyAsV2.DOMAIN_SEPARATOR(), user2.key // Signed with someone else's key @@ -106,7 +124,7 @@ contract("V2Upgrader", (accounts) => { minter, 1e5, 0, - MAX_UINT256, + MAX_UINT256_HEX, nonce, invalidAuthorization.v, invalidAuthorization.r, @@ -121,7 +139,7 @@ contract("V2Upgrader", (accounts) => { minter, 1e5, 0, - MAX_UINT256, + MAX_UINT256_HEX, nonce, await proxyAsV2.DOMAIN_SEPARATOR(), user.key @@ -133,7 +151,7 @@ contract("V2Upgrader", (accounts) => { minter, 1e5, 0, - MAX_UINT256, + MAX_UINT256_HEX, nonce, validAuthorization.v, validAuthorization.r, @@ -162,7 +180,7 @@ contract("V2Upgrader", (accounts) => { { from: upgraderOwner } ); - // Transfer 0.2 USDC to the contract + // Transfer 0.2 FiatToken to the contract await proxyAsV1.transfer(upgrader.address, 2e5, { from: minter }); // Transfer admin role to the contract @@ -197,7 +215,7 @@ contract("V2Upgrader", (accounts) => { { from: upgraderOwner } ); - // Transfer 0.2 USDC to the contract + // Transfer 0.2 FiatToken to the contract await proxyAsV1.transfer(upgrader.address, 2e5, { from: minter }); // Transfer admin role to the contract diff --git a/test/v2/V2_1Upgrader.test.ts b/test/v2/V2_1Upgrader.test.ts index 4496ebe22..526d97c49 100644 --- a/test/v2/V2_1Upgrader.test.ts +++ b/test/v2/V2_1Upgrader.test.ts @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { FiatTokenV2Instance, FiatTokenV21Instance, @@ -59,10 +77,10 @@ contract("V2_1Upgrader", (accounts) => { expect(await upgrader.newProxyAdmin()).to.equal(originalProxyAdmin); expect(await upgrader.lostAndFound()).to.equal(lostAndFound); - // Transfer 0.2 USDC to the upgrader contract + // Transfer 0.2 FiatToken to the upgrader contract await proxyAsV2.transfer(upgrader.address, 2e5, { from: minter }); - // Transfer 100 USDC to the FiatTokenProxy contract + // Transfer 100 FiatToken to the FiatTokenProxy contract await proxyAsV2.transfer(proxyAsV2_1.address, 100e6, { from: minter }); // Transfer admin role to the contract @@ -81,7 +99,7 @@ contract("V2_1Upgrader", (accounts) => { v2_1Implementation.address ); - // 0.2 USDC is transferred back to the upgraderOwner + // 0.2 FiatToken is transferred back to the upgraderOwner expect( (await proxyAsV2_1.balanceOf(upgrader.address)).toNumber() ).to.equal(0); @@ -89,7 +107,7 @@ contract("V2_1Upgrader", (accounts) => { 2e5 ); - // the USDC tokens held by the proxy contract are transferred to the lost + // the FiatToken tokens held by the proxy contract are transferred to the lost // and found address expect( (await proxyAsV2_1.balanceOf(proxyAsV2_1.address)).toNumber() @@ -162,13 +180,13 @@ contract("V2_1Upgrader", (accounts) => { const upgrader = await V2_1Upgrader.new( fiatTokenProxy.address, - fiatTokenV1_1.address, // provide V1.1 implementation instead of V2 + fiatTokenV1_1.address, // provide V1.1 implementation instead of V2.1 originalProxyAdmin, lostAndFound, { from: upgraderOwner } ); - // Transfer 0.2 USDC to the contract + // Transfer 0.2 FiatToken to the contract await proxyAsV2.transfer(upgrader.address, 2e5, { from: minter }); // Transfer admin role to the contract @@ -176,7 +194,7 @@ contract("V2_1Upgrader", (accounts) => { from: originalProxyAdmin, }); - // Upgrade should fail because initializeV2 function doesn't exist on V1.1 + // Upgrade should fail because initializeV2_1 function doesn't exist on V1.1 await expectRevert(upgrader.upgrade({ from: upgraderOwner }), "revert"); // The proxy admin role is not transferred @@ -203,7 +221,7 @@ contract("V2_1Upgrader", (accounts) => { { from: upgraderOwner } ); - // Transfer 0.2 USDC to the contract + // Transfer 0.2 FiatToken to the contract await proxyAsV2.transfer(upgrader.address, 2e5, { from: minter }); // Transfer admin role to the contract diff --git a/test/v2/V2_2Upgrader.test.ts b/test/v2/V2_2Upgrader.test.ts new file mode 100644 index 000000000..98582377d --- /dev/null +++ b/test/v2/V2_2Upgrader.test.ts @@ -0,0 +1,468 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + FiatTokenProxyInstance, + FiatTokenV21Instance, + FiatTokenV22Instance, + V22UpgraderInstance, +} from "../../@types/generated"; +import { + expectRevert, + generateAccounts, + initializeToVersion, +} from "../helpers"; +import { readBlacklistFile } from "../../utils"; +import path from "path"; +import { toLower } from "lodash"; +import { BLOCK_GAS_LIMIT } from "../helpers/constants"; + +const FiatTokenProxy = artifacts.require("FiatTokenProxy"); +const FiatTokenV1_1 = artifacts.require("FiatTokenV1_1"); +const FiatTokenV2_1 = artifacts.require("FiatTokenV2_1"); +const FiatTokenV2_2 = artifacts.require("FiatTokenV2_2"); +const V2_2Upgrader = artifacts.require("V2_2Upgrader"); +const accountsToBlacklist = readBlacklistFile( + path.join(__dirname, "..", "..", "blacklist.test.json") +); + +contract("V2_2Upgrader", (accounts) => { + let fiatTokenProxy: FiatTokenProxyInstance; + let proxyAsV2_1: FiatTokenV21Instance; + let proxyAsV2_2: FiatTokenV22Instance; + let v2_1Implementation: FiatTokenV21Instance; + let v2_2Implementation: FiatTokenV22Instance; + let v2_2Upgrader: V22UpgraderInstance; + let upgraderOwner: string; + let v2_1MasterMinter: string; + let originalProxyAdmin: string; + + const newSymbol = "USDCUSDC"; // Use a symbol different from original symbol + const blacklisterAccount = accounts[4]; + const [minter, lostAndFound, alice, bob] = accounts.slice(9); + + before(async () => { + // Run the tests on the contracts deployed by Truffle to ensure the Truffle + // migration is written correctly + fiatTokenProxy = await FiatTokenProxy.deployed(); + v2_1Implementation = await FiatTokenV2_1.deployed(); + v2_2Implementation = await FiatTokenV2_2.deployed(); + v2_2Upgrader = await V2_2Upgrader.new( + fiatTokenProxy.address, + v2_2Implementation.address, + await fiatTokenProxy.admin(), + accountsToBlacklist, + newSymbol + ); + + proxyAsV2_1 = await FiatTokenV2_1.at(fiatTokenProxy.address); + proxyAsV2_2 = await FiatTokenV2_2.at(fiatTokenProxy.address); + + originalProxyAdmin = await fiatTokenProxy.admin(); + upgraderOwner = await v2_2Upgrader.owner(); + v2_1MasterMinter = await proxyAsV2_1.masterMinter(); + + // Upgrade from v1 to v2.1 + await fiatTokenProxy.upgradeTo(v2_1Implementation.address, { + from: originalProxyAdmin, + }); + await proxyAsV2_1.initializeV2("USD Coin"); + await proxyAsV2_1.initializeV2_1(lostAndFound); + + // Initially blacklist all these accounts. + await Promise.all( + accountsToBlacklist.map((account) => + proxyAsV2_2.blacklist(account, { from: blacklisterAccount }) + ) + ); + }); + + describe("proxy", () => { + it("should return the correct address", async () => { + expect(await v2_2Upgrader.proxy()).to.equal(fiatTokenProxy.address); + }); + }); + + describe("implementation", () => { + it("should return the correct address", async () => { + expect(await v2_2Upgrader.implementation()).to.equal( + v2_2Implementation.address + ); + }); + }); + + describe("helper", () => { + it("should be non empty", async () => { + expect(await v2_2Upgrader.helper()).to.not.be.empty; + }); + }); + + describe("newProxyAdmin", () => { + it("should return the correct address", async () => { + expect(await v2_2Upgrader.newProxyAdmin()).to.equal(originalProxyAdmin); + }); + }); + + describe("accountsToBlacklist", () => { + it("should return the correct list of addresses read in blacklist.test.json", async () => { + const actualAccountsToBlacklist = await v2_2Upgrader.accountsToBlacklist(); + expect(actualAccountsToBlacklist.map(toLower)).to.deep.equal( + accountsToBlacklist.map(toLower) + ); + }); + }); + + describe("withdrawFiatToken", () => { + it("should return the FiatToken to the transaction sender", async () => { + // Mint 0.2 FiatToken. + await proxyAsV2_1.configureMinter(minter, 2e5, { + from: v2_1MasterMinter, + }); + await proxyAsV2_1.mint(minter, 2e5, { from: minter }); + expect((await proxyAsV2_1.balanceOf(minter)).toNumber()).to.equal(2e5); + expect( + (await proxyAsV2_1.balanceOf(v2_2Upgrader.address)).toNumber() + ).to.equal(0); + + // Transfer 0.2 FiatToken to the upgrader contract. + await proxyAsV2_1.transfer(v2_2Upgrader.address, 2e5, { from: minter }); + expect((await proxyAsV2_1.balanceOf(minter)).toNumber()).to.equal(0); + expect( + (await proxyAsV2_1.balanceOf(v2_2Upgrader.address)).toNumber() + ).to.equal(2e5); + + // Withdraw the FiatToken from the upgrader contract. + await v2_2Upgrader.withdrawFiatToken({ from: upgraderOwner }); + expect((await proxyAsV2_1.balanceOf(upgraderOwner)).toNumber()).to.equal( + 2e5 + ); + expect( + (await proxyAsV2_1.balanceOf(v2_2Upgrader.address)).toNumber() + ).to.equal(0); + + // Cleanup - Burn 0.2 FiatToken. + await proxyAsV2_1.transfer(minter, 2e5, { from: upgraderOwner }); + await proxyAsV2_1.burn(2e5, { from: minter }); + }); + }); + + describe("upgrade", () => { + it("upgrades, transfers proxy admin role to newProxyAdmin, runs tests, and self-destructs", async () => { + // Transfer 0.2 FiatToken to the upgrader contract + await proxyAsV2_1.configureMinter(minter, 2e5, { + from: v2_1MasterMinter, + }); + await proxyAsV2_1.mint(minter, 2e5, { from: minter }); + await proxyAsV2_1.transfer(v2_2Upgrader.address, 2e5, { from: minter }); + + // Transfer admin role to the contract + await fiatTokenProxy.changeAdmin(v2_2Upgrader.address, { + from: originalProxyAdmin, + }); + + // Call upgrade + await v2_2Upgrader.upgrade({ from: upgraderOwner }); + + // The proxy admin role is transferred back to originalProxyAdmin + expect(await fiatTokenProxy.admin()).to.equal(originalProxyAdmin); + + // The implementation is updated to V2.2 + expect(await fiatTokenProxy.implementation()).to.equal( + v2_2Implementation.address + ); + + // 0.2 FiatToken is transferred back to the upgraderOwner + expect( + (await proxyAsV2_2.balanceOf(v2_2Upgrader.address)).toNumber() + ).to.equal(0); + expect((await proxyAsV2_2.balanceOf(upgraderOwner)).toNumber()).to.equal( + 2e5 + ); + + // token proxy contract is blacklisted + expect(await proxyAsV2_2.isBlacklisted(proxyAsV2_2.address)).to.equal( + true + ); + + // All accountsToBlacklist are still blacklisted + const areAccountsBlacklisted = await Promise.all( + accountsToBlacklist.map((account) => proxyAsV2_2.isBlacklisted(account)) + ); + expect(areAccountsBlacklisted.every((b) => b)).to.be.true; + + // mint works as expected + await proxyAsV2_2.configureMinter(minter, 1000e6, { + from: await proxyAsV2_2.masterMinter(), + }); + expect((await proxyAsV2_2.minterAllowance(minter)).toNumber()).to.equal( + 1000e6 + ); + await proxyAsV2_2.mint(alice, 1000e6, { from: minter }); + expect((await proxyAsV2_2.balanceOf(alice)).toNumber()).to.equal(1000e6); + expect((await proxyAsV2_2.minterAllowance(minter)).toNumber()).to.equal( + 0 + ); + + await expectRevert( + proxyAsV2_2.mint(alice, 1, { from: alice }), + "caller is not a minter" + ); + + // transfer works as expected + await proxyAsV2_2.transfer(bob, 200e6, { from: alice }); + expect((await proxyAsV2_2.balanceOf(alice)).toNumber()).to.equal(800e6); + expect((await proxyAsV2_2.balanceOf(bob)).toNumber()).to.equal(200e6); + + await expectRevert( + proxyAsV2_2.transfer(proxyAsV2_2.address, 1, { from: alice }), + "account is blacklisted" + ); + + // approve/transferFrom work as expected + await proxyAsV2_2.approve(bob, 250e6, { from: alice }); + expect((await proxyAsV2_2.allowance(alice, bob)).toNumber()).to.equal( + 250e6 + ); + await proxyAsV2_2.transferFrom(alice, bob, 250e6, { from: bob }); + expect((await proxyAsV2_2.allowance(alice, bob)).toNumber()).to.equal(0); + expect((await proxyAsV2_2.balanceOf(alice)).toNumber()).to.equal(550e6); + expect((await proxyAsV2_2.balanceOf(bob)).toNumber()).to.equal(450e6); + + // burn works as expected + await proxyAsV2_2.transfer(minter, 100e6, { from: alice }); + expect((await proxyAsV2_2.balanceOf(minter)).toNumber()).to.equal(100e6); + await proxyAsV2_2.burn(100e6, { from: minter }); + expect((await proxyAsV2_2.balanceOf(minter)).toNumber()).to.equal(0); + + await expectRevert( + proxyAsV2_2.burn(1, { from: alice }), + "caller is not a minter" + ); + }); + + it("reverts if there is an error", async () => { + const _fiatTokenProxy = await FiatTokenProxy.new( + v2_1Implementation.address, + { from: originalProxyAdmin } + ); + await initializeToVersion(_fiatTokenProxy, "2.1", minter, lostAndFound); + const _proxyAsV2_1 = await FiatTokenV2_1.at(_fiatTokenProxy.address); + + const _v1_1Implementation = await FiatTokenV1_1.new(); + const upgraderOwner = accounts[0]; + + const _v2_2Upgrader = await V2_2Upgrader.new( + _fiatTokenProxy.address, + _v1_1Implementation.address, // provide V1.1 implementation instead of V2.2 + originalProxyAdmin, + [], + newSymbol, + { from: upgraderOwner } + ); + + // Transfer 0.2 FiatToken to the contract + await _proxyAsV2_1.configureMinter(minter, 2e5, { + from: await _proxyAsV2_1.masterMinter(), + }); + await _proxyAsV2_1.mint(minter, 2e5, { from: minter }); + await _proxyAsV2_1.transfer(_v2_2Upgrader.address, 2e5, { from: minter }); + + // Transfer admin role to the contract + await _fiatTokenProxy.changeAdmin(_v2_2Upgrader.address, { + from: originalProxyAdmin, + }); + + // Upgrade should fail because initializeV2_2 function doesn't exist on V1.1 + await expectRevert( + _v2_2Upgrader.upgrade({ from: upgraderOwner }), + "revert" + ); + + // The proxy admin role is not transferred + expect(await _fiatTokenProxy.admin()).to.equal(_v2_2Upgrader.address); + + // The implementation is left unchanged + expect(await _fiatTokenProxy.implementation()).to.equal( + v2_1Implementation.address + ); + }); + + it("reverts if blacklisting an account that was not blacklisted", async () => { + const _fiatTokenProxy = await FiatTokenProxy.new( + v2_1Implementation.address, + { from: originalProxyAdmin } + ); + await initializeToVersion(_fiatTokenProxy, "2.1", minter, lostAndFound); + const _proxyAsV2_1 = await FiatTokenV2_1.at(_fiatTokenProxy.address); + + const _v2_2Implementation = await FiatTokenV2_2.new(); + const upgraderOwner = accounts[0]; + + // Try blacklisting an account that was not originally blacklisted. + const accountsToBlacklist = generateAccounts(1); + const _v2_2Upgrader = await V2_2Upgrader.new( + _fiatTokenProxy.address, + _v2_2Implementation.address, + originalProxyAdmin, + accountsToBlacklist, + newSymbol, + { from: upgraderOwner } + ); + + // Transfer 0.2 FiatToken to the contract + await _proxyAsV2_1.configureMinter(minter, 2e5, { + from: await _proxyAsV2_1.masterMinter(), + }); + await _proxyAsV2_1.mint(minter, 2e5, { from: minter }); + await _proxyAsV2_1.transfer(_v2_2Upgrader.address, 2e5, { from: minter }); + + // Transfer admin role to the contract + await _fiatTokenProxy.changeAdmin(_v2_2Upgrader.address, { + from: originalProxyAdmin, + }); + + // Upgrade should fail because the account to blacklist was not previously blacklisted. + await expectRevert( + _v2_2Upgrader.upgrade({ from: upgraderOwner }), + "FiatTokenV2_2: Blacklisting previously unblacklisted account!" + ); + + // The proxy admin role is not transferred + expect(await _fiatTokenProxy.admin()).to.equal(_v2_2Upgrader.address); + + // The implementation is left unchanged + expect(await _fiatTokenProxy.implementation()).to.equal( + v2_1Implementation.address + ); + }); + + describe("gas tests", () => { + const gasTests: [number, number][] = [ + [100, BLOCK_GAS_LIMIT * 0.1], + [500, BLOCK_GAS_LIMIT * 0.5], + ]; + gasTests.forEach(([numAccounts, gasTarget]) => { + it(`should not exceed ${gasTarget} gas when blacklisting ${numAccounts} accounts`, async () => { + const accountsToBlacklist = generateAccounts(numAccounts); + + const _fiatTokenProxy = await FiatTokenProxy.new( + v2_1Implementation.address, + { from: originalProxyAdmin } + ); + await initializeToVersion( + _fiatTokenProxy, + "2.1", + minter, + lostAndFound + ); + const _proxyAsV2_1 = await FiatTokenV2_1.at(_fiatTokenProxy.address); + + // Blacklist the accounts in _deprecatedBlacklist first + await Promise.all( + accountsToBlacklist.map((a) => + _proxyAsV2_1.blacklist(a, { from: minter }) + ) + ); + + // Set up the V2_2Upgrader + const _v2_2Implementation = await FiatTokenV2_2.new(); + const upgraderOwner = accounts[0]; + const _v2_2Upgrader = await V2_2Upgrader.new( + _fiatTokenProxy.address, + _v2_2Implementation.address, + originalProxyAdmin, + accountsToBlacklist, + newSymbol, + { from: upgraderOwner, gas: BLOCK_GAS_LIMIT } + ); + + // Transfer 0.2 FiatToken to the contract + await _proxyAsV2_1.configureMinter(minter, 2e5, { + from: await _proxyAsV2_1.masterMinter(), + }); + await _proxyAsV2_1.mint(minter, 2e5, { from: minter }); + await _proxyAsV2_1.transfer(_v2_2Upgrader.address, 2e5, { + from: minter, + }); + + // Transfer admin role to the contract + await _fiatTokenProxy.changeAdmin(_v2_2Upgrader.address, { + from: originalProxyAdmin, + }); + + // Perform the upgrade. + const txReceipt = await _v2_2Upgrader.upgrade({ + from: upgraderOwner, + gas: BLOCK_GAS_LIMIT, + }); + const gasUsed = txReceipt.receipt.gasUsed; + console.log({ numAccounts, gasUsed }); + expect(gasUsed).to.be.lessThan(gasTarget); + + // Sanity check that upgrade worked. + expect(await _fiatTokenProxy.implementation()).to.equal( + _v2_2Implementation.address + ); + }); + }); + }); + }); + + describe("abortUpgrade", () => { + it("transfers proxy admin role to newProxyAdmin, and self-destructs", async () => { + const _fiatTokenProxy = await FiatTokenProxy.new( + v2_1Implementation.address, + { from: originalProxyAdmin } + ); + await initializeToVersion(_fiatTokenProxy, "2.1", minter, lostAndFound); + + const upgraderOwner = accounts[0]; + const _v2_2Upgrader = await V2_2Upgrader.new( + _fiatTokenProxy.address, + v2_1Implementation.address, + originalProxyAdmin, + [], + newSymbol, + { from: upgraderOwner } + ); + const _v2_2UpgraderHelperAddress = await _v2_2Upgrader.helper(); + + // Transfer admin role to the contract + await _fiatTokenProxy.changeAdmin(_v2_2Upgrader.address, { + from: originalProxyAdmin, + }); + + // Call abortUpgrade + await _v2_2Upgrader.abortUpgrade({ from: upgraderOwner }); + + // The proxy admin role is transferred back to originalProxyAdmin + expect(await _fiatTokenProxy.admin()).to.equal(originalProxyAdmin); + + // The implementation is left unchanged + expect(await _fiatTokenProxy.implementation()).to.equal( + v2_1Implementation.address + ); + + // The upgrader contract is self-destructed. + expect(await web3.eth.getCode(_v2_2Upgrader.address)).to.equal("0x"); + + // The upgrader helper contract is self-destructed. + expect(await web3.eth.getCode(_v2_2UpgraderHelperAddress)).to.equal("0x"); + }); + }); +}); diff --git a/test/v2/safeAllowance.behavior.ts b/test/v2/safeAllowance.behavior.ts index 911c87c7d..e3c9c2b2f 100644 --- a/test/v2/safeAllowance.behavior.ts +++ b/test/v2/safeAllowance.behavior.ts @@ -1,15 +1,34 @@ -import { FiatTokenV2Instance } from "../../@types/generated"; +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AnyFiatTokenV2Instance } from "../../@types/AnyFiatTokenV2Instance"; import { Approval } from "../../@types/generated/FiatTokenV2"; import { expectRevert } from "../helpers"; -import { MAX_UINT256 } from "../helpers/constants"; +import { MAX_UINT256_HEX } from "../helpers/constants"; export function hasSafeAllowance( - getFiatToken: () => FiatTokenV2Instance, + version: number, + getFiatToken: () => AnyFiatTokenV2Instance, fiatTokenOwner: string, accounts: Truffle.Accounts ): void { describe("safe allowance", () => { - let fiatToken: FiatTokenV2Instance; + let fiatToken: AnyFiatTokenV2Instance; const [alice, bob] = accounts; beforeEach(() => { @@ -55,7 +74,7 @@ export function hasSafeAllowance( }); await expectRevert( - fiatToken.increaseAllowance(bob, MAX_UINT256, { + fiatToken.increaseAllowance(bob, MAX_UINT256_HEX, { from: alice, }), "addition overflow" @@ -73,26 +92,57 @@ export function hasSafeAllowance( ); }); - it("reverts if either the owner or the spender is blacklisted", async () => { - // owner is blacklisted - await fiatToken.blacklist(alice, { from: fiatTokenOwner }); + if (version < 2.2) { + it("reverts if either the owner or the spender is blacklisted", async () => { + // owner is blacklisted + await fiatToken.blacklist(alice, { from: fiatTokenOwner }); - // try to increase allowance - await expectRevert( - fiatToken.increaseAllowance(bob, 1, { from: alice }), - "account is blacklisted" - ); + // try to increase allowance + await expectRevert( + fiatToken.increaseAllowance(bob, 1, { from: alice }), + "account is blacklisted" + ); - // spender is blacklisted - await fiatToken.unBlacklist(alice, { from: fiatTokenOwner }); - await fiatToken.blacklist(bob, { from: fiatTokenOwner }); + // spender is blacklisted + await fiatToken.unBlacklist(alice, { from: fiatTokenOwner }); + await fiatToken.blacklist(bob, { from: fiatTokenOwner }); - // try to increase allowance - await expectRevert( - fiatToken.increaseAllowance(bob, 1, { from: alice }), - "account is blacklisted" - ); - }); + // try to increase allowance + await expectRevert( + fiatToken.increaseAllowance(bob, 1, { from: alice }), + "account is blacklisted" + ); + }); + } else { + // version >= 2.2 + + it("increases allowance normally when the owner or the spender is blacklisted", async () => { + // owner is blacklisted + await fiatToken.blacklist(alice, { from: fiatTokenOwner }); + + // try to increase allowance + await fiatToken.increaseAllowance(bob, 10e6, { + from: alice, + }); + // check that allowance has increased + expect((await fiatToken.allowance(alice, bob)).toNumber()).to.equal( + 10e6 + ); + + // spender is blacklisted + await fiatToken.unBlacklist(alice, { from: fiatTokenOwner }); + await fiatToken.blacklist(bob, { from: fiatTokenOwner }); + + // try to increase allowance + await fiatToken.increaseAllowance(bob, 5e6, { + from: alice, + }); + // check that allowance has increased + expect((await fiatToken.allowance(alice, bob)).toNumber()).to.equal( + 15e6 + ); + }); + } }); describe("decreaseAllowance", () => { @@ -146,7 +196,7 @@ export function hasSafeAllowance( // it catches that the given decrement is greater than the current // allowance await expectRevert( - fiatToken.decreaseAllowance(bob, MAX_UINT256, { + fiatToken.decreaseAllowance(bob, MAX_UINT256_HEX, { from: alice, }), "decreased allowance below zero" @@ -164,26 +214,53 @@ export function hasSafeAllowance( ); }); - it("reverts if either the owner or the spender is blacklisted", async () => { - // owner is blacklisted - await fiatToken.blacklist(alice, { from: fiatTokenOwner }); + if (version < 2.2) { + it("reverts if either the owner or the spender is blacklisted", async () => { + // owner is blacklisted + await fiatToken.blacklist(alice, { from: fiatTokenOwner }); - // try to decrease allowance - await expectRevert( - fiatToken.decreaseAllowance(bob, 1, { from: alice }), - "account is blacklisted" - ); + // try to decrease allowance + await expectRevert( + fiatToken.decreaseAllowance(bob, 1, { from: alice }), + "account is blacklisted" + ); - // spender is blacklisted - await fiatToken.unBlacklist(alice, { from: fiatTokenOwner }); - await fiatToken.blacklist(bob, { from: fiatTokenOwner }); + // spender is blacklisted + await fiatToken.unBlacklist(alice, { from: fiatTokenOwner }); + await fiatToken.blacklist(bob, { from: fiatTokenOwner }); - // try to decrease allowance - await expectRevert( - fiatToken.decreaseAllowance(bob, 1, { from: alice }), - "account is blacklisted" - ); - }); + // try to decrease allowance + await expectRevert( + fiatToken.decreaseAllowance(bob, 1, { from: alice }), + "account is blacklisted" + ); + }); + } else { + // version >= 2.2 + + it("decreases allowance normally when the owner or the spender is blacklisted", async () => { + // owner is blacklisted + await fiatToken.blacklist(alice, { from: fiatTokenOwner }); + + // try to decrease allowance + await fiatToken.decreaseAllowance(bob, 2e6, { from: alice }); + // check that allowance has decreased + expect((await fiatToken.allowance(alice, bob)).toNumber()).to.equal( + 8e6 + ); + + // spender is blacklisted + await fiatToken.unBlacklist(alice, { from: fiatTokenOwner }); + await fiatToken.blacklist(bob, { from: fiatTokenOwner }); + + // try to decrease allowance + await fiatToken.decreaseAllowance(bob, 2e6, { from: alice }); + // check that allowance has decreased + expect((await fiatToken.allowance(alice, bob)).toNumber()).to.equal( + 6e6 + ); + }); + } }); }); } diff --git a/truffle-config.js b/truffle-config.js index 42120ea16..e707e73ad 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + process.env.TS_NODE_FILES = "true"; require("ts-node/register/transpile-only"); // Fix Typescript callsite reporting @@ -49,7 +67,12 @@ module.exports = { timeout: 60000, // prevents tests from failing when pc is under heavy load reporter: "Spec", }, - plugins: ["solidity-coverage"], + plugins: ["solidity-coverage", "truffle-contract-size"], + migrations_directory: + config.USE_VERSIONED_MIGRATIONS || + process.env.USE_VERSIONED_MIGRATIONS === "true" + ? "./migrations/versioned" + : "./migrations/direct", }; function infuraProvider(network) { diff --git a/utils.js b/utils.js new file mode 100644 index 000000000..870c1f4cb --- /dev/null +++ b/utils.js @@ -0,0 +1,46 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const _ = require("lodash"); +const fs = require("fs"); +const web3 = require("web3"); + +/** + * Helper function to read the blacklist file. + * @param {string} blacklistFilePath the filepath to the blacklist file. + * @returns {string[]} the list of addresses in the file. + */ +function readBlacklistFile(blacklistFilePath) { + if (!fs.existsSync(blacklistFilePath)) { + throw new Error(`'${blacklistFilePath}' does not exist!`); + } + let addresses = JSON.parse(fs.readFileSync(blacklistFilePath)); + addresses = _.uniqBy(addresses, (a) => a.toLowerCase()); // Deduplicate any addresses in the file + + // Validate that addresses' integrity + for (const address of addresses) { + if (!web3.utils.isAddress(address)) { + throw new Error( + `Address '${address}' in '${blacklistFilePath}' is not valid address!` + ); + } + } + return addresses; +} + +module.exports = { readBlacklistFile }; diff --git a/validate/contractDiff.js b/validate/contractDiff.js index 2eac2cc2e..abdbf0bc0 100644 --- a/validate/contractDiff.js +++ b/validate/contractDiff.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const fs = require("fs"); const chalk = require("chalk"); const diff = require("diff"); diff --git a/validate/validate.js b/validate/validate.js index f00848e91..3cbc0b86e 100644 --- a/validate/validate.js +++ b/validate/validate.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + // Address of the FiatToken Implementation const fiatTokenAddress = "0x0882477e7895bdc5cea7cb1552ed914ab157fe56"; diff --git a/verification/GoogleSheets/index.js b/verification/GoogleSheets/index.js index c92a0411c..3933e422f 100644 --- a/verification/GoogleSheets/index.js +++ b/verification/GoogleSheets/index.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const fs = require("fs"); const readline = require("readline"); const { google } = require("googleapis"); diff --git a/verification/verification_reporter.js b/verification/verification_reporter.js index 489fc430e..02ad21526 100644 --- a/verification/verification_reporter.js +++ b/verification/verification_reporter.js @@ -1,3 +1,21 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023, Circle Internet Financial, LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const mocha = require("mocha"); const specReporter = mocha.reporters.Spec; const baseReporter = mocha.reporters.Base; diff --git a/yarn.lock b/yarn.lock index e2dc785af..f5959f956 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,219 +2,410 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== +"@babel/code-frame@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/types" "^7.10.4" + "@babel/highlight" "^7.22.5" -"@babel/helper-plugin-utils@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-compilation-targets@^7.22.6": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" "@babel/plugin-transform-runtime@^7.5.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.5.tgz#3b39b7b24830e0c2d8ff7a4489fe5cf99fbace86" - integrity sha512-tV4V/FjElJ9lQtyjr5xD2IFFbgY46r7EeVu5a8CpEKT5laheHKSlFeHjpkPppW3PqzGLAuv5k2qZX5LgVZIX5w== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" "@babel/runtime@^7.5.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" - integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" -"@babel/types@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" - integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== +"@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@ethersproject/abi@5.0.0-beta.153": - version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" - -"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.2.tgz#80d0ddfb7d4bd0d32657747fa4bdd2defef2e00a" - integrity sha512-+rz26RKj7ujGfQynys4V9VJRbR+wpC6eL8F22q3raWMH3152Ha31GwJPWzxE/bEA+43M/zTNVwY0R53gn53L2Q== - dependencies: - "@ethersproject/bignumber" "^5.0.0" - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/keccak256" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - "@ethersproject/rlp" "^5.0.0" - bn.js "^4.4.0" - -"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.0": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.5.tgz#31bd7e75aad46ace345fae69b1f5bb120906af1b" - integrity sha512-24ln7PV0g8ZzjcVZiLW9Wod0i+XCmK6zKkAaxw5enraTIT1p7gVOcSXFSzNQ9WYAwtiFQPvvA+TIO2oEITZNJA== - dependencies: - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - bn.js "^4.4.0" - -"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.3.tgz#b3769963ae0188a35713d343890a903bda20af9c" - integrity sha512-AyPMAlY+Amaw4Zfp8OAivm1xYPI8mqiUYmEnSUk1CnS2NrQGHEMmFJFiOJdS3gDDpgSOFhWIjZwxKq2VZpqNTA== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: - "@ethersproject/logger" "^5.0.0" + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" -"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.2.tgz#f7ac0b320e2bbec1a5950da075015f8bc4e8fed1" - integrity sha512-nNoVlNP6bgpog7pQ2EyD1xjlaXcy1Cl4kK5v1KoskHj58EtB6TK8M8AFGi3GgHTdMldfT4eN3OsoQ/CdOTVNFA== +"@ethereumjs/common@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== dependencies: - "@ethersproject/bignumber" "^5.0.0" + crc-32 "^1.2.0" + ethereumjs-util "^7.1.1" -"@ethersproject/hash@>=5.0.0-beta.128": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.2.tgz#6d69558786961836d530b8b4a8714eac5388aec7" - integrity sha512-dWGvNwmVRX2bxoQQ3ciMw46Vzl1nqfL+5R8+2ZxsRXD3Cjgw1dL2mdjJF7xMMWPvPdrlhKXWSK0gb8VLwHZ8Cw== +"@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/keccak256" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - "@ethersproject/strings" "^5.0.0" + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" -"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.2.tgz#7ed4a95bb45ee502cf4532223833740a83602797" - integrity sha512-MbroXutc0gPNYIrUjS4Aw0lDuXabdzI7+l7elRWr1G6G+W0v00e/3gbikWkCReGtt2Jnt4lQSgnflhDwQGcIhA== - dependencies: - "@ethersproject/bytes" "^5.0.0" - js-sha3 "0.5.7" +"@ethereumjs/tx@3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== + dependencies: + "@ethereumjs/common" "^2.5.0" + ethereumjs-util "^7.1.2" + +"@ethereumjs/tx@^3.3.0", "@ethereumjs/tx@^3.3.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + +"@ethersproject/abi@^5.6.3": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" -"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.0": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.4.tgz#09fa4765b5691233e3afb6617cb38a700f9dd2e4" - integrity sha512-alA2LiAy1LdQ/L1SA9ajUC7MvGAEQLsICEfKK4erX5qhkXE1LwLSPIzobtOWFsMHf2yrXGKBLnnpuVHprI3sAw== +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.2.tgz#2facb62d2f2d968c7b3d0befa5bcc884cc565d3b" - integrity sha512-FxAisPGAOACQjMJzewl9OJG6lsGCPTm5vpUMtfeoxzAlAb2lv+kHzQPUh9h4jfAILzE8AR1jgXMzRmlhwyra1Q== +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: - "@ethersproject/logger" "^5.0.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" -"@ethersproject/rlp@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.2.tgz#d6b550a2ac5e484f15f0f63337e522004d2e78cd" - integrity sha512-oE0M5jqQ67fi2SuMcrpoewOpEuoXaD8M9JeR9md1bXRMvDYgKXUtDHs22oevpEOdnO2DPIRabp6MVHa4aDuWmw== +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/logger" "^5.0.0" + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" -"@ethersproject/signing-key@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.3.tgz#adb84360e147bfd336cb2fe114100120732dc10a" - integrity sha512-5QPZaBRGCLzfVMbFb3LcVjNR0UbTXnwDHASnQYfbzwUOnFYHKxHsrcbl/5ONGoppgi8yXgOocKqlPCFycJJVWQ== - dependencies: - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - "@ethersproject/properties" "^5.0.0" - elliptic "6.5.3" +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.2.tgz#1753408c3c889813fd0992abd76393e3e47a2619" - integrity sha512-oNa+xvSqsFU96ndzog0IBTtsRFGOqGpzrXJ7shXLBT7juVeSEyZA/sYs0DMZB5mJ9FEjHdZKxR/rTyBY91vuXg== - dependencies: - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/constants" "^5.0.0" - "@ethersproject/logger" "^5.0.0" +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== -"@ethersproject/transactions@^5.0.0-beta.135": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.2.tgz#590ede71fc87b45be7bd46002e18ae52246a2347" - integrity sha512-jZp0ZbbJlq4JLZY6qoMzNtp2HQsX6USQposi3ns0MPUdn3OdZJBDtrcO15r/2VS5t/K1e1GE5MI1HmMKlcTbbQ== - dependencies: - "@ethersproject/address" "^5.0.0" - "@ethersproject/bignumber" "^5.0.0" - "@ethersproject/bytes" "^5.0.0" - "@ethersproject/constants" "^5.0.0" - "@ethersproject/keccak256" "^5.0.0" - "@ethersproject/logger" "^5.0.0" - "@ethersproject/properties" "^5.0.0" - "@ethersproject/rlp" "^5.0.0" - "@ethersproject/signing-key" "^5.0.0" - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" "@openzeppelin/contracts@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.1.0.tgz#bcea457ef89069fbe5a617f50b25b6a8272895d5" - integrity sha512-dVXDnUKxrAKLzPdCRkz+N8qsVkK1XxJ6kk3zuI6zaQmcKxN7CkizoDP7lXxcs/Mi2I0mxceTRjJBqlzFffLJrQ== + version "3.4.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@solidity-parser/parser@^0.6.0", "@solidity-parser/parser@^0.6.2": +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@solidity-parser/parser@^0.14.0": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.16.0": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.6.2": version "0.6.2" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.6.2.tgz#49707fc4e06649d39d6b25bdab2e9093d372ce50" integrity sha512-kUVUvrqttndeprLoXjI5arWHeiP3uh4XODAKbG+ZaWHCVQeelxCbnXBeWxZ2BPHdXgH0xR9dU1b916JhDhbgAA== @@ -226,45 +417,57 @@ dependencies: defer-to-connect "^1.0.1" -"@truffle/error@^0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.7.tgz#e9db39885575647ef08bf624b0c13fe46d41a209" - integrity sha512-UIfVKsXSXocKnn5+RNklUXNoGd/JVj7V8KmC48TQzmjU33HQI86PX0JDS7SpHMHasI3w9X//1q7Lu7nZtj3Zzg== +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@truffle/error@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" + integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== "@truffle/hdwallet-provider@^1.0.39": - version "1.0.39" - resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-1.0.39.tgz#7664102db9b25312f34703fcb353fb9c3f0f19a4" - integrity sha512-xLe+FrAAU3nbSfPoCD4xr4qUkUx6xZOfsn9E/KRJewCBDVzQ/0DfyOC8++SDXvgu+ftgGKZjOucP/QHfRRtIjg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-1.7.0.tgz#5cfa8bc67c2a30b3943d3dab78f74c6a191cde02" + integrity sha512-nT7BPJJ2jPCLJc5uZdVtRnRMny5he5d3kO9Hi80ZSqe5xlnK905grBptM/+CwOfbeqHKQirI1btwm6r3wIBM8A== dependencies: - "@trufflesuite/web3-provider-engine" "15.0.0-2" - any-promise "^1.3.0" - bindings "^1.5.0" + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/tx" "^3.3.0" + "@trufflesuite/web3-provider-engine" "15.0.14" + eth-sig-util "^3.0.1" ethereum-cryptography "^0.1.3" ethereum-protocol "^1.0.1" - ethereumjs-tx "^1.0.0" ethereumjs-util "^6.1.0" - ethereumjs-wallet "^0.6.3" - source-map-support "^0.5.19" - web3 "1.2.1" + ethereumjs-wallet "^1.0.1" -"@truffle/interface-adapter@^0.3.0": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.3.3.tgz#61305378cf81776769ef36c60d394e568ac4a2ee" - integrity sha512-l3I4WFTfnBSIfG96IOBRtAIE6AHDAxcOUJE7W5zh9hocQwzQlGWc2yEyyTcLa0656TTM8RxaZZ2S/KdHHMvCaw== +"@truffle/interface-adapter@^0.5.25": + version "0.5.35" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.35.tgz#f0eb1c4a2803190ca249143f545029a8b641fe96" + integrity sha512-B5gtJnvsum5j2do393n0UfCT8MklrlAZxuqvEFBeMM9UKnreYct0/D368FVMlZwWo1N50HgGeZ0hlpSJqR/nvg== dependencies: - bn.js "^4.11.8" + bn.js "^5.1.3" ethers "^4.0.32" - lodash "^4.17.13" - web3 "1.2.2" + web3 "1.10.0" -"@truffle/provider@^0.1.17": - version "0.1.19" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.1.19.tgz#3e6f15fdd8475ca5d0c846d2b412cc823f1fb767" - integrity sha512-ke8iQmzW4Y99+8iff8xQcc+mCNU4AkwtaZ/iSpmVD8qpLytw8/DSNCm0RiEz9/+I93Q1zqI4Jnij/rXnkS2Njw== +"@truffle/provider@^0.2.24": + version "0.2.64" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.64.tgz#7dd55117307fd019dcf81d08db5dc2bc5728f51c" + integrity sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw== dependencies: - "@truffle/error" "^0.0.7" - "@truffle/interface-adapter" "^0.3.0" - web3 "1.2.1" + "@truffle/error" "^0.1.1" + "@truffle/interface-adapter" "^0.5.25" + debug "^4.3.1" + web3 "1.7.4" "@trufflesuite/eth-json-rpc-filters@^4.1.2-1": version "4.1.2-1" @@ -278,6 +481,16 @@ lodash.flatmap "^4.5.0" safe-event-emitter "^1.0.1" +"@trufflesuite/eth-json-rpc-infura@^4.0.3-0": + version "4.0.3-0" + resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-infura/-/eth-json-rpc-infura-4.0.3-0.tgz#6d22122937cf60ec9d21a02351c101fdc608c4fe" + integrity sha512-xaUanOmo0YLqRsL0SfXpFienhdw5bpQ1WEXxMTRi57az4lwpZBv4tFUDvcerdwJrxX9wQqNmgUgd1BrR01dumw== + dependencies: + "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1" + cross-fetch "^2.1.1" + eth-json-rpc-errors "^1.0.1" + json-rpc-engine "^5.1.3" + "@trufflesuite/eth-json-rpc-middleware@^4.4.2-0", "@trufflesuite/eth-json-rpc-middleware@^4.4.2-1": version "4.4.2-1" resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.2-1.tgz#8c3638ed8a7ed89a1e5e71407de068a65bef0df2" @@ -306,25 +519,25 @@ ethereumjs-abi "^0.6.8" ethereumjs-util "^5.1.1" -"@trufflesuite/web3-provider-engine@15.0.0-2": - version "15.0.0-2" - resolved "https://registry.yarnpkg.com/@trufflesuite/web3-provider-engine/-/web3-provider-engine-15.0.0-2.tgz#0e9a581cfda6b82ab8224883859a954b5ee5fb66" - integrity sha512-rBktH8MkEL5xrdI9YJIuaOEr0emEpWzw/5ZXRUWJxrxc/GE/v5n10JR8MeKK9g9IRWc9rFFb8u4ac2rvoDBzzQ== +"@trufflesuite/web3-provider-engine@15.0.14": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@trufflesuite/web3-provider-engine/-/web3-provider-engine-15.0.14.tgz#8f9696f434585cc0ab2e57c312090c1f138bc471" + integrity sha512-6/LoWvNMxYf0oaYzJldK2a9AdnkAdIeJhHW4nuUBAeO29eK9xezEaEYQ0ph1QRTaICxGxvn+1Azp4u8bQ8NEZw== dependencies: + "@ethereumjs/tx" "^3.3.0" "@trufflesuite/eth-json-rpc-filters" "^4.1.2-1" + "@trufflesuite/eth-json-rpc-infura" "^4.0.3-0" "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1" "@trufflesuite/eth-sig-util" "^1.4.2" async "^2.5.0" backoff "^2.5.0" clone "^2.0.0" cross-fetch "^2.1.0" - eth-block-tracker "^4.2.0" - eth-json-rpc-infura "^3.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-errors "^2.0.2" ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" ethereumjs-util "^5.1.5" ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" json-stable-stringify "^1.0.1" promise-to-callback "^1.0.0" readable-stream "^2.2.9" @@ -339,55 +552,86 @@ resolved "https://registry.yarnpkg.com/@typechain/truffle-v5/-/truffle-v5-2.0.2.tgz#709a78ffb120f52c693818fea72e0b0d146c3454" integrity sha512-g4N2kfol1S3g/QUkmpzukCGZiKWUdXsSms1be/+W4+R0DPMz1Q/76tY+C6bD7G/KeLhkiDKcnZFmNVNcAgjIfQ== -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4", "@types/bn.js@^4.11.5": +"@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" -"@types/chai@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50" - integrity sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw== +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/chai@^4.2.11": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/ethereumjs-abi@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@types/ethereumjs-abi/-/ethereumjs-abi-0.6.3.tgz#eb5ed09fd86b9e2b1c0eb75d1e9bc29c50715c86" + integrity sha512-DnHvqPkrJS5w4yZexTa5bdPNb8IyKPYciou0+zZCIg5fpzvGtyptTvshy0uZKzti2/k/markwjlxWRBWt7Mjuw== + dependencies: + "@types/node" "*" + "@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + "@types/json-schema@^7.0.3": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" "@types/lodash@^4.14.158": - version "4.14.158" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.158.tgz#b38ea8b6fe799acd076d7a8d7ab71c26ef77f785" - integrity sha512-InCEXJNTv/59yO4VSfuvNrZHt7eeNtWQEgnieIA+mIC+MOWM9arOWG2eQ8Vhk6NbOre6/BidiXhkZYeDY9U35w== + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/mkdirp@^0.5.2": version "0.5.2" @@ -397,24 +641,19 @@ "@types/node" "*" "@types/mocha@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.0.tgz#b0ba1c5b4cb3880c51a6b488ad007a657d1be888" - integrity sha512-jWeYcTo3sCH/rMgsdYXDTO85GNRyTCII5dayMIu/ZO4zbEot1E3iNGaOwpLReLUHjeNQFkgeNNVYlY4dX6azQQ== + version "8.2.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== "@types/node@*": - version "14.0.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6" - integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA== + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== -"@types/node@^10.12.18", "@types/node@^10.3.2": - version "10.17.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.27.tgz#391cb391c75646c8ad2a7b6ed3bbcee52d1bdf19" - integrity sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg== - -"@types/node@^12.12.6", "@types/node@^12.6.1": - version "12.12.51" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.51.tgz#446a67af8c5ff98947d7cef296484c6ad47ddb16" - integrity sha512-6ILqt8iNThALrxDv2Q4LyYFQxULQz96HKNIFd4s9QRQaiHINYeUpLqeU/2IU7YMtvipG1fQVAy//vY8/fX1Y9w== +"@types/node@^12.12.6": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/pbkdf2@^3.0.0": version "3.1.0" @@ -435,59 +674,66 @@ dependencies: "@types/node" "*" +"@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/secp256k1@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" - integrity sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.0.tgz#0f91aa3c83d019591719e597fbdb73a59595a263" - integrity sha512-4OEcPON3QIx0ntsuiuFP/TkldmBGXf0uKxPQlGtS/W2F3ndYm8Vgdpj/woPJkzUc65gd3iR+qi3K8SDQP/obFg== + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== dependencies: - "@typescript-eslint/experimental-utils" "3.7.0" + "@typescript-eslint/experimental-utils" "3.10.1" debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.0.tgz#0ee21f6c48b2b30c63211da23827725078d5169a" - integrity sha512-xpfXXAfZqhhqs5RPQBfAFrWDHoNxD5+sVB5A46TF58Bq1hRfVROrWHcQHHUM9aCBdy9+cwATcvCbRg8aIRbaHQ== +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.7.0" - "@typescript-eslint/typescript-estree" "3.7.0" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" "@typescript-eslint/parser@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.7.0.tgz#3e9cd9df9ea644536feb6e5acdb8279ecff96ce9" - integrity sha512-2LZauVUt7jAWkcIW7djUc3kyW+fSarNEuM3RF2JdLHR9BfX/nDEnyA4/uWz0wseoWVZbDXDF7iF9Jc342flNqQ== + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.7.0" - "@typescript-eslint/types" "3.7.0" - "@typescript-eslint/typescript-estree" "3.7.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/types@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.0.tgz#09897fab0cb95479c01166b10b2c03c224821077" - integrity sha512-reCaK+hyKkKF+itoylAnLzFeNYAEktB0XVfSQvf0gcVgpz1l49Lt6Vo9x4MVCCxiDydA0iLAjTF/ODH0pbfnpg== +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/typescript-estree@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.0.tgz#66872e6da120caa4b64e6b4ca5c8702afc74738d" - integrity sha512-xr5oobkYRebejlACGr1TJ0Z/r0a2/HUf0SXqPvlgUMwiMqOCu/J+/Dr9U3T0IxpE5oLFSkqMx1FE/dKaZ8KsOQ== +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== dependencies: - "@typescript-eslint/types" "3.7.0" - "@typescript-eslint/visitor-keys" "3.7.0" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" debug "^4.1.1" glob "^7.1.6" is-glob "^4.0.1" @@ -495,32 +741,13 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.0.tgz#ac0417d382a136e4571a0b0dcfe52088cb628177" - integrity sha512-k5PiZdB4vklUpUX4NBncn5RBKty8G3ihTY+hqJsCdMuD0v4jofI5xuqwnVcWxfv6iTm2P/dfEa2wMUnsUY8ODw== +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== dependencies: eslint-visitor-keys "^1.1.0" -"@web3-js/scrypt-shim@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc" - integrity sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw== - dependencies: - scryptsy "^2.1.0" - semver "^6.3.0" - -"@web3-js/websocket@^1.0.29": - version "1.0.30" - resolved "https://registry.yarnpkg.com/@web3-js/websocket/-/websocket-1.0.30.tgz#9ea15b7b582cf3bf3e8bc1f4d3d54c0731a87f87" - integrity sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA== - dependencies: - debug "^2.2.0" - es5-ext "^0.10.50" - nan "^2.14.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -529,7 +756,7 @@ abbrev@1: abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== abort-controller@^3.0.0: version "3.0.0" @@ -538,6 +765,11 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +abortcontroller-polyfill@^1.7.3: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -552,100 +784,95 @@ abstract-leveldown@~2.7.1: dependencies: xtend "~4.0.0" -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-jsx@^5.0.0, acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + mime-types "~2.1.34" + negotiator "0.6.3" -acorn@^6.0.7: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== -aes-js@^3.1.1: +aes-js@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== agent-base@6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" - integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.6.1, ajv@^6.9.1: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== -ansi-colors@4.1.1, ansi-colors@^4.1.1: +ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -654,28 +881,27 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" -antlr4@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" - integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== +antlr4@^4.11.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.0.tgz#25c0b17f0d9216de114303d38bafd6f181d5447f" + integrity sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew== -any-promise@1.3.0, any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -683,7 +909,7 @@ anymatch@~3.1.1: app-module-path@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= + integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== arg@^4.1.0: version "4.1.3" @@ -697,10 +923,15 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= + integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== dependencies: typical "^2.6.0" @@ -711,61 +942,97 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" array.prototype.map@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" - integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.5.tgz#6e43c2fee6c0fb5e4806da2dc92eb00970809e55" + integrity sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.4" + is-string "^1.0.7" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" arrify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" @@ -780,22 +1047,22 @@ assert-diff@1.2.6: assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -ast-parents@0.0.1: +ast-parents@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha1-UI/Q8F0MSHddnszaLhdEIyYejdM= + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-eventemitter@^0.2.2: version "0.2.4" @@ -812,19 +1079,24 @@ async-limiter@~1.0.0: async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== await-semaphore@^0.1.3: version "0.1.3" @@ -834,599 +1106,82 @@ await-semaphore@^0.1.3: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.14, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== dependencies: precond "0.2" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2, base64-js@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.0, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bignumber.js@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== - -bindings@^1.2.1, bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - -bl@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== blakejs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" - integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bluebird@^3.5.0: version "3.7.2" @@ -1436,38 +1191,53 @@ bluebird@^3.5.0: bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - -bn.js@4.11.8: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1, bn.js@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" - integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.0, body-parser@^1.16.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: - bytes "3.1.0" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.16.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" brace-expansion@^1.1.7: version "1.1.11" @@ -1477,24 +1247,31 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, braces@~3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -1526,40 +1303,42 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" - integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" browserify-rsa "^4.0.1" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.2" + elliptic "^6.5.3" inherits "^2.0.4" parse-asn1 "^5.1.5" readable-stream "^3.6.0" safe-buffer "^5.2.0" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -1577,61 +1356,55 @@ btoa@^1.2.1: resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== +buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" + base64-js "^1.3.1" + ieee754 "^1.1.13" -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bufferutil@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^6.0.4: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== cacheable-request@^6.0.0: version "6.1.0" @@ -1646,69 +1419,61 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: - callsites "^2.0.0" + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + function-bind "^1.1.1" + get-intrinsic "^1.0.2" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30000844: - version "1.0.30001104" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001104.tgz#4e3d5b3b1dd3c3529f10cb7f519c62ba3e579f5d" - integrity sha512-pkpCg7dmI/a7WcqM2yfdOiT4Xx5tzyoHAXWsX5/HxZ3TemwDZs0QXdqbE0UPLPVy/7BeK7693YfzfRYfu1YVpg== +caniuse-lite@^1.0.30001503: + version "1.0.30001516" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" + integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" - pathval "^1.1.0" + loupe "^2.3.1" + pathval "^1.1.1" type-detect "^4.0.5" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1717,35 +1482,30 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= + integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== dependencies: functional-red-black-tree "^1.0.1" -chokidar@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -1753,11 +1513,11 @@ chokidar@3.3.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" -chownr@^1.1.1: +chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -1789,21 +1549,16 @@ class-is@^1.1.0: cli-color@~0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347" - integrity sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c= + integrity sha512-xNaQxWYgI6DD4xIJLn8GY2zDZVbrN0vsU1fEbDNAHZRyceWhpj7A08mYcG1AY92q1Aw0geYkVfiAcEYIZtuTSg== dependencies: es5-ext "0.8.x" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= +cli-table@^0.3.1: + version "0.3.11" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" + integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + colors "1.0.3" cliui@^5.0.0: version "5.0.0" @@ -1814,17 +1569,26 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone@^2.0.0, clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== color-convert@^1.9.0: version "1.9.3" @@ -1843,13 +1607,18 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1871,49 +1640,27 @@ command-line-args@^4.0.7: find-replace "^1.0.3" typical "^2.6.1" -commander@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= - dependencies: - graceful-readlink ">= 1.0.0" +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-hash@^2.5.2: version "2.5.2" @@ -1924,42 +1671,42 @@ content-hash@^2.5.2: multicodec "^0.5.5" multihashes "^0.4.15" -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cookiejar@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== + dependencies: + browserslist "^4.21.9" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@^2.8.1: version "2.8.5" @@ -1969,23 +1716,28 @@ cors@^2.8.1: object-assign "^4" vary "^1" -cosmiconfig@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" - elliptic "^6.0.0" + elliptic "^6.5.3" create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" @@ -2011,14 +1763,21 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: sha.js "^2.4.8" cross-fetch@^2.1.0, cross-fetch@^2.1.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" - integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw== + version "2.2.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" + integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== + dependencies: + node-fetch "^2.6.7" + whatwg-fetch "^2.0.4" + +cross-fetch@^3.1.4: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - node-fetch "2.1.2" - whatwg-fetch "2.0.4" + node-fetch "^2.6.12" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2066,135 +1825,89 @@ d@1, d@^1.0.1: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "^2.1.1" + ms "2.1.2" -debug@4, debug@^4.0.1, debug@^4.1.1: +debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -decompress-response@^3.2.0, decompress-response@^3.3.0: +decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" + mimic-response "^3.1.0" -decompress@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" -deep-equal@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" @@ -2202,55 +1915,44 @@ deferred-leveldown@~1.2.1: dependencies: abstract-leveldown "~2.6.0" -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: - object-keys "^1.0.12" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" - debug "^2.6.0" + debug "4" diff@4.0.2, diff@^4.0.1, diff@^4.0.2: version "4.0.2" @@ -2269,7 +1971,7 @@ diffie-hellman@^5.0.0: difflib@~0.2.1: version "0.2.4" resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" - integrity sha1-teMDYabbAjF21WKJLbhZQKcY9H4= + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== dependencies: heap ">= 0.2.0" @@ -2285,13 +1987,12 @@ dir-to-object@^2.0.0: resolved "https://registry.yarnpkg.com/dir-to-object/-/dir-to-object-2.0.0.tgz#29723e9bd1c3e58e4f307bd04ff634c0370c8f8a" integrity sha512-sXs0JKIhymON7T1UZuO2Ud6VTNAx/VTBXIl4+3mjb2RgfOpt+hectX0x04YqPOPdkeOAKoJuKqwqnXXURNPNEA== -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -2305,38 +2006,22 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== -dotignore@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - dreamopt@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b" - integrity sha1-2BPM2sjTnYrVJndVFKE92mZNa0s= + integrity sha512-KRJa47iBEK0y6ZtgCgy2ykuvMT8c9gj3ua9Dv7vCkclFJJeH2FjhGY2xO5qBoWGahsjCGMlk4Cq9wJYeWxuYhQ== dependencies: wordwrap ">=0.0.2" duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -2351,48 +2036,25 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.47: - version "1.3.502" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.502.tgz#6a55e993ef60a01fbdc2152ef5e47ee00c885c98" - integrity sha512-TIeXOaHAvfP7FemGUtAJxStmOc1YFGWFNqdey/4Nk41L9b1nMmDVDGNMIWhZJvOfJxix6Cv5FGEnBK+yvw3UTg== - -elliptic@6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f" - integrity sha1-VILZZG1UvLif19mU/J4ulWiHbj8= - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - inherits "^2.0.1" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -elliptic@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" +electron-to-chromium@^1.4.431: + version "1.4.462" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.462.tgz#4faf5072bb5f55269d35ca9dc7475e7bf91b1ac3" + integrity sha512-ux2LqN9JKRBDKXMT+78jtiBLPiXf+rLtYlsrOg5Qn7uv6Cbg7+9JyIalE3wcqkOdB2wPCUYNWAuL7suKRMHe9w== -elliptic@6.5.3, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emoji-regex@^7.0.1: version "7.0.3" @@ -2405,14 +2067,14 @@ emoji-regex@^8.0.0: integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" - integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encoding@^0.1.11: version "0.1.13" @@ -2421,7 +2083,7 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -2436,35 +2098,63 @@ enquirer@^2.3.5: ansi-colors "^4.1.1" errno@~0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.17.0-next.1, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -2472,17 +2162,35 @@ es-array-method-boxes-properly@^1.0.0: integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-get-iterator@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== - dependencies: - es-abstract "^1.17.4" - has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.0.1" - is-string "^1.0.5" + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -2496,27 +2204,32 @@ es-to-primitive@^1.2.1: es5-ext@0.8.x: version "0.8.2" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab" - integrity sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs= + integrity sha512-H19ompyhnKiBdjHR1DPHvf5RHgHPmJaY9JNzFGbMbPgdsUkvnUCN1Ke8J4Y0IMyTwFM2M9l4h2GoHwzwpSmXbA== es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" -es6-iterator@~2.0.3: +es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-symbol@^3.1.1, es6-symbol@~3.1.3: +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== @@ -2524,25 +2237,30 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -2552,9 +2270,9 @@ escodegen@1.8.x: source-map "~0.2.0" eslint-config-prettier@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" @@ -2563,21 +2281,21 @@ eslint-config-standard@^14.1.1: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" + debug "^3.2.7" eslint-plugin-es@^3.0.0: version "3.0.1" @@ -2588,23 +2306,25 @@ eslint-plugin-es@^3.0.0: regexpp "^3.0.0" eslint-plugin-import@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" eslint-plugin-node@^11.1.0: version "11.1.0" @@ -2619,45 +2339,30 @@ eslint-plugin-node@^11.1.0: semver "^6.1.0" eslint-plugin-prettier@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" - integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" eslint-plugin-promise@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" + integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== eslint-plugin-standard@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" - integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" + integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== -eslint-scope@^5.0.0, eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -2665,75 +2370,42 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz#9ecbfad62216d223b82ac9ffea7ef3444671d135" - integrity sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q== + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.2.0" - esquery "^1.2.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -2741,7 +2413,7 @@ eslint@^7.5.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -2750,26 +2422,17 @@ eslint@^7.5.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" - integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^7.3.1" - acorn-jsx "^5.2.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" esprima-extract-comments@^1.1.0: @@ -2782,41 +2445,41 @@ esprima-extract-comments@^1.1.0: esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -2826,9 +2489,9 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -eth-block-tracker@^4.2.0: +eth-block-tracker@^4.4.2: version "4.4.3" resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== @@ -2843,7 +2506,7 @@ eth-block-tracker@^4.2.0: eth-ens-namehash@2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== dependencies: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" @@ -2855,52 +2518,14 @@ eth-json-rpc-errors@^1.0.1: dependencies: fast-safe-stringify "^2.0.6" -eth-json-rpc-errors@^2.0.1: +eth-json-rpc-errors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4" integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA== dependencies: fast-safe-stringify "^2.0.6" -eth-json-rpc-infura@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" - integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== - dependencies: - cross-fetch "^2.1.1" - eth-json-rpc-middleware "^1.5.0" - json-rpc-engine "^3.4.0" - json-rpc-error "^2.0.0" - -eth-json-rpc-middleware@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" - integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== - dependencies: - async "^2.5.0" - eth-query "^2.1.2" - eth-tx-summary "^3.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.1.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^3.6.0" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - tape "^4.6.3" - -eth-lib@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" - integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@0.2.8, eth-lib@^0.2.8: +eth-lib@0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== @@ -2921,34 +2546,35 @@ eth-lib@^0.1.26: ws "^3.0.0" xhr-request-promise "^0.1.2" -eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: +eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== dependencies: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-tx-summary@^3.1.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" - integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== dependencies: - async "^2.1.2" - clone "^2.0.0" - concat-stream "^1.5.1" - end-of-stream "^1.1.0" - eth-query "^2.0.2" - ethereumjs-block "^1.4.1" - ethereumjs-tx "^1.1.1" - ethereumjs-util "^5.0.1" - ethereumjs-vm "^2.6.0" - through2 "^2.0.3" + fast-safe-stringify "^2.0.6" + +eth-sig-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.1.tgz#8753297c83a3f58346bd13547b59c4b2cd110c96" + integrity sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.0" ethereum-bloom-filters@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060" - integrity sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ== + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== dependencies: js-sha3 "^0.8.0" @@ -2960,7 +2586,7 @@ ethereum-common@0.2.0: ethereum-common@^0.0.18: version "0.0.18" resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== ethereum-cryptography@^0.1.3: version "0.1.3" @@ -3005,7 +2631,7 @@ ethereumjs-account@^2.0.3: rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: +ethereumjs-block@^1.2.2, ethereumjs-block@^1.6.0: version "1.7.1" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== @@ -3027,12 +2653,12 @@ ethereumjs-block@~2.2.0: ethereumjs-util "^5.0.0" merkle-patricia-tree "^2.1.2" -ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.1.tgz#4e75042473a64daec0ed9fe84323dd9576aa5dba" - integrity sha512-aVUPRLgmXORGXXEVkFYgPhr9TGtpBY2tGhZ9Uh0A3lIUzUDr1x6kQx33SbjPUkLkX3eniPQnIL/2psjkjrOfcQ== +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== -ethereumjs-tx@^1.0.0, ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: +ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== @@ -3048,19 +2674,6 @@ ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: ethereumjs-common "^1.5.0" ethereumjs-util "^6.0.0" -ethereumjs-util@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" - integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "0.1.6" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" @@ -3074,7 +2687,7 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: +ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: version "5.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== @@ -3087,19 +2700,18 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.3.tgz#d055fc7f852d79065d2e689002a789b1323cf3fd" - integrity sha512-uLQsGPOwsRxe50WV1Dybh5N8zXDz4ev7wP49LKX9kr28I5TmcDILPgpKK/BFe5zYSfRGEeo+hPT7W3tjghYLuA== +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: - "@types/bn.js" "^4.11.3" + "@types/bn.js" "^5.1.0" bn.js "^5.1.2" create-hash "^1.1.2" ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" rlp "^2.2.4" -ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: +ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== @@ -3116,48 +2728,31 @@ ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: rustbn.js "~0.2.0" safe-buffer "^5.1.1" -ethereumjs-wallet@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" - integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== +ethereumjs-wallet@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz#2c000504b4c71e8f3782dabe1113d192522e99b6" + integrity sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA== dependencies: - aes-js "^3.1.1" + aes-js "^3.1.2" bs58check "^2.1.2" ethereum-cryptography "^0.1.3" - ethereumjs-util "^6.0.0" - randombytes "^2.0.6" - safe-buffer "^5.1.2" - scryptsy "^1.2.1" + ethereumjs-util "^7.1.2" + randombytes "^2.1.0" + scrypt-js "^3.0.1" utf8 "^3.0.0" - uuid "^3.3.2" + uuid "^8.3.2" -ethers@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.0-beta.3.tgz#15bef14e57e94ecbeb7f9b39dd0a4bd435bc9066" - integrity sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog== +ethers@^4.0.32: + version "4.0.49" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: - "@types/node" "^10.3.2" aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.3.3" + bn.js "^4.11.9" + elliptic "6.5.4" hash.js "1.1.3" js-sha3 "0.5.7" - scrypt-js "2.0.3" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^4.0.32: - version "4.0.47" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85" - integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== - dependencies: - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.5.2" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" + scrypt-js "2.0.4" setimmediate "1.0.4" uuid "2.0.1" xmlhttprequest "1.8.0" @@ -3165,7 +2760,7 @@ ethers@^4.0.32: ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== dependencies: bn.js "4.11.6" number-to-bn "1.7.0" @@ -3183,20 +2778,15 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3220,62 +2810,54 @@ execa@^1.0.0: strip-eof "^1.0.0" express@^4.14.0: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.1" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.11.0" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: - type "^2.0.0" + type "^2.7.2" extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extract-comments@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/extract-comments/-/extract-comments-1.1.0.tgz#b90bca033a056bd69b8ba1c6b6b120fc2ee95c18" @@ -3287,41 +2869,40 @@ extract-comments@^1.1.0: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fake-merkle-patricia-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= + integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== dependencies: checkpoint-store "^1.1.0" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-diff@^1.1.2, fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.0.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -3331,72 +2912,38 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-safe-stringify@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-text-encoding@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" - integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== + version "1.0.6" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" + integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - fetch-ponyfill@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= + integrity sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g== dependencies: node-fetch "~1.7.1" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" - -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= - -file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha1-LdvqfHP/42No365J3DOMBYwritY= - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" @@ -3405,42 +2952,35 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-replace@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= + integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== dependencies: array-back "^1.0.4" test-value "^2.1.0" -find-up@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^5.0.0" + locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3448,28 +2988,35 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: is-buffer "~2.0.3" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -for-each@~0.3.3: +for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -3479,7 +3026,12 @@ for-each@~0.3.3: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data-encoder@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== form-data@~2.3.2: version "2.3.3" @@ -3490,25 +3042,20 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3543,7 +3090,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: +fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== @@ -3553,31 +3100,37 @@ fs-minipass@^1.2.5: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -function-bind@^1.1.1, function-bind@~1.1.1: +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -ganache-cli@6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.9.0.tgz#94d7e26964dff80b7382a33829ec75e15709a948" - integrity sha512-ZdL6kPrApXF/O+f6uU431OJcwxMk69H3KPDSHHrMP82ZvZRNpDHbR+rVv7XX/YUeoQ5q6nZ2AFiGiFAVn9pfzA== - dependencies: - ethereumjs-util "6.1.0" - source-map-support "0.5.12" - yargs "13.2.4" +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== ganache-cli@^6.12.2: version "6.12.2" @@ -3588,23 +3141,23 @@ ganache-cli@^6.12.2: source-map-support "0.5.12" yargs "13.2.4" -gaxios@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-3.0.4.tgz#4714fbb003d6f6f08a297f772284463e041e04db" - integrity sha512-97NmFuMETFQh6gqPUxkqjxRMjmY8aRKRMphIkgO/b90AbCt5wAVuXsp8oWjIXlLN2pIK/fsXD8edcM7ULkFMLg== +gaxios@^4.0.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-4.3.3.tgz#d44bdefe52d34b6435cc41214fdb160b64abfc22" + integrity sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA== dependencies: abort-controller "^3.0.0" extend "^3.0.2" https-proxy-agent "^5.0.0" is-stream "^2.0.0" - node-fetch "^2.3.0" + node-fetch "^2.6.7" -gcp-metadata@^4.1.0: - version "4.1.4" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.1.4.tgz#3adadb9158c716c325849ee893741721a3c09e7e" - integrity sha512-5J/GIH0yWt/56R3dNaNWPGQ/zXsZOddYECfJaqxFWgrZ9HC2Kvc5vl9upOgUUHKzURjAVf2N+f6tEJiojqXUuA== +gcp-metadata@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.3.1.tgz#fb205fe6a90fef2fd9c85e6ba06e5559ee1eefa9" + integrity sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A== dependencies: - gaxios "^3.0.0" + gaxios "^4.0.0" json-bigint "^1.0.0" get-caller-file@^2.0.1: @@ -3615,26 +3168,23 @@ get-caller-file@^2.0.1: get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -3643,16 +3193,29 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" @@ -3664,14 +3227,14 @@ ghost-testrpc@^0.0.2: chalk "^2.4.2" node-emoji "^1.10.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== +glob-parent@^5.1.2, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6: +glob@7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3686,7 +3249,7 @@ glob@7.1.6, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6: glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: inflight "^1.0.4" inherits "2" @@ -3694,6 +3257,29 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -3710,30 +3296,27 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" - process "~0.5.1" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + process "^0.11.10" -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" globby@^10.0.1: version "10.0.2" @@ -3750,34 +3333,34 @@ globby@^10.0.1: slash "^3.0.0" google-auth-library@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-6.0.5.tgz#f7266859dbb02dadf92af479272fb1e344635cb5" - integrity sha512-Wj31lfTm2yR4g3WfOOB1Am1tt478Xq9OvzTPQJi17tn/I9R5IcsxjANBsE93nYmxYxtwDedhOdIb8l3vSPG49Q== + version "6.1.6" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-6.1.6.tgz#deacdcdb883d9ed6bac78bb5d79a078877fdf572" + integrity sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ== dependencies: arrify "^2.0.0" base64-js "^1.3.0" ecdsa-sig-formatter "^1.0.11" fast-text-encoding "^1.0.0" - gaxios "^3.0.0" - gcp-metadata "^4.1.0" - gtoken "^5.0.0" + gaxios "^4.0.0" + gcp-metadata "^4.2.0" + gtoken "^5.0.4" jws "^4.0.0" lru-cache "^6.0.0" -google-p12-pem@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.0.2.tgz#12d443994b6f4cd8c9e4ac479f2f18d4694cbdb8" - integrity sha512-tbjzndQvSIHGBLzHnhDs3cL4RBjLbLXc2pYvGH+imGVu5b4RMAttUTdnmW2UH0t11QeBTXZ7wlXPS7hrypO/tg== +google-p12-pem@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b" + integrity sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg== dependencies: - node-forge "^0.9.0" + node-forge "^1.3.1" googleapis-common@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-4.4.0.tgz#b806e41c4e883f22b68769aafb3ed11802919091" - integrity sha512-Bgrs8/1OZQFFIfVuX38L9t48rPAkVUXttZy6NzhhXxFOEMSHgfFIjxou7RIXOkBHxmx2pVwct9WjKkbnqMYImQ== + version "4.4.3" + resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-4.4.3.tgz#a2063adf17b14501a5f426b9cb0685496d835b7d" + integrity sha512-W46WKCk3QtlCCfmZyQIH5zxmDOyeV5Qj+qs7nr2ox08eRkEJMWp6iwv542R/PsokXaGUSrmif4vCC4+rGzRSsQ== dependencies: extend "^3.0.2" - gaxios "^3.0.0" + gaxios "^4.0.0" google-auth-library "^6.0.0" qs "^6.7.0" url-template "^2.0.8" @@ -3791,6 +3374,32 @@ googleapis@^55.0.0: google-auth-library "^6.0.0" googleapis-common "^4.4.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== + dependencies: + "@sindresorhus/is" "^4.6.0" + "@szmarczak/http-timer" "^5.0.1" + "@types/cacheable-request" "^6.0.2" + "@types/responselike" "^1.0.0" + cacheable-lookup "^6.0.4" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + form-data-encoder "1.7.1" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^2.0.0" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -3808,55 +3417,46 @@ got@9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -gtoken@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.0.2.tgz#688e4334b99378b4d4a67add19e1680f411ba74d" - integrity sha512-lull70rHCTvRTmAt+R/6W5bTtx4MjHku7AwJwK5fGqhOmygcZud0nrZcX+QUNfBJwCzqy7S5i1Bc4NYnr5PMMA== +gtoken@^5.0.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.3.2.tgz#deb7dc876abe002178e0515e383382ea9446d58f" + integrity sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ== dependencies: - gaxios "^3.0.0" - google-p12-pem "^3.0.0" + gaxios "^4.0.0" + google-p12-pem "^3.1.3" jws "^4.0.0" - mime "^2.2.0" handlebars@^4.0.1: - version "4.7.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" - integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" neo-async "^2.6.0" @@ -3868,56 +3468,61 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== +has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - has-symbol-support-x "^1.4.1" + has-symbols "^1.0.2" -has@^1.0.3, has@~1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -3941,7 +3546,7 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -3955,82 +3560,79 @@ he@1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== "heap@>= 0.2.0": - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4038,9 +3640,9 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -4051,38 +3653,30 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.1, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4090,62 +3684,40 @@ import-fresh@^3.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== +internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -4156,15 +3728,34 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arguments@^1.0.4, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" @@ -4173,45 +3764,52 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= + integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -4223,131 +3821,148 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" - integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= - is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-regex@^1.0.4, is-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== - dependencies: - has-symbols "^1.0.1" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-regex@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== -is-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" - integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.4, is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: - has-symbols "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== iterate-iterator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" - integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.2.tgz#551b804c9eaa15b847ea6a7cdc2f5bf1ec150f91" + integrity sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw== iterate-value@^1.0.0: version "1.0.2" @@ -4360,53 +3975,45 @@ iterate-value@^1.0.0: js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== +js-yaml@3.x, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== json-bigint@^1.0.0: version "1.0.0" @@ -4418,7 +4025,12 @@ json-bigint@^1.0.0: json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-diff@0.5.2: version "0.5.2" @@ -4429,116 +4041,95 @@ json-diff@0.5.2: difflib "~0.2.1" dreamopt "~0.6.0" -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== - dependencies: - async "^2.0.1" - babel-preset-env "^1.7.0" - babelify "^7.3.0" - json-rpc-error "^2.0.0" - promise-to-callback "^1.0.0" - safe-event-emitter "^1.0.1" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-rpc-engine@^5.1.3: - version "5.1.8" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.1.8.tgz#5ba0147ce571899bbaa7133ffbc05317c34a3c7f" - integrity sha512-vTBSDEPJV1fPAsbm2g5sEuPjsgLdiab2f1CTn2PyRr8nxggUpA996PDlNQDsM0gnrA99F8KIBLq2nIKrOFl1Mg== + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== dependencies: - async "^2.0.1" - eth-json-rpc-errors "^2.0.1" - promise-to-callback "^1.0.0" + eth-rpc-errors "^3.0.0" safe-event-emitter "^1.0.1" -json-rpc-error@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= - dependencies: - inherits "^2.0.1" - json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= + integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== dependencies: - jsonify "~0.0.0" + jsonify "^0.0.1" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsonschema@^1.2.4: - version "1.2.6" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.6.tgz#52b0a8e9dc06bbae7295249d03e4b9faee8a0c0b" - integrity sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" jwa@^2.0.0: @@ -4558,23 +4149,14 @@ jws@^4.0.0: jwa "^2.0.0" safe-buffer "^5.0.1" -keccak@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" - integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== - dependencies: - bindings "^1.2.1" - inherits "^2.0.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - keccak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" + readable-stream "^3.6.0" keyv@^3.0.0: version "3.1.0" @@ -4583,6 +4165,13 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +keyv@^4.0.0: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4591,7 +4180,7 @@ kind-of@^6.0.2: klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" @@ -4624,7 +4213,7 @@ level-errors@~1.0.3: level-iterator-stream@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= + integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== dependencies: inherits "^2.0.1" level-errors "^1.0.3" @@ -4634,7 +4223,7 @@ level-iterator-stream@~1.3.0: level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= + integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== dependencies: readable-stream "~1.0.15" xtend "~2.1.1" @@ -4652,14 +4241,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4668,23 +4249,18 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^3.0.0: version "3.0.0" @@ -4701,34 +4277,51 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.flatmap@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" - integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= + integrity sha512-/OcpcAGWlrZyoHGeHh3cAoa6nGdX6QYtmzNP84Jqol6UEQQ2gIaU3H+0eICcjcKGl0/XF8LWOujNn9lffsnaOg== -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - chalk "^2.4.2" + chalk "^4.0.0" -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: - js-tokens "^3.0.0 || ^4.0.0" + get-func-name "^2.0.0" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" @@ -4740,6 +4333,18 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4750,14 +4355,7 @@ lru-cache@^6.0.0: ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== make-error@^1.1.1: version "1.3.6" @@ -4783,7 +4381,7 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== mem@^4.0.0: version "4.3.0" @@ -4797,7 +4395,7 @@ mem@^4.0.0: memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= + integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== dependencies: abstract-leveldown "~2.7.1" functional-red-black-tree "^1.0.1" @@ -4809,12 +4407,12 @@ memdown@^1.0.0: memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" @@ -4838,15 +4436,15 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.0.5" + braces "^3.0.2" + picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" @@ -4856,33 +4454,23 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.44.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.2.0: - version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -4893,10 +4481,15 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: dom-walk "^0.1.0" @@ -4905,24 +4498,38 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4: +minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -4930,7 +4537,7 @@ minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.2.1: +minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== @@ -4940,44 +4547,44 @@ minizlib@^1.2.1: mkdirp-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== dependencies: mkdirp "*" mkdirp@*: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" -mocha@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.0.1.tgz#fe01f0530362df271aa8f99510447bc38b88d8ed" - integrity sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg== +mocha@8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.2.tgz#d67fad13300e4f5cd48135a935ea566f96caf827" + integrity sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw== dependencies: ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.3.1" - debug "3.2.6" + chokidar "3.4.2" + debug "4.1.1" diff "4.0.2" - escape-string-regexp "1.0.5" - find-up "4.1.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" glob "7.1.6" growl "1.10.5" he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" + js-yaml "3.14.0" + log-symbols "4.0.0" minimatch "3.0.4" ms "2.1.2" object.assign "4.1.0" promise.allsettled "1.0.2" - serialize-javascript "3.0.0" + serialize-javascript "4.0.0" strip-json-comments "3.0.1" supports-color "7.1.0" which "2.0.2" @@ -4985,28 +4592,28 @@ mocha@8.0.1: workerpool "6.0.0" yargs "13.3.2" yargs-parser "13.1.2" - yargs-unparser "1.6.0" + yargs-unparser "1.6.1" mock-fs@^4.1.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.12.0.tgz#a5d50b12d2d75e5bec9dac3b67ffe3c41d31ade4" - integrity sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ== + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -5047,40 +4654,30 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nan@^2.14.0, nan@^2.2.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== nice-try@^1.0.4: version "1.0.5" @@ -5093,21 +4690,18 @@ node-addon-api@^2.0.0: integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-emoji@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" - integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: - lodash.toarray "^4.4.0" - -node-fetch@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" - integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= + lodash "^4.17.21" -node-fetch@^2.3.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" node-fetch@~1.7.1: version "1.7.3" @@ -5117,54 +4711,54 @@ node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-forge@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.1.tgz#775368e6846558ab6676858a4d8c6e8d16c677b5" - integrity sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ== +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-gyp-build@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" - integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: bn.js "4.11.6" strip-hex-prefix "1.0.0" @@ -5174,30 +4768,17 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-inspect@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-is@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -5205,9 +4786,9 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== -object.assign@4.1.0, object.assign@^4.1.0: +object.assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -5217,45 +4798,47 @@ object.assign@4.1.0, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" -oboe@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== dependencies: http-https "^1.0.0" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -5268,26 +4851,21 @@ optionator@^0.8.1, optionator@^0.8.2: word-wrap "~1.2.3" optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" original-require@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20" - integrity sha1-DxMEcVhM0zURxew4yNWSE/msXiA= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + integrity sha512-5vdKMbE58WaE61uVD+PKyh8xdM398UnjPBLotW2sjG5MzHARwta/+NtMBCBA0t2WQblGYBvq5vsiZpWokwno+A== os-locale@^3.1.0: version "3.1.0" @@ -5298,43 +4876,41 @@ os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-is-promise@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5342,12 +4918,12 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-limit "^1.1.0" + yocto-queue "^0.1.0" p-locate@^3.0.0: version "3.0.0" @@ -5363,17 +4939,12 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-limit "^3.0.2" p-try@^2.0.0: version "2.2.0" @@ -5388,13 +4959,12 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" @@ -5405,24 +4975,19 @@ parse-code-context@^1.0.0: integrity sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA== parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: + "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" parseurl@~1.3.3: version "1.3.3" @@ -5432,64 +4997,52 @@ parseurl@~1.3.3: path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17, pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5497,59 +5050,40 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== prelude-ls@^1.2.1: version "1.2.1" @@ -5559,17 +5093,12 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -5592,30 +5121,30 @@ prettier-plugin-solidity@1.0.0-alpha.54: semver "^7.3.2" string-width "^4.2.0" -prettier@2.0.5, prettier@^2.0.5: +prettier@2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== -prettier@^1.14.2, prettier@^1.14.3: +prettier@^1.14.2: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +prettier@^2.0.5, prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" @@ -5625,7 +5154,7 @@ progress@^2.0.0: promise-to-callback@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== dependencies: is-fn "^1.0.0" set-immediate-shim "^1.0.1" @@ -5641,23 +5170,23 @@ promise.allsettled@1.0.2: function-bind "^1.1.1" iterate-value "^1.0.0" -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== public-encrypt@^4.0.0: version "4.0.3" @@ -5682,32 +5211,36 @@ pump@^3.0.0: punycode@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" qs@^6.7.0: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== query-string@^5.0.1: version "5.1.1" @@ -5718,7 +5251,17 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -5733,57 +5276,45 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -randomhex@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" - integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" readable-stream@^1.0.33: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.0, readable-stream@^2.2.9: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5794,9 +5325,9 @@ readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.2.9, readable util-deprecate "~1.0.1" readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -5805,103 +5336,52 @@ readable-stream@^3.6.0: readable-stream@~1.0.15: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: - minimatch "3.0.4" - -regenerate@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + minimatch "^3.0.5" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== request@^2.79.0, request@^2.85.0: version "2.88.2" @@ -5932,9 +5412,9 @@ request@^2.79.0, request@^2.85.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.0: +require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -5944,10 +5424,10 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-from@^4.0.0: version "4.0.0" @@ -5957,49 +5437,36 @@ resolve-from@^4.0.0: resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.8.1, resolve@~1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.1.6, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.8.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - path-parse "^1.0.6" + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: - through "~2.3.4" + lowercase-keys "^2.0.0" reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -6007,6 +5474,13 @@ rimraf@^2.2.8: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -6016,44 +5490,44 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: - bn.js "^4.11.1" - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + bn.js "^5.2.0" run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.4.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" - integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-event-emitter@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" @@ -6061,15 +5535,24 @@ safe-event-emitter@^1.0.1: dependencies: events "^3.0.0" +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sc-istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.5.tgz#1896066484d55336cf2cdbcc7884dc79da50dc76" - integrity sha512-7wR5EZFLsC4w0wSm9BUuCgW+OGKAU7PNlW5L0qwVPbh+Q1sfVn2fyzfMXYCm6rkNA5ipaCOt94nApcguQwF5Gg== + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" async "1.x" @@ -6086,11 +5569,6 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" - integrity sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q= - scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" @@ -6101,118 +5579,77 @@ scrypt-js@^3.0.0, scrypt-js@^3.0.1: resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -"scrypt-shim@github:web3-js/scrypt-shim": - version "0.1.0" - resolved "https://codeload.github.com/web3-js/scrypt-shim/tar.gz/aafdadda13e660e25e1c525d1f5b2443f5eb1ebb" - dependencies: - scryptsy "^2.1.0" - semver "^6.3.0" - -scryptsy@2.1.0, scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - -scryptsy@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= - dependencies: - pbkdf2 "^3.0.3" - -secp256k1@^3.0.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.5.2" - nan "^2.14.0" - safe-buffer "^5.1.2" - secp256k1@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: - elliptic "^6.5.2" + elliptic "^6.5.4" node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -seek-bzip@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= - dependencies: - commander "~2.8.1" - semaphore@>=1.0.1, semaphore@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== - -semver@^6.1.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" semver@~5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" -serialize-javascript@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e" - integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw== +serialize-javascript@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.18.0" servify@^0.1.12: version "0.1.12" @@ -6228,27 +5665,27 @@ servify@^0.1.12: set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= + integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" @@ -6261,7 +5698,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -6275,7 +5712,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -6283,18 +5720,27 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" interpret "^1.0.0" rechoir "^0.6.2" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-concat@^1.0.0: version "1.0.1" @@ -6302,32 +5748,27 @@ simple-concat@^1.0.0: integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== dependencies: decompress-response "^3.3.0" once "^1.3.1" simple-concat "^1.0.0" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" solc@0.6.12: version "0.6.12" @@ -6344,39 +5785,41 @@ solc@0.6.12: tmp "0.0.33" solhint@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.1.0.tgz#50d58c9af921a01350164350144a9809d5ec2975" - integrity sha512-Cc0wqKzg0NviDF7H5zsrGJ/hVwwkGqi0Hkc3YtedTev4alkJv4YADdJg4y586MpfEvMX4QPp7LugsmJzoeChkQ== - dependencies: - "@solidity-parser/parser" "^0.6.0" - ajv "^6.6.1" - antlr4 "4.7.1" - ast-parents "0.0.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" + version "3.4.1" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.4.1.tgz#8ea15b21c13d1be0b53fd46d605a24d0b36a0c46" + integrity sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg== + dependencies: + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" semver "^6.3.0" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" optionalDependencies: - prettier "^1.14.3" + prettier "^2.8.3" -solidity-coverage@^0.7.9: - version "0.7.9" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.9.tgz#6d1c40639066b93c67b21da48f4bc27ae01f0e58" - integrity sha512-UWkl0iNmpjuVanPWvZzF6eCAKwbEmmolmzwbN8nU+MexOKO3eW6kVbxBkfEjVa8TuQcLb0F2wdgXJZBRbjpjnA== +solidity-coverage@0.7.22: + version "0.7.22" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.22.tgz#168f414be4c0f5303addcf3ab9714cf64f72c080" + integrity sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw== dependencies: - "@solidity-parser/parser" "^0.6.0" - "@truffle/provider" "^0.1.17" + "@solidity-parser/parser" "^0.14.0" + "@truffle/provider" "^0.2.24" chalk "^2.4.2" death "^1.1.0" detect-port "^1.3.0" fs-extra "^8.1.0" - ganache-cli "6.9.0" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" @@ -6386,8 +5829,9 @@ solidity-coverage@^0.7.9: pify "^4.0.1" recursive-readdir "^2.2.2" sc-istanbul "^0.4.5" + semver "^7.3.4" shelljs "^0.8.3" - web3 "1.2.6" + web3-utils "^1.3.0" source-map-support@0.5.12: version "0.5.12" @@ -6397,26 +5841,14 @@ source-map-support@0.5.12: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.17, source-map-support@^0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@^0.5.17: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -6425,45 +5857,19 @@ source-map@^0.6.0, source-map@^0.6.1: source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6475,17 +5881,24 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -"string-width@^1.0.2 || 2", string-width@^2.1.0: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -6502,39 +5915,41 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" -string.prototype.trim@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" - integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -6546,7 +5961,7 @@ string_decoder@^1.1.1: string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" @@ -6555,17 +5970,10 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" @@ -6576,34 +5984,27 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== - dependencies: - is-natural-number "^4.0.1" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" @@ -6612,32 +6013,22 @@ strip-json-comments@3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -strip-json-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.1.0: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@7.1.0, supports-color@^7.1.0: +supports-color@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: has-flag "^4.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" @@ -6648,34 +6039,28 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -swarm-js@0.1.39: - version "0.1.39" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" - integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - decompress "^4.0.0" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request-promise "^0.1.2" + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== + version "0.1.42" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== dependencies: bluebird "^3.5.0" buffer "^5.0.5" eth-lib "^0.1.26" fs-extra "^4.0.2" - got "^7.1.0" + got "^11.8.5" mime-types "^2.1.16" mkdirp-promise "^5.0.1" mock-fs "^4.1.0" @@ -6683,67 +6068,34 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.9, table@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -tape@^4.6.3: - version "4.13.3" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" - integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== - dependencies: - deep-equal "~1.1.1" - defined "~1.0.0" - dotignore "~0.1.2" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.6" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.0.5" - minimist "~1.2.5" - object-inspect "~1.7.0" - resolve "~1.17.0" - resumer "~0.0.0" - string.prototype.trim "~1.2.1" - through "~2.3.8" - -tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tar@^4.0.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" test-value@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= + integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== dependencies: array-back "^1.0.3" typical "^2.6.0" @@ -6751,47 +6103,24 @@ test-value@^2.1.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through2@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timed-out@^4.0.0, timed-out@^4.0.1: +timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== -tmp@0.0.33, tmp@^0.0.33: +tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-readable-stream@^1.0.0: version "1.0.0" @@ -6805,10 +6134,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@~2.5.0: version "2.5.0" @@ -6818,18 +6147,26 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -truffle@^5.1.35: - version "5.1.35" - resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.35.tgz#9b3adfd3aca1a3b6dd00874bc57d7569a3e3b89c" - integrity sha512-N2b/3OF84c/4jqmPJ4JgQU1g91Cai4JMKdJ3HLUsmEKmo1LZ84+Y0UIeVBFjWHtTX6H7/oXlvZ59xUVzxXyAsg== +truffle-contract-size@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/truffle-contract-size/-/truffle-contract-size-2.0.1.tgz#9ec1b078b0b3221cc1612400bd6f5df83c7a3a09" + integrity sha512-AIKPwHPC/1pZwtVjgUcgcK23k6gWxKhn4ZnKLr339uieb94UgAUeIwGUkfc87T+0lqgC6ePY7YhsFeoZK2YEsA== + dependencies: + cli-table "^0.3.1" + yargs "^15.3.1" + +truffle@5.1.49: + version "5.1.49" + resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.49.tgz#c9edc95192047ff4d170fcad235d26d0c4545de5" + integrity sha512-SkCfYRPhruowxH+qpJBAvM0u5+j/LK51U85ErXeiuRhyCNEWMNjUtISHTlEZ0KLr0Kki68iXk+o2UekN4Nlp5g== dependencies: app-module-path "^2.2.0" - mocha "8.0.1" + mocha "8.1.2" original-require "1.0.1" ts-essentials@^1.0.0: @@ -6868,39 +6205,49 @@ ts-node@^8.10.2: source-map-support "^0.5.17" yn "3.1.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" + json5 "^1.0.2" + minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -6912,7 +6259,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -6921,12 +6268,12 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -6939,15 +6286,15 @@ type@^1.0.1: resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== -type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== typechain@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-2.0.0.tgz#62143b48cdf8f95a777f1b76617af077b2d44eee" - integrity sha512-O+hsAUwtBpqCfoq46Grm52OEdm0GBEu78LxrEzkkGdwUdCoCZpNb2HPzPoNB1MXiRnNhEOGMFyf05UbT2/bUEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-2.0.1.tgz#4fa91006d871e5805d41f265880603d0817b74d6" + integrity sha512-GVigpARnr2tV9L+8WecF5huK+qEonNgh+Vp9UR/EayoTV4+3G8Yabhvf+p/QJVOz3JLM4Eo3ERxYmjjJMRXc/A== dependencies: command-line-args "^4.0.7" debug "^4.1.1" @@ -6957,6 +6304,45 @@ typechain@^2.0.0: ts-essentials "^6.0.3" ts-generator "^0.0.8" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -6964,43 +6350,35 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^3.9.7: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== typical@^2.6.0, typical@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= + integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== uglify-js@^3.1.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" - integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbzip2-stream@^1.0.9: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - buffer "^5.2.1" - through "^2.3.8" - -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" universalify@^0.1.0: version "0.1.2" @@ -7010,43 +6388,46 @@ universalify@^0.1.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: - punycode "^2.1.0" + escalade "^3.1.1" + picocolors "^1.0.0" -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: - prepend-http "^1.0.1" + punycode "^2.1.0" url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" url-set-query@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== url-template@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" utf8@3.0.0, utf8@^3.0.0: version "3.0.0" @@ -7056,17 +6437,28 @@ utf8@3.0.0, utf8@^3.0.0: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.0, util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== uuid@3.3.2: version "3.3.2" @@ -7078,1018 +6470,554 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e" - integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q== +uuid@^8.0.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== varint@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" - integrity sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8= + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -web3-bzz@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d" - integrity sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw== - dependencies: - got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== +web3-bzz@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed" + integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA== dependencies: "@types/node" "^12.12.6" - got "9.6.0" + got "12.1.0" swarm-js "^0.1.40" - underscore "1.9.1" -web3-bzz@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.2.tgz#a3b9f613c49fd3e120e0997088a73557d5adb724" - integrity sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA== +web3-bzz@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" + integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== dependencies: - "@types/node" "^10.12.18" - got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - -web3-bzz@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.6.tgz#0b88c0b96029eaf01b10cb47c4d5f79db4668883" - integrity sha512-9NiHLlxdI1XeFtbPJAmi2jnnIHVF+GNy517wvOS72P7ZfuJTPwZaSNXfT01vWgPPE9R96/uAHDWHOg+T4WaDQQ== - dependencies: - "@types/node" "^10.12.18" + "@types/node" "^12.12.6" got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - -web3-core-helpers@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" - integrity sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.1" - web3-utils "1.2.1" - -web3-core-helpers@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" - -web3-core-helpers@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz#484974f4bd4a487217b85b0d7cfe841af0907619" - integrity sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.2" - web3-utils "1.2.2" - -web3-core-helpers@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz#7aacd25bf8015adcdfc0f3243d0dcfdff0373f7d" - integrity sha512-gYKWmC2HmO7RcDzpo4L1K8EIoy5L8iubNDuTC6q69UxczwqKF/Io0kbK/1Z10Av++NlzOSiuyGp2gc4t4UOsDw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.6" - web3-utils "1.2.6" - -web3-core-method@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" - integrity sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-core-promievent "1.2.1" - web3-core-subscriptions "1.2.1" - web3-utils "1.2.1" - -web3-core-method@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" - -web3-core-method@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.2.tgz#d4fe2bb1945b7152e5f08e4ea568b171132a1e56" - integrity sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.2" - web3-core-promievent "1.2.2" - web3-core-subscriptions "1.2.2" - web3-utils "1.2.2" + swarm-js "^0.1.40" -web3-core-method@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.6.tgz#f5a3e4d304abaf382923c8ab88ec8eeef45c1b3b" - integrity sha512-r2dzyPEonqkBg7Mugq5dknhV5PGaZTHBZlS/C+aMxNyQs3T3eaAsCTqlQDitwNUh/sUcYPEGF0Vo7ahYK4k91g== +web3-core-helpers@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad" + integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g== dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.6" - web3-core-promievent "1.2.6" - web3-core-subscriptions "1.2.6" - web3-utils "1.2.6" + web3-eth-iban "1.10.0" + web3-utils "1.10.0" -web3-core-promievent@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" - integrity sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw== +web3-core-helpers@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" + integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" + web3-eth-iban "1.7.4" + web3-utils "1.7.4" -web3-core-promievent@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== +web3-core-method@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412" + integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.10.0" + web3-core-promievent "1.10.0" + web3-core-subscriptions "1.10.0" + web3-utils "1.10.0" + +web3-core-method@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" + integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-utils "1.7.4" + +web3-core-promievent@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b" + integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg== dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz#3b60e3f2a0c96db8a891c927899d29d39e66ab1c" - integrity sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ== - dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" - -web3-core-promievent@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.6.tgz#b1550a3a4163e48b8b704c1fe4b0084fc2dad8f5" - integrity sha512-km72kJef/qtQNiSjDJJVHIZvoVOm6ytW3FCYnOcCs7RIkviAb5JYlPiye0o4pJOLzCXYID7DK7Q9bhY8qWb1lw== - dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" - -web3-core-requestmanager@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" - integrity sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-providers-http "1.2.1" - web3-providers-ipc "1.2.1" - web3-providers-ws "1.2.1" - -web3-core-requestmanager@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" - -web3-core-requestmanager@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz#667ba9ac724c9c76fa8965ae8a3c61f66e68d8d6" - integrity sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.2" - web3-providers-http "1.2.2" - web3-providers-ipc "1.2.2" - web3-providers-ws "1.2.2" - -web3-core-requestmanager@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.6.tgz#5808c0edc0d6e2991a87b65508b3a1ab065b68ec" - integrity sha512-QU2cbsj9Dm0r6om40oSwk8Oqbp3wTa08tXuMpSmeOTkGZ3EMHJ1/4LiJ8shwg1AvPMrKVU0Nri6+uBNCdReZ+g== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.6" - web3-providers-http "1.2.6" - web3-providers-ipc "1.2.6" - web3-providers-ws "1.2.6" - -web3-core-subscriptions@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" - integrity sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.1" - -web3-core-subscriptions@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== +web3-core-promievent@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" + integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== dependencies: eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-core-subscriptions@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz#bf4ba23a653a003bdc3551649958cc0b080b068e" - integrity sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.2" -web3-core-subscriptions@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz#9d44189e2321f8f1abc31f6c09103b5283461b57" - integrity sha512-M0PzRrP2Ct13x3wPulFtc5kENH4UtnPxO9YxkfQlX2WRKENWjt4Rfq+BCVGYEk3rTutDfWrjfzjmqMRvXqEY5Q== +web3-core-requestmanager@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340" + integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ== + dependencies: + util "^0.12.5" + web3-core-helpers "1.10.0" + web3-providers-http "1.10.0" + web3-providers-ipc "1.10.0" + web3-providers-ws "1.10.0" + +web3-core-requestmanager@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" + integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== + dependencies: + util "^0.12.0" + web3-core-helpers "1.7.4" + web3-providers-http "1.7.4" + web3-providers-ipc "1.7.4" + web3-providers-ws "1.7.4" + +web3-core-subscriptions@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c" + integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g== dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.6" + eventemitter3 "4.0.4" + web3-core-helpers "1.10.0" -web3-core@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" - integrity sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg== +web3-core-subscriptions@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" + integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== dependencies: - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-requestmanager "1.2.1" - web3-utils "1.2.1" + eventemitter3 "4.0.4" + web3-core-helpers "1.7.4" -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== +web3-core@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633" + integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ== dependencies: - "@types/bn.js" "^4.11.5" + "@types/bn.js" "^5.1.1" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-requestmanager "1.10.0" + web3-utils "1.10.0" -web3-core@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.2.tgz#334b99c8222ef9cfd0339e27352f0b58ea789a2f" - integrity sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ== - dependencies: - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-requestmanager "1.2.2" - web3-utils "1.2.2" - -web3-core@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.6.tgz#bb42a1d7ae49a7258460f0d95ddb00906f59ef92" - integrity sha512-y/QNBFtr5cIR8vxebnotbjWJpOnO8LDYEAzZjeRRUJh2ijmhjoYk7dSNx9ExgC0UCfNFRoNCa9dGRu/GAxwRlw== +web3-core@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" + integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== dependencies: - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-core-requestmanager "1.2.6" - web3-utils "1.2.6" - -web3-eth-abi@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689" - integrity sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g== - dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.1" - -web3-eth-abi@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-abi@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz#d5616d88a90020f894763423a9769f2da11fe37a" - integrity sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw== - dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.2" + "@types/bn.js" "^5.1.0" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-requestmanager "1.7.4" + web3-utils "1.7.4" -web3-eth-abi@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25" - integrity sha512-w9GAyyikn8nSifSDZxAvU9fxtQSX+W2xQWMmrtTXmBGCaE4/ywKOSPAO78gq8AoU4Wq5yqVGKZLLbfpt7/sHlA== +web3-eth-abi@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1" + integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg== dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.6" + "@ethersproject/abi" "^5.6.3" + web3-utils "1.10.0" -web3-eth-accounts@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" - integrity sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ== +web3-eth-abi@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" + integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== dependencies: - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "0.2.7" - scryptsy "2.1.0" - semver "6.2.0" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-utils "1.2.1" + "@ethersproject/abi" "^5.6.3" + web3-utils "1.7.4" -web3-eth-accounts@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== +web3-eth-accounts@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117" + integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q== dependencies: - crypto-browserify "3.12.0" + "@ethereumjs/common" "2.5.0" + "@ethereumjs/tx" "3.3.2" eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" + ethereumjs-util "^7.1.5" scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-eth-accounts@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz#c187e14bff6baa698ac352220290222dbfd332e5" - integrity sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA== - dependencies: - any-promise "1.3.0" + uuid "^9.0.0" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-utils "1.10.0" + +web3-eth-accounts@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" + integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== + dependencies: + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" crypto-browserify "3.12.0" - eth-lib "0.2.7" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-shim "github:web3-js/scrypt-shim" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-utils "1.2.2" - -web3-eth-accounts@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.6.tgz#a1ba4bf75fa8102a3ec6cddd0eccd72462262720" - integrity sha512-cDVtonHRgzqi/ZHOOf8kfCQWFEipcfQNAMzXIaKZwc0UUD9mgSI5oJrN45a89Ze+E6Lz9m77cDG5Ax9zscSkcw== - dependencies: - "@web3-js/scrypt-shim" "^0.1.0" - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "^0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - underscore "1.9.1" + eth-lib "0.2.8" + ethereumjs-util "^7.0.10" + scrypt-js "^3.0.1" uuid "3.3.2" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-utils "1.2.6" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" -web3-eth-contract@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" - integrity sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g== - dependencies: - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-promievent "1.2.1" - web3-core-subscriptions "1.2.1" - web3-eth-abi "1.2.1" - web3-utils "1.2.1" - -web3-eth-contract@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-contract@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz#84e92714918a29e1028ee7718f0712536e14e9a1" - integrity sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA== - dependencies: - "@types/bn.js" "^4.11.4" - underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-promievent "1.2.2" - web3-core-subscriptions "1.2.2" - web3-eth-abi "1.2.2" - web3-utils "1.2.2" - -web3-eth-contract@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz#39111543960035ed94c597a239cf5aa1da796741" - integrity sha512-ak4xbHIhWgsbdPCkSN+HnQc1SH4c856y7Ly+S57J/DQVzhFZemK5HvWdpwadJrQTcHET3ZeId1vq3kmW7UYodw== - dependencies: - "@types/bn.js" "^4.11.4" - underscore "1.9.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-core-promievent "1.2.6" - web3-core-subscriptions "1.2.6" - web3-eth-abi "1.2.6" - web3-utils "1.2.6" - -web3-eth-ens@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5" - integrity sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q== - dependencies: - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-promievent "1.2.1" - web3-eth-abi "1.2.1" - web3-eth-contract "1.2.1" - web3-utils "1.2.1" - -web3-eth-ens@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== +web3-eth-contract@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a" + integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w== + dependencies: + "@types/bn.js" "^5.1.1" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-promievent "1.10.0" + web3-core-subscriptions "1.10.0" + web3-eth-abi "1.10.0" + web3-utils "1.10.0" + +web3-eth-contract@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" + integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== + dependencies: + "@types/bn.js" "^5.1.0" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-utils "1.7.4" + +web3-eth-ens@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9" + integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz#0a4abed1d4cbdacbf5e1ab06e502d806d1192bc6" - integrity sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg== - dependencies: - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-promievent "1.2.2" - web3-eth-abi "1.2.2" - web3-eth-contract "1.2.2" - web3-utils "1.2.2" - -web3-eth-ens@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.6.tgz#bf86a624c4c72bc59913c2345180d3ea947e110d" - integrity sha512-8UEqt6fqR/dji/jBGPFAyBs16OJjwi0t2dPWXPyGXmty/fH+osnXwWXE4HRUyj4xuafiM5P1YkXMsPhKEadjiw== + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-promievent "1.10.0" + web3-eth-abi "1.10.0" + web3-eth-contract "1.10.0" + web3-utils "1.10.0" + +web3-eth-ens@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" + integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== dependencies: + content-hash "^2.5.2" eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-promievent "1.2.6" - web3-eth-abi "1.2.6" - web3-eth-contract "1.2.6" - web3-utils "1.2.6" - -web3-eth-iban@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" - integrity sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.1" - -web3-eth-iban@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== - dependencies: - bn.js "^4.11.9" - web3-utils "1.2.11" - -web3-eth-iban@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz#76bec73bad214df7c4192388979a59fc98b96c5a" - integrity sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.2" - -web3-eth-iban@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz#0b22191fd1aa6e27f7ef0820df75820bfb4ed46b" - integrity sha512-TPMc3BW9Iso7H+9w+ytbqHK9wgOmtocyCD3PaAe5Eie50KQ/j7ThA60dGJnxItVo6yyRv5pZAYxPVob9x/fJlg== + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-contract "1.7.4" + web3-utils "1.7.4" + +web3-eth-iban@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a" + integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg== dependencies: - bn.js "4.11.8" - web3-utils "1.2.6" + bn.js "^5.2.1" + web3-utils "1.10.0" -web3-eth-personal@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" - integrity sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg== +web3-eth-iban@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" + integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== dependencies: - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-net "1.2.1" - web3-utils "1.2.1" + bn.js "^5.2.1" + web3-utils "1.7.4" -web3-eth-personal@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== +web3-eth-personal@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071" + integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg== dependencies: "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-net "1.10.0" + web3-utils "1.10.0" -web3-eth-personal@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz#eee1c86a8132fa16b5e34c6d421ca92e684f0be6" - integrity sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg== +web3-eth-personal@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" + integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-net "1.2.2" - web3-utils "1.2.2" - -web3-eth-personal@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.6.tgz#47a0a0657ec04dd77f95451a6869d4751d324b6b" - integrity sha512-T2NUkh1plY8d7wePXSoHnaiKOd8dLNFaQfgBl9JHU6S7IJrG9jnYD9bVxLEgRUfHs9gKf9tQpDf7AcPFdq/A8g== - dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-net "1.2.6" - web3-utils "1.2.6" - -web3-eth@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" - integrity sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA== - dependencies: - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-subscriptions "1.2.1" - web3-eth-abi "1.2.1" - web3-eth-accounts "1.2.1" - web3-eth-contract "1.2.1" - web3-eth-ens "1.2.1" - web3-eth-iban "1.2.1" - web3-eth-personal "1.2.1" - web3-net "1.2.1" - web3-utils "1.2.1" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.2.tgz#65a1564634a23b990efd1655bf94ad513904286c" - integrity sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA== - dependencies: - underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-subscriptions "1.2.2" - web3-eth-abi "1.2.2" - web3-eth-accounts "1.2.2" - web3-eth-contract "1.2.2" - web3-eth-ens "1.2.2" - web3-eth-iban "1.2.2" - web3-eth-personal "1.2.2" - web3-net "1.2.2" - web3-utils "1.2.2" - -web3-eth@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.6.tgz#15a8c65fdde0727872848cae506758d302d8d046" - integrity sha512-ROWlDPzh4QX6tlGGGlAK6X4kA2n0/cNj/4kb0nNVWkRouGmYO0R8k6s47YxYHvGiXt0s0++FUUv5vAbWovtUQw== - dependencies: - underscore "1.9.1" - web3-core "1.2.6" - web3-core-helpers "1.2.6" - web3-core-method "1.2.6" - web3-core-subscriptions "1.2.6" - web3-eth-abi "1.2.6" - web3-eth-accounts "1.2.6" - web3-eth-contract "1.2.6" - web3-eth-ens "1.2.6" - web3-eth-iban "1.2.6" - web3-eth-personal "1.2.6" - web3-net "1.2.6" - web3-utils "1.2.6" - -web3-net@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" - integrity sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw== - dependencies: - web3-core "1.2.1" - web3-core-method "1.2.1" - web3-utils "1.2.1" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-net@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.2.tgz#5c3226ca72df7c591422440ce6f1203fd42ddad9" - integrity sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw== - dependencies: - web3-core "1.2.2" - web3-core-method "1.2.2" - web3-utils "1.2.2" - -web3-net@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.6.tgz#035ca0fbe55282fda848ca17ebb4c8966147e5ea" - integrity sha512-hsNHAPddrhgjWLmbESW0KxJi2GnthPcow0Sqpnf4oB6+/+ZnQHU9OsIyHb83bnC1OmunrK2vf9Ye2mLPdFIu3A== - dependencies: - web3-core "1.2.6" - web3-core-method "1.2.6" - web3-utils "1.2.6" + "@types/node" "^12.12.6" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" -web3-providers-http@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013" - integrity sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ== +web3-eth@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf" + integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA== + dependencies: + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-subscriptions "1.10.0" + web3-eth-abi "1.10.0" + web3-eth-accounts "1.10.0" + web3-eth-contract "1.10.0" + web3-eth-ens "1.10.0" + web3-eth-iban "1.10.0" + web3-eth-personal "1.10.0" + web3-net "1.10.0" + web3-utils "1.10.0" + +web3-eth@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" + integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== + dependencies: + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-accounts "1.7.4" + web3-eth-contract "1.7.4" + web3-eth-ens "1.7.4" + web3-eth-iban "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + +web3-net@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b" + integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA== dependencies: - web3-core-helpers "1.2.1" - xhr2-cookies "1.1.0" + web3-core "1.10.0" + web3-core-method "1.10.0" + web3-utils "1.10.0" -web3-providers-http@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== +web3-net@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" + integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== dependencies: - web3-core-helpers "1.2.11" - xhr2-cookies "1.1.0" + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" -web3-providers-http@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.2.tgz#155e55c1d69f4c5cc0b411ede40dea3d06720956" - integrity sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg== +web3-providers-http@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b" + integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA== dependencies: - web3-core-helpers "1.2.2" - xhr2-cookies "1.1.0" + abortcontroller-polyfill "^1.7.3" + cross-fetch "^3.1.4" + es6-promise "^4.2.8" + web3-core-helpers "1.10.0" -web3-providers-http@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.6.tgz#3c7b1252751fb37e53b873fce9dbb6340f5e31d9" - integrity sha512-2+SaFCspb5f82QKuHB3nEPQOF9iSWxRf7c18fHtmnLNVkfG9SwLN1zh67bYn3tZGUdOI3gj8aX4Uhfpwx9Ezpw== +web3-providers-http@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" + integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== dependencies: - web3-core-helpers "1.2.6" + web3-core-helpers "1.7.4" xhr2-cookies "1.1.0" -web3-providers-ipc@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" - integrity sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.1" - -web3-providers-ipc@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-providers-ipc@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz#c6d165a12bc68674b4cdd543ea18aec79cafc2e8" - integrity sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.2" - -web3-providers-ipc@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.6.tgz#adabab5ac66b3ff8a26c7dc97af3f1a6a7609701" - integrity sha512-b0Es+/GTZyk5FG3SgUDW+2/mBwJAXWt5LuppODptiOas8bB2khLjG6+Gm1K4uwOb+1NJGPt5mZZ8Wi7vibtQ+A== +web3-providers-ipc@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889" + integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA== dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.6" + oboe "2.1.5" + web3-core-helpers "1.10.0" -web3-providers-ws@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" - integrity sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA== +web3-providers-ipc@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" + integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" + oboe "2.1.5" + web3-core-helpers "1.7.4" -web3-providers-ws@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== +web3-providers-ws@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5" + integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ== dependencies: eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" - -web3-providers-ws@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz#d2c05c68598cea5ad3fa6ef076c3bcb3ca300d29" - integrity sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.2" - websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" - -web3-providers-ws@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.6.tgz#3cecc49f7c99f07a75076d3c54247050bc4f7e11" - integrity sha512-20waSYX+gb5M5yKhug5FIwxBBvkKzlJH7sK6XEgdOx6BZ9YYamLmvg9wcRVtnSZO8hV/3cWenO/tRtTrHVvIgQ== - dependencies: - "@web3-js/websocket" "^1.0.29" - underscore "1.9.1" - web3-core-helpers "1.2.6" - -web3-shh@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" - integrity sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA== - dependencies: - web3-core "1.2.1" - web3-core-method "1.2.1" - web3-core-subscriptions "1.2.1" - web3-net "1.2.1" - -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" + web3-core-helpers "1.10.0" + websocket "^1.0.32" -web3-shh@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.2.tgz#44ed998f2a6ba0ec5cb9d455184a0f647826a49c" - integrity sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg== +web3-providers-ws@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" + integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== dependencies: - web3-core "1.2.2" - web3-core-method "1.2.2" - web3-core-subscriptions "1.2.2" - web3-net "1.2.2" + eventemitter3 "4.0.4" + web3-core-helpers "1.7.4" + websocket "^1.0.32" -web3-shh@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.6.tgz#2492616da4cac32d4c7534b890f43bac63190c14" - integrity sha512-rouWyOOM6YMbLQd65grpj8BBezQfgNeRRX+cGyW4xsn6Xgu+B73Zvr6OtA/ftJwwa9bqHGpnLrrLMeWyy4YLUw== +web3-shh@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8" + integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg== dependencies: - web3-core "1.2.6" - web3-core-method "1.2.6" - web3-core-subscriptions "1.2.6" - web3-net "1.2.6" + web3-core "1.10.0" + web3-core-method "1.10.0" + web3-core-subscriptions "1.10.0" + web3-net "1.10.0" -web3-utils@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" - integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== +web3-shh@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" + integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.9.1" - utf8 "3.0.0" + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-net "1.7.4" -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.2.tgz#b53a08c40d2c3f31d3c4a28e7d749405df99c8c0" - integrity sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A== +web3-utils@1.10.0, web3-utils@^1.3.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" - underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.6.tgz#b9a25432da00976457fcc1094c4af8ac6d486db9" - integrity sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg== +web3-utils@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" + integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" - underscore "1.9.1" utf8 "3.0.0" -web3@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" - integrity sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw== - dependencies: - web3-bzz "1.2.1" - web3-core "1.2.1" - web3-eth "1.2.1" - web3-eth-personal "1.2.1" - web3-net "1.2.1" - web3-shh "1.2.1" - web3-utils "1.2.1" - -web3@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.2.tgz#b1b8b69aafdf94cbaeadbb68a8aa1df2ef266aec" - integrity sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg== - dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.2" - web3-core "1.2.2" - web3-eth "1.2.2" - web3-eth-personal "1.2.2" - web3-net "1.2.2" - web3-shh "1.2.2" - web3-utils "1.2.2" - -web3@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.6.tgz#c497dcb14cdd8d6d9fb6b445b3b68ff83f8ccf68" - integrity sha512-tpu9fLIComgxGrFsD8LUtA4s4aCZk7px8UfcdEy6kS2uDi/ZfR07KJqpXZMij7Jvlq+cQrTAhsPSiBVvoMaivA== - dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.6" - web3-core "1.2.6" - web3-eth "1.2.6" - web3-eth-personal "1.2.6" - web3-net "1.2.6" - web3-shh "1.2.6" - web3-utils "1.2.6" - -web3@^1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" - -websocket@^1.0.31: - version "1.0.31" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.31.tgz#e5d0f16c3340ed87670e489ecae6144c79358730" - integrity sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ== - dependencies: - debug "^2.2.0" - es5-ext "^0.10.50" - nan "^2.14.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" +web3@1.10.0, web3@^1.2.11: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274" + integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng== + dependencies: + web3-bzz "1.10.0" + web3-core "1.10.0" + web3-eth "1.10.0" + web3-eth-personal "1.10.0" + web3-net "1.10.0" + web3-shh "1.10.0" + web3-utils "1.10.0" + +web3@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" + integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== + dependencies: + web3-bzz "1.7.4" + web3-core "1.7.4" + web3-eth "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-shh "1.7.4" + web3-utils "1.7.4" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": - version "1.0.29" - resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/ef5ea2f41daf4a2113b80c9223df884b4d56c400" +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== dependencies: + bufferutil "^4.0.1" debug "^2.2.0" es5-ext "^0.10.50" - nan "^2.14.0" typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" yaeti "^0.0.6" -whatwg-fetch@2.0.4: +whatwg-fetch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.10, which-typed-array@^1.1.2: + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" which@2.0.2, which@^2.0.1: version "2.0.2" @@ -8112,7 +7040,7 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -8120,7 +7048,7 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: wordwrap@>=0.0.2, wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== workerpool@6.0.0: version "6.0.0" @@ -8136,17 +7064,19 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^3.0.0: version "3.3.3" @@ -8158,9 +7088,9 @@ ws@^3.0.0: ultron "~1.1.0" ws@^5.1.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" @@ -8187,16 +7117,16 @@ xhr-request@^1.0.1, xhr-request@^1.1.0: xhr2-cookies@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= + integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== dependencies: cookiejar "^2.1.1" xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== dependencies: - global "~4.3.0" + global "~4.4.0" is-function "^1.0.1" parse-headers "^2.0.0" xtend "^4.0.0" @@ -8204,9 +7134,9 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -8214,21 +7144,21 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== dependencies: object-keys "~0.4.0" y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== -yallist@^3.0.0, yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -8246,14 +7176,32 @@ yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== +yargs-parser@^15.0.1: + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" + integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== + dependencies: + camelcase "^5.3.1" + decamelize "^1.2.0" flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" + is-plain-obj "^1.1.0" + yargs "^14.2.3" yargs@13.2.4: version "13.2.4" @@ -8272,7 +7220,7 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@13.3.2, yargs@^13.3.0: +yargs@13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -8288,15 +7236,46 @@ yargs@13.3.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" -yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= +yargs@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==