diff --git a/README.md b/README.md index 641ef4b1d..ac91b9e1c 100644 --- a/README.md +++ b/README.md @@ -1,398 +1,13 @@ -# Safe Core SDK +# Safe Core SDK Monorepo -[![Coverage Status](https://coveralls.io/repos/github/gnosis/safe-core-sdk/badge.svg?branch=main)](https://coveralls.io/github/gnosis/safe-core-sdk?branch=main) +Software developer tools that facilitate the interaction with the Gnosis Safe [contracts](https://github.com/gnosis/safe-contracts). -Software development kit that facilitates the interaction with the [Gnosis Safe contracts](https://github.com/gnosis/safe-contracts). +## Packages -## Installation - -Install the package with yarn or npm: - -```bash -yarn install -npm install -``` - -## Build - -Build the package with yarn or npm: - -```bash -yarn build -npm build -``` - -## Getting Started - -A Safe account with three owners and threshold equal three will be used as the starting point for this example but any Safe configuration is valid. - -```js -import { ethers } from 'ethers' -import EthersSafe, { SafeTransactionDataPartial } from '@gnosis.pm/safe-core-sdk' - -const web3Provider = // ... -const provider = new ethers.providers.Web3Provider(web3Provider) -const signer1 = provider.getSigner(0) -const signer2 = provider.getSigner(1) -const signer3 = provider.getSigner(2) - -// Existing Safe address (e.g. Safe created via https://app.gnosis-safe.io) -// Where signer1, signer2 and signer3 are the Safe owners -const safeAddress = "0x" -``` - -Create an instance of the Safe Core SDK with `signer1` connected as the signer. - -```js -const safeSdk = await EthersSafe.create(ethers, safeAddress, signer1) -``` - -### 1. Create a Safe transaction - -```js -const partialTx: SafeTransactionDataPartial = { - to: '0x
', - data: '0x', - value: '' -} -const safeTransaction = await safeSdk.createTransaction(partialTx) -``` - -Before executing this transaction, it must be signed by the owners and this can be done off-chain or on-chain. In this example the owner `signer1` will sign it off-chain, the owner `signer2` will sign it on-chain and the owner `signer3` will execute it (the executor also signs the transaction transparently). - -### 2.a. Off-chain signatures - -The owner `signer1` signs the transaction off-chain. - -```js -const signer1Signature = await safeSdk.signTransaction(safeTransaction) -``` - -Because the signature is off-chain, there is no interaction with the contract and the signature becomes available at `safeTransaction.signatures`. - -### 2.b. On-chain signatures - -After `signer2` account is connected to the SDK as the signer the transaction hash will be approved on-chain. - -```js -const safeSdk2 = await safeSdk.connect(signer2) -const txHash = await safeSdk2.getTransactionHash(safeTransaction) -const approveTxResponse = await safeSdk2.approveTransactionHash(txHash) -await approveTxResponse.wait() -``` - -### 3. Transaction execution - -Lastly, `signer3` account is connected to the SDK as the signer and executor of the Safe transaction to execute it. - -```js -const safeSdk3 = await safeSdk2.connect(signer3) -const executeTxResponse = await safeSdk3.executeTransaction(safeTransaction) -await executeTxResponse.wait() -``` - -All the signatures used to execute the transaction are now available at `safeTransaction.signatures`. - -## API Reference - -### create -Returns an instance of the Safe Core SDK with the `providerOrSigner` connected to the `safeAddress`. - -```js -const safeSdk = await EthersSafe.create(ethers, safeAddress, providerOrSigner) -``` - -If `providerOrSigner` is not provided, `ethers` default provider will be used. - -```js -const safeSdk = await EthersSafe.create(ethers, safeAddress) -``` - -### connect - -Returns a new instance of the Safe Core SDK with the `providerOrSigner` connected to the `safeAddress`. - -```js -const safeSdk2 = await safeSdk.connect(providerOrSigner, safeAddress) -``` - -If `safeAddress` is not provided, the `providerOrSigner` will be connected to the previous Safe. - -```js -const safeSdk2 = await safeSdk.connect(providerOrSigner) -``` - -### getProvider - -Returns the connected provider. - -```js -const provider = safeSdk.getProvider() -``` - -### getSigner - -Returns the connected signer. - -```js -const signer = safeSdk.getSigner() -``` - -### getAddress - -Returns the address of the current Safe Proxy contract. - -```js -const address = safeSdk.getAddress() -``` - -### getContractVersion - -Returns the Safe Master Copy contract version. - -```js -const contractVersion = await safeSdk.getContractVersion() -``` - -### getOwners - -Returns the list of Safe owner accounts. - -```js -const owners = await safeSdk.getOwners() -``` - -### getNonce - -Returns the Safe nonce. - -```js -const nonce = await safeSdk.getNonce() -``` - -### getThreshold - -Returns the Safe threshold. - -```js -const threshold = await safeSdk.getThreshold() -``` - -### getChainId - -Returns the chainId of the connected network. - -```js -const chainId = await safeSdk.getChainId() -``` - -### getBalance - -Returns the ETH balance of the Safe. - -```js -const balance = await safeSdk.getBalance() -``` - -### getModules - -Returns the list of addresses of all the enabled Safe modules. - -```js -const modules = await safeSdk.getModules() -``` - -### isModuleEnabled - -Checks if a specific Safe module is enabled for the current Safe. - -```js -const isEnabled = await safeSdk.isModuleEnabled(moduleAddress) -``` - -### isOwner - -Checks if a specific address is an owner of the current Safe. - -```js -const isOwner = await safeSdk.isOwner(address) -``` - -### createTransaction - -Returns a Safe transaction ready to be signed by the owners and executed. - -Each of the transactions provided as input to this function must be an object with the following properties: - -* `to`: Required. -* `data`: Required. -* `value`: Required. -* `operation`: Optional. `OperationType.Call` (0) is the default value. -* `safeTxGas`: Optional. The right gas estimation is the default value. -* `baseGas`: Optional. 0 is the default value. -* `gasPrice`: Optional. 0 is the default value. -* `gasToken`: Optional. 0x address is the default value. -* `refundReceiver`: Optional. 0x address is the default value. -* `nonce`: Optional. The current Safe nonce is the default value. - -Read more about the [Safe transaction properties](https://docs.gnosis.io/safe/docs/contracts_tx_execution/). - -```js -const partialTx: SafeTransactionDataPartial = { - to: '0x
', - data: '0x', - value: '' -} -const safeTransaction = await safeSdk.createTransaction(partialTx) -``` - -### getTransactionHash - -Returns the transaction hash of a Safe transaction. - -```js -const tx = await safeSdk.createTransaction({ - // ... -}) -const txHash = await safeSdk.getTransactionHash(tx) -``` - -### signTransactionHash - -Signs a hash using the current signer account. - -```js -const tx = await safeSdk.createTransaction({ - // ... -}) -const txHash = await safeSdk.getTransactionHash(tx) -const signature = await safeSdk.signTransactionHash(txHash) -``` - -### signTransaction - -Adds the signature of the current signer to the Safe transaction object. - -```js -const tx = await safeSdk.createTransaction({ - // ... -}) -await safeSdk.signTransaction(tx) -``` - -### approveTransactionHash - -Approves on-chain a hash using the current signer account. - -```js -const tx = await safeSdk.createTransaction({ - // ... -}) -const txHash = await safeSdk.getTransactionHash(tx) -const txResponse = await safeSdk.approveTransactionHash(txHash) -await txResponse.wait() -``` - -### getOwnersWhoApprovedTx - -Returns a list of owners who have approved a specific Safe transaction. - -```js -const tx = await safeSdk.createTransaction({ - // ... -}) -const txHash = await safeSdk.getTransactionHash(tx) -const owners = await safeSdk.getOwnersWhoApprovedTx(txHash) -``` - -### getEnableModuleTx - -Returns a Safe transaction ready to be signed that will enable a Safe module. - -```js -const tx = await safeSdk.getEnableModuleTx(moduleAddress) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -### getDisableModuleTx - -Returns a Safe transaction ready to be signed that will disable a Safe module. - -```js -const tx = await safeSdk.getDisableModuleTx(moduleAddress) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -### getAddOwnerTx - -Returns the Safe transaction to add an owner and update the threshold. - -```js -const tx = await safeSdk.getAddOwnerTx(newOwnerAddress, newThreshold) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -If `threshold` is not provided, the current threshold will not change. - -```js -const tx = await safeSdk.getAddOwnerTx(newOwnerAddress) -``` - -### getRemoveOwnerTx - -Returns the Safe transaction to remove an owner and update the threshold. - -```js -const tx = await safeSdk.getRemoveOwnerTx(ownerAddress, newThreshold) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -If `threshold` is not provided, the current threshold will be decreased by one. - -```js -const tx = await safeSdk.getRemoveOwnerTx(ownerAddress) -``` - -### getSwapOwnerTx - -Returns the Safe transaction to replace an owner of the Safe with a new one. - -```js -const tx = await safeSdk.getSwapOwnerTx(oldOwnerAddress, newOwnerAddress) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -### getChangeThresholdTx - -Returns the Safe transaction to change the threshold. - -```js -const tx = await safeSdk.getChangeThresholdTx(newThreshold) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -### executeTransaction - -Executes a Safe transaction. - -```js -const tx = await safeSdk.createTransaction({ - // ... -}) -const txResponse = await safeSdk.executeTransaction(tx) -await txResponse.wait() -``` - -## License - -This library is released under MIT. - -## Contributors - -- Germán Martínez ([germartinez](https://github.com/germartinez)) +| Package | Release | Description | +| ------- | :-----: | ----------- | +| [safe-core-sdk](https://github.com/gnosis/safe-core-sdk/tree/master/packages/safe-core-sdk) | [![NPM Version](https://badge.fury.io/js/%40gnosis.pm%2Fsafe-core-sdk.svg)](https://badge.fury.io/js/%40gnosis.pm%2Fsafe-core-sdk) | TypeScript library that facilitates the interaction with the [Gnosis Safe contracts](https://github.com/gnosis/safe-contracts) | + diff --git a/lerna.json b/lerna.json new file mode 100644 index 000000000..ad7b91a28 --- /dev/null +++ b/lerna.json @@ -0,0 +1,6 @@ +{ + "packages": ["packages/*"], + "npmClient": "yarn", + "version": "independent", + "useWorkspaces": true +} diff --git a/package.json b/package.json index a5bbd0b89..afbff76a7 100644 --- a/package.json +++ b/package.json @@ -1,86 +1,17 @@ + { - "name": "@gnosis.pm/safe-core-sdk", - "version": "0.1.2", - "description": "Safe Core SDK", - "main": "dist/src/index.js", - "keywords": [ - "Ethereum", - "Gnosis", - "Safe", - "SDK" - ], + "name": "safe-core-sdk", + "private": true, "scripts": { - "build": "yarn rimraf dist && hardhat compile && tsc", - "test:ganache": "export TEST_NETWORK=ganache && hardhat --network localhost deploy && nyc hardhat --network localhost test", - "test": "hardhat deploy && nyc hardhat test", - "coverage": "nyc report --reporter=text-lcov | coveralls", - "format": "prettier --write \"{src,tests,hardhat}/**/*.ts\"", - "lint": "tslint -p tsconfig.json" + "sdk:build": "lerna run --scope @gnosis.pm/safe-core-sdk build --stream", + "test": "FORCE_COLOR=1 lerna run test --stream" }, - "repository": { - "type": "git", - "url": "git+https://github.com/gnosis/safe-core-sdk.git" - }, - "author": "Gnosis (https://gnosis.io)", - "license": "MIT", - "bugs": { - "url": "https://github.com/gnosis/safe-core-sdk/issues" - }, - "files": [ - "dist/**/*", - "README.md", - "LICENSE.md" - ], - "homepage": "https://github.com/gnosis/safe-core-sdk#readme", - "devDependencies": { - "@gnosis.pm/safe-contracts": "^1.2.0", - "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-waffle": "^2.0.1", - "@nomiclabs/hardhat-web3": "^2.0.0", - "@typechain/ethers-v5": "^6.0.5", - "@types/chai": "^4.2.18", - "@types/chai-as-promised": "^7.1.4", - "@types/mocha": "^8.2.2", - "@types/node": "^15.0.3", - "@types/yargs": "^16.0.1", - "@typescript-eslint/eslint-plugin": "^4.23.0", - "@typescript-eslint/parser": "^4.23.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.1", - "coveralls": "^3.1.0", - "dotenv": "^8.2.0", - "eslint": "^7.26.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^3.4.0", - "ethereum-waffle": "^3.3.0", - "ethers": "^5.1.4", - "hardhat": "^2.2.1", - "hardhat-deploy": "^0.7.5", - "hardhat-typechain": "^0.3.5", - "husky": "^6.0.0", - "lint-staged": "^10.5.4", - "mocha": "^8.4.0", - "nyc": "^15.1.0", - "prettier": "^2.3.0", - "rimraf": "^3.0.2", - "ts-generator": "^0.1.1", - "ts-node": "^9.1.1", - "typechain": "^4.0.3", - "typescript": "^4.2.4", - "yargs": "^16.2.0" - }, - "lint-staged": { - "src/**/!(*test).ts": [ - "yarn lint", - "prettier --write" + "workspaces": { + "packages": [ + "packages/*" ] }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, "dependencies": { - "ethereumjs-util": "^7.0.10" + "lerna": "^4.0.0" } } diff --git a/packages/safe-core-sdk/README.md b/packages/safe-core-sdk/README.md new file mode 100644 index 000000000..e5529b926 --- /dev/null +++ b/packages/safe-core-sdk/README.md @@ -0,0 +1,432 @@ +# Safe Core SDK + +[![NPM Version](https://badge.fury.io/js/%40gnosis.pm%2Fsafe-core-sdk.svg)](https://badge.fury.io/js/%40gnosis.pm%2Fsafe-core-sdk) +[![GitHub Release](https://img.shields.io/github/release/gnosis/safe-core-sdk.svg?style=flat)](https://github.com/gnosis/safe-core-sdk/releases) +[![GitHub](https://img.shields.io/github/license/gnosis/safe-core-sdk)](https://github.com/gnosis/safe-core-sdk/blob/main/LICENSE.md) +[![Coverage Status](https://coveralls.io/repos/github/gnosis/safe-core-sdk/badge.svg?branch=main)](https://coveralls.io/github/gnosis/safe-core-sdk?branch=main) + +Software development kit that facilitates the interaction with the [Gnosis Safe contracts](https://github.com/gnosis/safe-contracts). + +## Installation + +Install the package with yarn or npm: + +```bash +yarn install +npm install +``` + +## Build + +Build the package with yarn or npm: + +```bash +yarn build +npm build +``` + +## Getting Started + +A Safe account with three owners and threshold equal three will be used as the starting point for this example but any Safe configuration is valid. + +```js +import { ethers } from 'ethers' +import EthersSafe, { SafeTransactionDataPartial } from '@gnosis.pm/safe-core-sdk' + +const web3Provider = // ... +const provider = new ethers.providers.Web3Provider(web3Provider) +const signer1 = provider.getSigner(0) +const signer2 = provider.getSigner(1) +const signer3 = provider.getSigner(2) + +// Existing Safe address (e.g. Safe created via https://app.gnosis-safe.io) +// Where signer1, signer2 and signer3 are the Safe owners +const safeAddress = '0x' +``` + +Create an instance of the Safe Core SDK with `signer1` connected as the signer. + +```js +const safeSdk = await EthersSafe.create({ ethers, safeAddress, providerOrSigner: signer1 }) +``` + +### 1. Create a Safe transaction + +```js +const transactions: SafeTransactionDataPartial[] = [{ + to: '0x
', + value: '', + data: '0x' +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +``` + +Before executing this transaction, it must be signed by the owners and this can be done off-chain or on-chain. In this example the owner `signer1` will sign it off-chain, the owner `signer2` will sign it on-chain and the owner `signer3` will execute it (the executor also signs the transaction transparently). + +### 2.a. Off-chain signatures + +The owner `signer1` signs the transaction off-chain. + +```js +const signer1Signature = await safeSdk.signTransaction(safeTransaction) +``` + +Because the signature is off-chain, there is no interaction with the contract and the signature becomes available at `safeTransaction.signatures`. + +### 2.b. On-chain signatures + +After `signer2` account is connected to the SDK as the signer the transaction hash will be approved on-chain. + +```js +const safeSdk2 = await safeSdk.connect({ providerOrSigner: signer2 }) +const txHash = await safeSdk2.getTransactionHash(safeTransaction) +const approveTxResponse = await safeSdk2.approveTransactionHash(txHash) +await approveTxResponse.wait() +``` + +### 3. Transaction execution + +Lastly, `signer3` account is connected to the SDK as the signer and executor of the Safe transaction to execute it. + +```js +const safeSdk3 = await safeSdk2.connect({ providerOrSigner: signer3 }) +const executeTxResponse = await safeSdk3.executeTransaction(safeTransaction) +await executeTxResponse.wait() +``` + +All the signatures used to execute the transaction are now available at `safeTransaction.signatures`. + +## API Reference + +### create +Returns an instance of the Safe Core SDK with the `providerOrSigner` connected to the `safeAddress`. + +```js +const safeSdk = await EthersSafe.create({ ethers, safeAddress, providerOrSigner }) +``` + +If `providerOrSigner` is not provided, `ethers` default provider will be used. + +```js +const safeSdk = await EthersSafe.create({ ethers, safeAddress }) +``` + +The property `contractNetworks` can be added to provide the Safe contract addresses in case the SDK is used in a network where the Safe contracts are not deployed. + +```js +const contractNetworks: ContractNetworksConfig = { + [chainId]: { + multiSendAddress: '0x' + } +} +const safeSdk = await EthersSafe.create({ ethers, safeAddress, providerOrSigner, contractNetworks }) +``` + +### connect + +Returns a new instance of the Safe Core SDK with the `providerOrSigner` connected to the `safeAddress`. + +```js +const safeSdk2 = await safeSdk.connect({ providerOrSigner, safeAddress }) +``` + +If `safeAddress` is not provided, the `providerOrSigner` will be connected to the previous Safe. + +```js +const safeSdk2 = await safeSdk.connect({ providerOrSigner }) +``` + +The property `contractNetworks` can be added to provide the Safe contract addresses in case the SDK is used in a network where the Safe contracts are not deployed. + +```js +const contractNetworks: ContractNetworksConfig = { + [chainId]: { + multiSendAddress: '0x' + } +} +const safeSdk = await EthersSafe.create({ ethers, safeAddress, providerOrSigner, contractNetworks }) +``` + +### getProvider + +Returns the connected provider. + +```js +const provider = safeSdk.getProvider() +``` + +### getSigner + +Returns the connected signer. + +```js +const signer = safeSdk.getSigner() +``` + +### getAddress + +Returns the address of the current Safe Proxy contract. + +```js +const address = safeSdk.getAddress() +``` + +### getContractVersion + +Returns the Safe Master Copy contract version. + +```js +const contractVersion = await safeSdk.getContractVersion() +``` + +### getOwners + +Returns the list of Safe owner accounts. + +```js +const owners = await safeSdk.getOwners() +``` + +### getNonce + +Returns the Safe nonce. + +```js +const nonce = await safeSdk.getNonce() +``` + +### getThreshold + +Returns the Safe threshold. + +```js +const threshold = await safeSdk.getThreshold() +``` + +### getChainId + +Returns the chainId of the connected network. + +```js +const chainId = await safeSdk.getChainId() +``` + +### getBalance + +Returns the ETH balance of the Safe. + +```js +const balance = await safeSdk.getBalance() +``` + +### getModules + +Returns the list of addresses of all the enabled Safe modules. + +```js +const modules = await safeSdk.getModules() +``` + +### isModuleEnabled + +Checks if a specific Safe module is enabled for the current Safe. + +```js +const isEnabled = await safeSdk.isModuleEnabled(moduleAddress) +``` + +### isOwner + +Checks if a specific address is an owner of the current Safe. + +```js +const isOwner = await safeSdk.isOwner(address) +``` + +### createTransaction + +Returns a Safe transaction ready to be signed by the owners and executed. Batched transactions are allowed if more than one transaction is added to the array of transactions. + +Each of the transactions provided as input to this function must be an object with the following properties: + +* `to`: Required. +* `data`: Required. +* `value`: Required. +* `operation`: Optional. `OperationType.Call` (0) is the default value. +* `safeTxGas`: Optional. The right gas estimation is the default value. +* `baseGas`: Optional. 0 is the default value. +* `gasPrice`: Optional. 0 is the default value. +* `gasToken`: Optional. 0x address is the default value. +* `refundReceiver`: Optional. 0x address is the default value. +* `nonce`: Optional. The current Safe nonce is the default value. + +Read more about the [Safe transaction properties](https://docs.gnosis.io/safe/docs/contracts_tx_execution/). + +```js +const transactions: SafeTransactionDataPartial[] = [ + { + to: '0x
', + data: '0x', + value: '' + }, + // ... +] +const safeTransaction = await safeSdk.createTransaction(...transactions) +``` + +### getTransactionHash + +Returns the transaction hash of a Safe transaction. + +```js +const transactions: SafeTransactionDataPartial[] = [{ + // ... +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +const txHash = await safeSdk.getTransactionHash(safeTransaction) +``` + +### signTransactionHash + +Signs a hash using the current signer account. + +```js +const transactions: SafeTransactionDataPartial[] = [{ + // ... +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +const txHash = await safeSdk.getTransactionHash(safeTransaction) +const signature = await safeSdk.signTransactionHash(txHash) +``` + +### signTransaction + +Adds the signature of the current signer to the Safe transaction object. + +```js +const transactions: SafeTransactionDataPartial[] = [{ + // ... +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +await safeSdk.signTransaction(safeTransaction) +``` + +### approveTransactionHash + +Approves on-chain a hash using the current signer account. + +```js +const transactions: SafeTransactionDataPartial[] = [{ + // ... +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +const txHash = await safeSdk.getTransactionHash(safeTransaction) +const txResponse = await safeSdk.approveTransactionHash(txHash) +await txResponse.wait() +``` + +### getOwnersWhoApprovedTx + +Returns a list of owners who have approved a specific Safe transaction. + +```js +const transactions: SafeTransactionDataPartial[] = [{ + // ... +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +const txHash = await safeSdk.getTransactionHash(safeTransaction) +const owners = await safeSdk.getOwnersWhoApprovedTx(txHash) +``` + +### getEnableModuleTx + +Returns a Safe transaction ready to be signed that will enable a Safe module. + +```js +const safeTransaction = await safeSdk.getEnableModuleTx(moduleAddress) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +### getDisableModuleTx + +Returns a Safe transaction ready to be signed that will disable a Safe module. + +```js +const safeTransaction = await safeSdk.getDisableModuleTx(moduleAddress) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +### getAddOwnerTx + +Returns the Safe transaction to add an owner and update the threshold. + +```js +const safeTransaction = await safeSdk.getAddOwnerTx(newOwnerAddress, newThreshold) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +If `threshold` is not provided, the current threshold will not change. + +```js +const safeTransaction = await safeSdk.getAddOwnerTx(newOwnerAddress) +``` + +### getRemoveOwnerTx + +Returns the Safe transaction to remove an owner and update the threshold. + +```js +const safeTransaction = await safeSdk.getRemoveOwnerTx(ownerAddress, newThreshold) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +If `threshold` is not provided, the current threshold will be decreased by one. + +```js +const safeTransaction = await safeSdk.getRemoveOwnerTx(ownerAddress) +``` + +### getSwapOwnerTx + +Returns the Safe transaction to replace an owner of the Safe with a new one. + +```js +const safeTransaction = await safeSdk.getSwapOwnerTx(oldOwnerAddress, newOwnerAddress) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +### getChangeThresholdTx + +Returns the Safe transaction to change the threshold. + +```js +const safeTransaction = await safeSdk.getChangeThresholdTx(newThreshold) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +### executeTransaction + +Executes a Safe transaction. + +```js +const transactions: SafeTransactionDataPartial[] = [{ + // ... +}] +const safeTransaction = await safeSdk.createTransaction(...transactions) +const txResponse = await safeSdk.executeTransaction(safeTransaction) +await txResponse.wait() +``` + +## License + +This library is released under MIT. + +## Contributors + +- Germán Martínez ([germartinez](https://github.com/germartinez)) diff --git a/contracts/Deps.sol b/packages/safe-core-sdk/contracts/Deps.sol similarity index 70% rename from contracts/Deps.sol rename to packages/safe-core-sdk/contracts/Deps.sol index ea762d1ef..29f702a84 100644 --- a/contracts/Deps.sol +++ b/packages/safe-core-sdk/contracts/Deps.sol @@ -2,5 +2,7 @@ pragma solidity >=0.5.0 <0.7.0; import { GnosisSafeProxyFactory } from "@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol"; import { GnosisSafe } from "@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol"; +import { MultiSend } from "@gnosis.pm/safe-contracts/contracts/libraries/MultiSend.sol"; import { DailyLimitModule } from "@gnosis.pm/safe-contracts/contracts/modules/DailyLimitModule.sol"; import { SocialRecoveryModule } from "@gnosis.pm/safe-contracts/contracts/modules/SocialRecoveryModule.sol"; +import { ERC20Mintable } from "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol"; diff --git a/hardhat.config.ts b/packages/safe-core-sdk/hardhat.config.ts similarity index 100% rename from hardhat.config.ts rename to packages/safe-core-sdk/hardhat.config.ts diff --git a/hardhat/deploy/deploy-contracts.ts b/packages/safe-core-sdk/hardhat/deploy/deploy-contracts.ts similarity index 80% rename from hardhat/deploy/deploy-contracts.ts rename to packages/safe-core-sdk/hardhat/deploy/deploy-contracts.ts index 14d4f9ca5..f016a79f4 100644 --- a/hardhat/deploy/deploy-contracts.ts +++ b/packages/safe-core-sdk/hardhat/deploy/deploy-contracts.ts @@ -20,6 +20,13 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { deterministicDeployment: true }) + await deploy('MultiSend', { + from: deployer, + args: [], + log: true, + deterministicDeployment: true + }) + await deploy('DailyLimitModule', { from: deployer, args: [], @@ -33,6 +40,12 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { log: true, deterministicDeployment: true }) + + await deploy('ERC20Mintable', { + from: deployer, + args: [], + log: true + }) } export default deploy diff --git a/packages/safe-core-sdk/package.json b/packages/safe-core-sdk/package.json new file mode 100644 index 000000000..dd52c7c3b --- /dev/null +++ b/packages/safe-core-sdk/package.json @@ -0,0 +1,87 @@ +{ + "name": "@gnosis.pm/safe-core-sdk", + "version": "0.1.1", + "description": "Safe Core SDK", + "main": "dist/src/index.js", + "typings": "dist/src/index.d.ts", + "keywords": [ + "Ethereum", + "Gnosis", + "Safe", + "SDK" + ], + "scripts": { + "build": "yarn rimraf dist && hardhat compile && tsc", + "test:ganache": "export TEST_NETWORK=ganache && hardhat --network localhost deploy && nyc hardhat --network localhost test", + "test": "hardhat deploy && nyc hardhat test", + "coverage": "nyc report --reporter=text-lcov | coveralls", + "format": "prettier --write \"{src,tests,hardhat}/**/*.ts\"", + "lint": "tslint -p tsconfig.json" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/gnosis/safe-core-sdk.git" + }, + "author": "Gnosis (https://gnosis.io)", + "license": "MIT", + "bugs": { + "url": "https://github.com/gnosis/safe-core-sdk/issues" + }, + "files": [ + "dist/**/*", + "README.md" + ], + "homepage": "https://github.com/gnosis/safe-core-sdk#readme", + "devDependencies": { + "@gnosis.pm/safe-contracts": "^1.2.0", + "@nomiclabs/hardhat-ethers": "^2.0.2", + "@nomiclabs/hardhat-waffle": "^2.0.1", + "@nomiclabs/hardhat-web3": "^2.0.0", + "@typechain/ethers-v5": "^6.0.5", + "@types/chai": "^4.2.18", + "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "^8.2.2", + "@types/node": "^15.3.0", + "@types/yargs": "^16.0.1", + "@typescript-eslint/eslint-plugin": "^4.23.0", + "@typescript-eslint/parser": "^4.23.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "coveralls": "^3.1.0", + "dotenv": "^9.0.2", + "eslint": "^7.26.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^3.4.0", + "ethereum-waffle": "^3.3.0", + "ethers": "^5.1.4", + "hardhat": "^2.3.0", + "hardhat-deploy": "^0.7.5", + "hardhat-typechain": "^0.3.5", + "husky": "^6.0.0", + "lerna": "^4.0.0", + "lint-staged": "^10.5.4", + "mocha": "^8.4.0", + "nyc": "^15.1.0", + "prettier": "^2.3.0", + "rimraf": "^3.0.2", + "ts-generator": "^0.1.1", + "ts-node": "^9.1.1", + "typechain": "^4.0.3", + "typescript": "^4.2.4", + "yargs": "^17.0.1" + }, + "lint-staged": { + "src/**/!(*test).ts": [ + "yarn lint", + "prettier --write" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "dependencies": { + "ethereumjs-util": "^7.0.10" + } +} diff --git a/src/EthersSafe.ts b/packages/safe-core-sdk/src/EthersSafe.ts similarity index 72% rename from src/EthersSafe.ts rename to packages/safe-core-sdk/src/EthersSafe.ts index f7dfd3a09..474d3c323 100644 --- a/src/EthersSafe.ts +++ b/packages/safe-core-sdk/src/EthersSafe.ts @@ -1,20 +1,26 @@ import { Provider } from '@ethersproject/providers' import { BigNumber, ContractTransaction, Signer } from 'ethers' -import { GnosisSafe } from '../typechain' -import SafeAbi from './abis/SafeAbiV1-2-0.json' +import ContractManager from './managers/contractManager' import ModuleManager from './managers/moduleManager' import OwnerManager from './managers/ownerManager' -import Safe from './Safe' +import Safe, { ConnectEthersSafeConfig, EthersSafeConfig } from './Safe' import { sameString } from './utils' import { generatePreValidatedSignature, generateSignature } from './utils/signatures' import { SafeSignature } from './utils/signatures/SafeSignature' import { estimateGasForTransactionExecution } from './utils/transactions/gas' -import SafeTransaction, { SafeTransactionDataPartial } from './utils/transactions/SafeTransaction' -import { standardizeSafeTransaction } from './utils/transactions/utils' +import SafeTransaction, { + OperationType, + SafeTransactionDataPartial +} from './utils/transactions/SafeTransaction' +import { + encodeMultiSendData, + standardizeMetaTransactionData, + standardizeSafeTransactionData +} from './utils/transactions/utils' class EthersSafe implements Safe { - #safeContract!: GnosisSafe #ethers: any + #contractManager!: ContractManager #ownerManager!: OwnerManager #moduleManager!: ModuleManager #provider!: Provider @@ -22,36 +28,37 @@ class EthersSafe implements Safe { /** * Creates an instance of the Safe Core SDK. - * - * @param ethers - Ethers v5 library - * @param safeAddress - The address of the Safe account to use - * @param providerOrSigner - Ethers provider or signer. If this parameter is not passed, Ethers defaultProvider will be used. + * @param config - Ethers Safe configuration * @returns The Safe Core SDK instance + * @throws "Safe contracts not found in the current network" + * @throws "Safe Proxy contract is not deployed in the current network" + * @throws "MultiSend contract is not deployed in the current network" */ - static async create( - ethers: any, - safeAddress: string, - providerOrSigner?: Provider | Signer - ): Promise { + static async create({ + ethers, + safeAddress, + providerOrSigner, + contractNetworks + }: EthersSafeConfig): Promise { const safeSdk = new EthersSafe() - await safeSdk.init(ethers, safeAddress, providerOrSigner) + await safeSdk.init({ ethers, safeAddress, providerOrSigner, contractNetworks }) return safeSdk } /** * Initializes the Safe Core SDK instance. - * - * @param ethers - Ethers v5 library - * @param safeAddress - The address of the Safe account to use - * @param providerOrSigner - Ethers provider or signer. If this parameter is not passed, Ethers defaultProvider will be used. + * @param config - Ethers Safe configuration * @throws "Signer must be connected to a provider" - * @throws "Safe contract is not deployed in the current network" + * @throws "Safe contracts not found in the current network" + * @throws "Safe Proxy contract is not deployed in the current network" + * @throws "MultiSend contract is not deployed in the current network" */ - private async init( - ethers: any, - safeAddress: string, - providerOrSigner?: Provider | Signer - ): Promise { + private async init({ + ethers, + safeAddress, + providerOrSigner, + contractNetworks + }: EthersSafeConfig): Promise { const currentProviderOrSigner = providerOrSigner || (ethers.getDefaultProvider() as Provider) if (Signer.isSigner(currentProviderOrSigner)) { if (!currentProviderOrSigner.provider) { @@ -63,28 +70,38 @@ class EthersSafe implements Safe { this.#provider = currentProviderOrSigner this.#signer = undefined } - const safeContractCode = await this.#provider.getCode(safeAddress) - if (safeContractCode === '0x') { - throw new Error('Safe contract is not deployed in the current network') - } this.#ethers = ethers - this.#safeContract = new this.#ethers.Contract(safeAddress, SafeAbi, currentProviderOrSigner) - this.#ownerManager = new OwnerManager(this.#ethers, this.#safeContract) - this.#moduleManager = new ModuleManager(this.#ethers, this.#safeContract) + const chainId = await this.getChainId() + this.#contractManager = await ContractManager.create( + this.#ethers, + safeAddress, + chainId, + currentProviderOrSigner, + this.#provider, + contractNetworks + ) + this.#ownerManager = new OwnerManager(this.#ethers, this.#contractManager.safeContract) + this.#moduleManager = new ModuleManager(this.#ethers, this.#contractManager.safeContract) } /** * Returns a new instance of the Safe Core SDK connecting the providerOrSigner and the safeAddress. - * - * @param providerOrSigner - Ethers provider or signer - * @param safeAddress - The address of the Safe account to use + * @param config - Connect Ethers Safe configuration + * @throws "Safe contracts not found in the current network" + * @throws "Safe Proxy contract is not deployed in the current network" + * @throws "MultiSend contract is not deployed in the current network" */ - async connect(providerOrSigner: Provider | Signer, safeAddress?: string): Promise { - return await EthersSafe.create( - this.#ethers, - safeAddress || this.#safeContract.address, - providerOrSigner - ) + async connect({ + providerOrSigner, + safeAddress, + contractNetworks + }: ConnectEthersSafeConfig): Promise { + return await EthersSafe.create({ + ethers: this.#ethers, + safeAddress: safeAddress || this.getAddress(), + providerOrSigner, + contractNetworks + }) } /** @@ -111,7 +128,16 @@ class EthersSafe implements Safe { * @returns The address of the Safe Proxy contract */ getAddress(): string { - return this.#safeContract.address + return this.#contractManager.safeContract.address + } + + /** + * Returns the address of the MultiSend contract. + * + * @returns The address of the MultiSend contract + */ + getMultiSendAddress(): string { + return this.#contractManager.multiSendContract.address } /** @@ -120,7 +146,7 @@ class EthersSafe implements Safe { * @returns The Safe Master Copy contract version */ async getContractVersion(): Promise { - return this.#safeContract.VERSION() + return this.#contractManager.safeContract.VERSION() } /** @@ -138,7 +164,7 @@ class EthersSafe implements Safe { * @returns The Safe nonce */ async getNonce(): Promise { - return (await this.#safeContract.nonce()).toNumber() + return (await this.#contractManager.safeContract.nonce()).toNumber() } /** @@ -200,12 +226,33 @@ class EthersSafe implements Safe { /** * Returns a Safe transaction ready to be signed by the owners. * - * @param safeTransaction - The minimum required data to create the transaction + * @param safeTransactions - The list of transactions to process * @returns The Safe transaction */ - async createTransaction(tx: SafeTransactionDataPartial): Promise { - const safeTransaction = await standardizeSafeTransaction(this.#safeContract, tx) - return new SafeTransaction(safeTransaction) + async createTransaction( + ...safeTransactions: SafeTransactionDataPartial[] + ): Promise { + if (safeTransactions.length === 1) { + const standardizedTransaction = await standardizeSafeTransactionData( + this.#contractManager.safeContract, + safeTransactions[0] + ) + return new SafeTransaction(standardizedTransaction) + } + const multiSendData = encodeMultiSendData(safeTransactions.map(standardizeMetaTransactionData)) + const multiSendTransaction = { + to: this.#contractManager.multiSendContract.address, + value: '0', + data: this.#contractManager.multiSendContract.interface.encodeFunctionData('multiSend', [ + multiSendData + ]), + operation: OperationType.DelegateCall + } + const standardizedTransaction = await standardizeSafeTransactionData( + this.#contractManager.safeContract, + multiSendTransaction + ) + return new SafeTransaction(standardizedTransaction) } /** @@ -216,7 +263,7 @@ class EthersSafe implements Safe { */ async getTransactionHash(safeTransaction: SafeTransaction): Promise { const safeTransactionData = safeTransaction.data - const txHash = await this.#safeContract.getTransactionHash( + const txHash = await this.#contractManager.safeContract.getTransactionHash( safeTransactionData.to, safeTransactionData.value, safeTransactionData.data, @@ -269,8 +316,7 @@ class EthersSafe implements Safe { * Approves on-chain a hash using the current signer account. * * @param hash - The hash to approve - * @param skipOnChainApproval - TRUE to avoid the Safe transaction to be approved on-chain - * @returns The pre-validated signature + * @returns The Safe transaction response * @throws "No signer provided" * @throws "Transaction hashes can only be approved by Safe owners" */ @@ -286,7 +332,7 @@ class EthersSafe implements Safe { if (!addressIsOwner) { throw new Error('Transaction hashes can only be approved by Safe owners') } - return this.#safeContract.approveHash(hash) + return this.#contractManager.safeContract.approveHash(hash) } /** @@ -299,7 +345,7 @@ class EthersSafe implements Safe { const owners = await this.getOwners() let ownersWhoApproved: string[] = [] for (const owner of owners) { - const approved = await this.#safeContract.approvedHashes(owner, txHash) + const approved = await this.#contractManager.safeContract.approvedHashes(owner, txHash) if (approved.gt(0)) { ownersWhoApproved.push(owner) } @@ -316,32 +362,29 @@ class EthersSafe implements Safe { * @throws "Module provided is already enabled" */ async getEnableModuleTx(moduleAddress: string): Promise { - const tx = await this.createTransaction({ + const safeTransaction = await this.createTransaction({ to: this.getAddress(), value: '0', - data: await this.#moduleManager.encodeEnableModuleData(moduleAddress), - nonce: (await this.#safeContract.nonce()).toNumber() + data: await this.#moduleManager.encodeEnableModuleData(moduleAddress) }) - return tx + return safeTransaction } /** * Returns the Safe transaction to disable a Safe module. * * @param moduleAddress - The desired module address - * @param params - Contract method name and specific parameters * @returns The Safe transaction ready to be signed * @throws "Invalid module address provided" * @throws "Module provided is not enabled already" */ async getDisableModuleTx(moduleAddress: string): Promise { - const tx = await this.createTransaction({ + const safeTransaction = await this.createTransaction({ to: this.getAddress(), value: '0', - data: await this.#moduleManager.encodeDisableModuleData(moduleAddress), - nonce: (await this.#safeContract.nonce()).toNumber() + data: await this.#moduleManager.encodeDisableModuleData(moduleAddress) }) - return tx + return safeTransaction } /** @@ -356,13 +399,12 @@ class EthersSafe implements Safe { * @throws "Threshold cannot exceed owner count" */ async getAddOwnerTx(ownerAddress: string, threshold?: number): Promise { - const tx = await this.createTransaction({ + const safeTransaction = await this.createTransaction({ to: this.getAddress(), value: '0', - data: await this.#ownerManager.encodeAddOwnerWithThresholdData(ownerAddress, threshold), - nonce: (await this.#safeContract.nonce()).toNumber() + data: await this.#ownerManager.encodeAddOwnerWithThresholdData(ownerAddress, threshold) }) - return tx + return safeTransaction } /** @@ -377,13 +419,12 @@ class EthersSafe implements Safe { * @throws "Threshold cannot exceed owner count" */ async getRemoveOwnerTx(ownerAddress: string, threshold?: number): Promise { - const tx = await this.createTransaction({ + const safeTransaction = await this.createTransaction({ to: this.getAddress(), value: '0', - data: await this.#ownerManager.encodeRemoveOwnerData(ownerAddress, threshold), - nonce: (await this.#safeContract.nonce()).toNumber() + data: await this.#ownerManager.encodeRemoveOwnerData(ownerAddress, threshold) }) - return tx + return safeTransaction } /** @@ -398,13 +439,12 @@ class EthersSafe implements Safe { * @throws "Old address provided is not an owner" */ async getSwapOwnerTx(oldOwnerAddress: string, newOwnerAddress: string): Promise { - const tx = await this.createTransaction({ + const safeTransaction = await this.createTransaction({ to: this.getAddress(), value: '0', - data: await this.#ownerManager.encodeSwapOwnerData(oldOwnerAddress, newOwnerAddress), - nonce: (await this.#safeContract.nonce()).toNumber() + data: await this.#ownerManager.encodeSwapOwnerData(oldOwnerAddress, newOwnerAddress) }) - return tx + return safeTransaction } /** @@ -416,20 +456,18 @@ class EthersSafe implements Safe { * @throws "Threshold cannot exceed owner count" */ async getChangeThresholdTx(threshold: number): Promise { - const tx = await this.createTransaction({ + const safeTransaction = await this.createTransaction({ to: this.getAddress(), value: '0', - data: await this.#ownerManager.encodeChangeThresholdData(threshold), - nonce: (await this.#safeContract.nonce()).toNumber() + data: await this.#ownerManager.encodeChangeThresholdData(threshold) }) - return tx + return safeTransaction } /** * Executes a Safe transaction. * * @param safeTransaction - The Safe transaction to execute - * @param options - Execution configuration options * @returns The Safe transaction response * @throws "No signer provided" * @throws "There are X signatures missing" @@ -461,11 +499,11 @@ class EthersSafe implements Safe { } const gasLimit = await estimateGasForTransactionExecution( - this.#safeContract, + this.#contractManager.safeContract, await this.#signer.getAddress(), safeTransaction ) - const txResponse = await this.#safeContract.execTransaction( + const txResponse = await this.#contractManager.safeContract.execTransaction( safeTransaction.data.to, safeTransaction.data.value, safeTransaction.data.data, diff --git a/src/Safe.ts b/packages/safe-core-sdk/src/Safe.ts similarity index 62% rename from src/Safe.ts rename to packages/safe-core-sdk/src/Safe.ts index b98563599..1fbd1b182 100644 --- a/src/Safe.ts +++ b/packages/safe-core-sdk/src/Safe.ts @@ -1,23 +1,45 @@ import { Provider } from '@ethersproject/providers' import { BigNumber, ContractTransaction, Signer } from 'ethers' +import { ContractNetworksConfig } from './configuration/contracts' import { SafeSignature } from './utils/signatures/SafeSignature' import SafeTransaction, { SafeTransactionDataPartial } from './utils/transactions/SafeTransaction' +export interface EthersSafeConfig { + /** ethers - Ethers v5 library */ + ethers: any + /** safeAddress - The address of the Safe account to use */ + safeAddress: string + /** providerOrSigner - Ethers provider or signer */ + providerOrSigner?: Provider | Signer + /** contractNetworks - Contract network configuration */ + contractNetworks?: ContractNetworksConfig +} + +export interface ConnectEthersSafeConfig { + /** providerOrSigner - Ethers provider or signer */ + providerOrSigner: Provider | Signer + /** safeAddress - The address of the Safe account to use */ + safeAddress?: string + /** contractNetworks - Contract network configuration */ + contractNetworks?: ContractNetworksConfig +} + interface Safe { - connect(providerOrSigner: Provider | Signer, safeAddress?: string): void + connect({ providerOrSigner, safeAddress, contractNetworks }: ConnectEthersSafeConfig): void getProvider(): Provider getSigner(): Signer | undefined getAddress(): string + getMultiSendAddress(): string getContractVersion(): Promise - getOwners(): Promise getNonce(): Promise + getOwners(): Promise getThreshold(): Promise getChainId(): Promise getBalance(): Promise getModules(): Promise isModuleEnabled(moduleAddress: string): Promise isOwner(ownerAddress: string): Promise - createTransaction(safeTransaction: SafeTransactionDataPartial): Promise + createTransaction(...safeTransactions: SafeTransactionDataPartial[]): Promise getTransactionHash(safeTransaction: SafeTransaction): Promise signTransactionHash(hash: string): Promise signTransaction(safeTransaction: SafeTransaction): Promise diff --git a/packages/safe-core-sdk/src/abis/MultiSendAbi.json b/packages/safe-core-sdk/src/abis/MultiSendAbi.json new file mode 100644 index 000000000..d47e79d3f --- /dev/null +++ b/packages/safe-core-sdk/src/abis/MultiSendAbi.json @@ -0,0 +1,17 @@ +[ + { + "constant": false, + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + } + ], + "name": "multiSend", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/src/abis/SafeAbiV1-2-0.json b/packages/safe-core-sdk/src/abis/SafeAbiV1-2-0.json similarity index 100% rename from src/abis/SafeAbiV1-2-0.json rename to packages/safe-core-sdk/src/abis/SafeAbiV1-2-0.json diff --git a/packages/safe-core-sdk/src/configuration/contracts.ts b/packages/safe-core-sdk/src/configuration/contracts.ts new file mode 100644 index 000000000..b157fc3f0 --- /dev/null +++ b/packages/safe-core-sdk/src/configuration/contracts.ts @@ -0,0 +1,40 @@ +interface ContractNetworkConfig { + /** multiSendAddress - Address of the MultiSend contract deployed in a specific network id */ + multiSendAddress: string +} + +export interface ContractNetworksConfig { + /** id - Network id */ + [id: string]: ContractNetworkConfig +} + +export const defaultContractNetworks: ContractNetworksConfig = { + // mainnet + 1: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + }, + // rinkeby + 4: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + }, + // goerli + 5: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + }, + // kovan + 42: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + }, + // xdai + 100: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + }, + // energy web chain + 246: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + }, + // energy web volta + 73799: { + multiSendAddress: '0x8D29bE29923b68abfDD21e541b9374737B49cdAD' + } +} diff --git a/packages/safe-core-sdk/src/index.ts b/packages/safe-core-sdk/src/index.ts new file mode 100644 index 000000000..8c64f0fa8 --- /dev/null +++ b/packages/safe-core-sdk/src/index.ts @@ -0,0 +1,16 @@ +import { ContractNetworksConfig } from './configuration/contracts' +import EthersSafe from './EthersSafe' +import Safe, { ConnectEthersSafeConfig, EthersSafeConfig } from './Safe' +import { SafeSignature } from './utils/signatures/SafeSignature' +import SafeTransaction, { SafeTransactionDataPartial } from './utils/transactions/SafeTransaction' + +export default EthersSafe +export { + Safe, + EthersSafeConfig, + ConnectEthersSafeConfig, + SafeSignature, + SafeTransactionDataPartial, + SafeTransaction, + ContractNetworksConfig +} diff --git a/packages/safe-core-sdk/src/managers/contractManager.ts b/packages/safe-core-sdk/src/managers/contractManager.ts new file mode 100644 index 000000000..5aa48edc2 --- /dev/null +++ b/packages/safe-core-sdk/src/managers/contractManager.ts @@ -0,0 +1,72 @@ +import { Provider } from '@ethersproject/providers' +import { Signer } from 'ethers' +import { GnosisSafe, MultiSend } from '../../typechain' +import MultiSendAbi from '../abis/MultiSendAbi.json' +import SafeAbiV120 from '../abis/SafeAbiV1-2-0.json' +import { ContractNetworksConfig, defaultContractNetworks } from '../configuration/contracts' + +class ContractManager { + #safeContract!: GnosisSafe + #multiSendContract!: MultiSend + + static async create( + ethers: any, + safeAddress: string, + chainId: number, + currentProviderOrSigner: Provider | Signer, + provider: Provider, + contractNetworks?: ContractNetworksConfig + ) { + const safeSdk = new ContractManager() + await safeSdk.init( + ethers, + safeAddress, + chainId, + currentProviderOrSigner, + provider, + contractNetworks + ) + return safeSdk + } + + async init( + ethers: any, + safeAddress: string, + chainId: number, + currentProviderOrSigner: Provider | Signer, + provider: Provider, + contractNetworks?: ContractNetworksConfig + ) { + const contractNetworksConfig = { ...defaultContractNetworks, ...contractNetworks } + const contracts = contractNetworksConfig[chainId] + if (!contracts) { + throw new Error('Safe contracts not found in the current network') + } + + const safeContractCode = await provider.getCode(safeAddress) + if (safeContractCode === '0x') { + throw new Error('Safe Proxy contract is not deployed in the current network') + } + this.#safeContract = new ethers.Contract(safeAddress, SafeAbiV120, currentProviderOrSigner) + + const multiSendContractCode = await provider.getCode(contracts.multiSendAddress) + if (multiSendContractCode === '0x') { + throw new Error('MultiSend contract is not deployed in the current network') + } + this.#multiSendContract = new ethers.Contract( + contracts.multiSendAddress, + MultiSendAbi, + currentProviderOrSigner + ) + } + + get safeContract() { + return this.#safeContract + } + + get multiSendContract() { + return this.#multiSendContract + } +} + +export default ContractManager diff --git a/src/managers/moduleManager.ts b/packages/safe-core-sdk/src/managers/moduleManager.ts similarity index 100% rename from src/managers/moduleManager.ts rename to packages/safe-core-sdk/src/managers/moduleManager.ts diff --git a/src/managers/ownerManager.ts b/packages/safe-core-sdk/src/managers/ownerManager.ts similarity index 98% rename from src/managers/ownerManager.ts rename to packages/safe-core-sdk/src/managers/ownerManager.ts index 5f048c76a..ead05bf29 100644 --- a/src/managers/ownerManager.ts +++ b/packages/safe-core-sdk/src/managers/ownerManager.ts @@ -53,7 +53,8 @@ class OwnerManager { } async getOwners(): Promise { - return this.#safeContract.getOwners() + const owners = await this.#safeContract.getOwners() + return [...owners] } async getThreshold(): Promise { diff --git a/src/utils/constants.ts b/packages/safe-core-sdk/src/utils/constants.ts similarity index 100% rename from src/utils/constants.ts rename to packages/safe-core-sdk/src/utils/constants.ts diff --git a/src/utils/index.ts b/packages/safe-core-sdk/src/utils/index.ts similarity index 100% rename from src/utils/index.ts rename to packages/safe-core-sdk/src/utils/index.ts diff --git a/src/utils/signatures/SafeSignature.ts b/packages/safe-core-sdk/src/utils/signatures/SafeSignature.ts similarity index 100% rename from src/utils/signatures/SafeSignature.ts rename to packages/safe-core-sdk/src/utils/signatures/SafeSignature.ts diff --git a/src/utils/signatures/index.ts b/packages/safe-core-sdk/src/utils/signatures/index.ts similarity index 100% rename from src/utils/signatures/index.ts rename to packages/safe-core-sdk/src/utils/signatures/index.ts diff --git a/src/utils/transactions/SafeTransaction.ts b/packages/safe-core-sdk/src/utils/transactions/SafeTransaction.ts similarity index 89% rename from src/utils/transactions/SafeTransaction.ts rename to packages/safe-core-sdk/src/utils/transactions/SafeTransaction.ts index 934d475cb..0c3ced492 100644 --- a/src/utils/transactions/SafeTransaction.ts +++ b/packages/safe-core-sdk/src/utils/transactions/SafeTransaction.ts @@ -5,10 +5,14 @@ export enum OperationType { DelegateCall // 1 } -export interface SafeTransactionData { +export interface MetaTransactionData { readonly to: string readonly value: string readonly data: string + readonly operation?: OperationType +} + +export interface SafeTransactionData extends MetaTransactionData { readonly operation: OperationType readonly safeTxGas: number readonly baseGas: number @@ -18,11 +22,7 @@ export interface SafeTransactionData { readonly nonce: number } -export interface SafeTransactionDataPartial { - readonly to: string - readonly value: string - readonly data: string - readonly operation?: OperationType +export interface SafeTransactionDataPartial extends MetaTransactionData { readonly safeTxGas?: number readonly baseGas?: number readonly gasPrice?: number diff --git a/src/utils/transactions/gas.ts b/packages/safe-core-sdk/src/utils/transactions/gas.ts similarity index 73% rename from src/utils/transactions/gas.ts rename to packages/safe-core-sdk/src/utils/transactions/gas.ts index 5be632f6c..69a988cdd 100644 --- a/src/utils/transactions/gas.ts +++ b/packages/safe-core-sdk/src/utils/transactions/gas.ts @@ -1,8 +1,8 @@ import { BigNumber } from 'ethers' import { GnosisSafe } from '../../../typechain' -import SafeTransaction from './SafeTransaction' +import SafeTransaction, { OperationType } from './SafeTransaction' -function estimateDataGasCosts(data: any): number { +function estimateDataGasCosts(data: string): number { const reducer = (accumulator: number, currentValue: string) => { if (currentValue === '0x') { return accumulator + 0 @@ -12,27 +12,27 @@ function estimateDataGasCosts(data: any): number { } return accumulator + 16 } - return data.match(/.{2}/g).reduce(reducer, 0) + return (data.match(/.{2}/g) as string[]).reduce(reducer, 0) } export async function estimateTxGas( - contract: GnosisSafe, + safeContract: GnosisSafe, to: string, valueInWei: string, data: string, - operation: number + operation: OperationType ): Promise { let txGasEstimation = 0 - const safeAddress = contract.address + const safeAddress = safeContract.address - const estimateData: string = contract.interface.encodeFunctionData('requiredTxGas', [ + const estimateData: string = safeContract.interface.encodeFunctionData('requiredTxGas', [ to, valueInWei, data, operation ]) try { - const estimateResponse = await contract.provider.call( + const estimateResponse = await safeContract.provider.call( { to: safeAddress, from: safeAddress, @@ -48,7 +48,7 @@ export async function estimateTxGas( let additionalGas = 10000 for (let i = 0; i < 10; i++) { try { - const estimateResponse = await contract.provider.call({ + const estimateResponse = await safeContract.provider.call({ to: safeAddress, from: safeAddress, data: estimateData, @@ -66,7 +66,7 @@ export async function estimateTxGas( } try { - const estimateGas = await contract.provider.estimateGas({ + const estimateGas = await safeContract.provider.estimateGas({ to, from: safeAddress, value: valueInWei, @@ -74,17 +74,20 @@ export async function estimateTxGas( }) return estimateGas.toNumber() } catch (error) { + if (operation === OperationType.DelegateCall) { + return 0 + } return Promise.reject(error) } } export async function estimateGasForTransactionExecution( - contract: any, + safeContract: GnosisSafe, from: string, tx: SafeTransaction ): Promise { try { - const gas = await contract.estimateGas.execTransaction( + const gas = await safeContract.estimateGas.execTransaction( tx.data.to, tx.data.value, tx.data.data, diff --git a/packages/safe-core-sdk/src/utils/transactions/utils.ts b/packages/safe-core-sdk/src/utils/transactions/utils.ts new file mode 100644 index 000000000..c2fa09e75 --- /dev/null +++ b/packages/safe-core-sdk/src/utils/transactions/utils.ts @@ -0,0 +1,65 @@ +import { utils } from 'ethers' +import { GnosisSafe } from '../../../typechain' +import { ZERO_ADDRESS } from '../constants' +import { estimateTxGas } from './gas' +import { + MetaTransactionData, + OperationType, + SafeTransactionData, + SafeTransactionDataPartial +} from './SafeTransaction' + +export function standardizeMetaTransactionData( + tx: SafeTransactionDataPartial +): MetaTransactionData { + const standardizedTxs: MetaTransactionData = { + to: tx.to, + value: tx.value, + data: tx.data, + operation: tx.operation ?? OperationType.Call + } + return standardizedTxs +} + +export async function standardizeSafeTransactionData( + safeContract: GnosisSafe, + tx: SafeTransactionDataPartial +): Promise { + const standardizedTxs = { + to: tx.to, + value: tx.value, + data: tx.data, + operation: tx.operation ?? OperationType.Call, + baseGas: tx.baseGas ?? 0, + gasPrice: tx.gasPrice ?? 0, + gasToken: tx.gasToken || ZERO_ADDRESS, + refundReceiver: tx.refundReceiver || ZERO_ADDRESS, + nonce: tx.nonce ?? (await safeContract.nonce()).toNumber() + } + const safeTxGas = + tx.safeTxGas ?? + (await estimateTxGas( + safeContract, + standardizedTxs.to, + standardizedTxs.value, + standardizedTxs.data, + standardizedTxs.operation + )) + return { + ...standardizedTxs, + safeTxGas + } +} + +function encodeMetaTransaction(tx: MetaTransactionData): string { + const data = utils.arrayify(tx.data) + const encoded = utils.solidityPack( + ['uint8', 'address', 'uint256', 'uint256', 'bytes'], + [tx.operation, tx.to, tx.value, data.length, data] + ) + return encoded.slice(2) +} + +export function encodeMultiSendData(txs: MetaTransactionData[]): string { + return '0x' + txs.map((tx) => encodeMetaTransaction(tx)).join('') +} diff --git a/packages/safe-core-sdk/tests/contract-manager.test.ts b/packages/safe-core-sdk/tests/contract-manager.test.ts new file mode 100644 index 000000000..081d271b5 --- /dev/null +++ b/packages/safe-core-sdk/tests/contract-manager.test.ts @@ -0,0 +1,97 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { deployments, ethers, waffle } from 'hardhat' +import EthersSafe from '../src' +import { ContractNetworksConfig, defaultContractNetworks } from '../src/configuration/contracts' +import { ZERO_ADDRESS } from '../src/utils/constants' +import { getAccounts } from './utils/setupConfig' +import { getMultiSend, getSafeWithOwners } from './utils/setupContracts' +chai.use(chaiAsPromised) + +describe('Safe contracts manager', () => { + const setupTests = deployments.createFixture(async ({ deployments }) => { + await deployments.fixture() + const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } + return { + safe: await getSafeWithOwners([accounts[0].address]), + accounts, + contractNetworks, + chainId + } + }) + + describe('create', async () => { + it('should fail if the current network is not a default network and no contractNetworks is provided', async () => { + const { safe, accounts } = await setupTests() + const [account1] = accounts + await chai + .expect( + EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider + }) + ) + .to.be.rejectedWith('Safe contracts not found in the current network') + }) + + it('should fail if Safe Proxy contract is not deployed in the current network', async () => { + const { accounts, contractNetworks } = await setupTests() + const [account1] = accounts + await chai + .expect( + EthersSafe.create({ + ethers, + safeAddress: ZERO_ADDRESS, + providerOrSigner: account1.signer.provider, + contractNetworks + }) + ) + .to.be.rejectedWith('Safe Proxy contract is not deployed in the current network') + }) + + it('should fail if MultiSend contract is specified in contractNetworks but not deployed', async () => { + const { safe, accounts, chainId } = await setupTests() + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: ZERO_ADDRESS } + } + const [account1] = accounts + await chai + .expect( + EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) + ) + .to.be.rejectedWith('MultiSend contract is not deployed in the current network') + }) + + it('should set default MultiSend contract', async () => { + const mainnetGnosisDAOSafe = '0x0DA0C3e52C977Ed3cBc641fF02DD271c3ED55aFe' + const safeSdk = await EthersSafe.create({ ethers, safeAddress: mainnetGnosisDAOSafe }) + chai + .expect(safeSdk.getMultiSendAddress()) + .to.be.eq(defaultContractNetworks[1].multiSendAddress) + }) + + it('should set the MultiSend contract available in the current network', async () => { + const { safe, accounts, chainId, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) + chai + .expect(safeSdk.getMultiSendAddress()) + .to.be.eq(contractNetworks[chainId].multiSendAddress) + }) + }) +}) diff --git a/tests/core.test.ts b/packages/safe-core-sdk/tests/core.test.ts similarity index 55% rename from tests/core.test.ts rename to packages/safe-core-sdk/tests/core.test.ts index eeaa8502d..0333574b5 100644 --- a/tests/core.test.ts +++ b/packages/safe-core-sdk/tests/core.test.ts @@ -3,59 +3,94 @@ import chaiAsPromised from 'chai-as-promised' import { BigNumber, VoidSigner } from 'ethers' import { deployments, ethers, waffle } from 'hardhat' import EthersSafe from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' import { getAccounts } from './utils/setupConfig' -import { getSafeWithOwners } from './utils/setupContracts' +import { getMultiSend, getSafeWithOwners } from './utils/setupContracts' chai.use(chaiAsPromised) describe('Safe Core SDK', () => { const setupTests = deployments.createFixture(async ({ deployments }) => { await deployments.fixture() const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } return { chainId: (await waffle.provider.getNetwork()).chainId, safe: await getSafeWithOwners([accounts[0].address, accounts[1].address]), - accounts + accounts, + contractNetworks } }) describe('connect', async () => { it('should fail if Safe contract is not deployed', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const mainnetGnosisDAOSafe = '0x0DA0C3e52C977Ed3cBc641fF02DD271c3ED55aFe' await chai - .expect(EthersSafe.create(ethers, mainnetGnosisDAOSafe, account1.signer.provider)) - .to.be.rejectedWith('Safe contract is not deployed in the current network') + .expect( + EthersSafe.create({ + ethers, + safeAddress: mainnetGnosisDAOSafe, + providerOrSigner: account1.signer.provider, + contractNetworks + }) + ) + .to.be.rejectedWith('Safe Proxy contract is not deployed in the current network') }) it('should fail if signer is not connected to a provider', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts const voidSigner = new VoidSigner(account1.address) await chai - .expect(EthersSafe.create(ethers, safe.address, voidSigner)) + .expect( + EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: voidSigner, + contractNetworks + }) + ) .to.be.rejectedWith('Signer must be connected to a provider') }) it('should connect with signer', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) chai.expect(safeSdk.getProvider()).to.be.eq(account1.signer.provider) chai.expect(safeSdk.getSigner()).to.be.eq(account1.signer) }) it('should connect with provider', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer.provider) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) chai.expect(safeSdk.getProvider()).to.be.eq(account1.signer.provider) chai.expect(safeSdk.getSigner()).to.be.undefined }) it('should connect to Mainnet with default provider', async () => { + const { contractNetworks } = await setupTests() const mainnetGnosisDAOSafe = '0x0DA0C3e52C977Ed3cBc641fF02DD271c3ED55aFe' - const safeSdk = await EthersSafe.create(ethers, mainnetGnosisDAOSafe) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: mainnetGnosisDAOSafe, + contractNetworks + }) const defaultProvider = safeSdk.getProvider() chai.expect(ethers.providers.Provider.isProvider(defaultProvider)).to.be.true chai.expect((await defaultProvider.getNetwork()).chainId).to.be.eq(1) @@ -65,9 +100,14 @@ describe('Safe Core SDK', () => { describe('getContractVersion', async () => { it('should return the Safe contract version', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const contractVersion = await safeSdk.getContractVersion() chai.expect(contractVersion).to.be.eq('1.2.0') }) @@ -75,19 +115,29 @@ describe('Safe Core SDK', () => { describe('getAddress', async () => { it('should return the Safe contract address', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) chai.expect(safeSdk.getAddress()).to.be.eq(safe.address) }) }) describe('getNonce', async () => { it('should return the Safe nonce', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) chai.expect(await safeSdk.getNonce()).to.be.eq(0) const tx = await safeSdk.createTransaction({ to: account2.address, @@ -102,18 +152,28 @@ describe('Safe Core SDK', () => { describe('getChainId', async () => { it('should return the chainId of the current network', async () => { - const { safe, accounts, chainId } = await setupTests() + const { safe, accounts, chainId, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) chai.expect(await safeSdk.getChainId()).to.be.eq(chainId) }) }) describe('getBalance', async () => { it('should return the balance of the Safe contract', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) chai.expect(await safeSdk.getBalance()).to.be.eq(0) await account1.signer.sendTransaction({ to: safe.address, diff --git a/packages/safe-core-sdk/tests/execution.test.ts b/packages/safe-core-sdk/tests/execution.test.ts new file mode 100644 index 000000000..92796f1eb --- /dev/null +++ b/packages/safe-core-sdk/tests/execution.test.ts @@ -0,0 +1,301 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { BigNumber } from 'ethers' +import { deployments, ethers, waffle } from 'hardhat' +import EthersSafe, { SafeTransactionDataPartial } from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' +import { getAccounts } from './utils/setupConfig' +import { getERC20Mintable, getMultiSend, getSafeWithOwners } from './utils/setupContracts' +chai.use(chaiAsPromised) + +describe('Transactions execution', () => { + const setupTests = deployments.createFixture(async ({ deployments }) => { + await deployments.fixture() + const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } + return { + erc20Mintable: await getERC20Mintable(), + safe: await getSafeWithOwners([accounts[0].address, accounts[1].address]), + accounts, + contractNetworks + } + }) + + describe('executeTransaction', async () => { + it('should fail if a provider is provided', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) + const tx = await safeSdk1.createTransaction({ + to: safe.address, + value: '0', + data: '0x' + }) + await chai.expect(safeSdk1.executeTransaction(tx)).rejectedWith('No signer provided') + }) + + it('should fail if no provider or signer is provided', async () => { + const { contractNetworks } = await setupTests() + const mainnetGnosisDAOSafe = '0x0da0c3e52c977ed3cbc641ff02dd271c3ed55afe' + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: mainnetGnosisDAOSafe, + contractNetworks + }) + const tx = await safeSdk1.createTransaction({ + to: mainnetGnosisDAOSafe, + value: '0', + data: '0x' + }) + await chai.expect(safeSdk1.executeTransaction(tx)).rejectedWith('No signer provided') + }) + + it('should fail if there are not enough signatures (1 missing)', async () => { + const { accounts, contractNetworks } = await setupTests() + const [account1 ,account2, account3] = accounts + const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ providerOrSigner: account2.signer, contractNetworks }) + const tx = await safeSdk1.createTransaction({ + to: safe.address, + value: '0', + data: '0x' + }) + await safeSdk1.signTransaction(tx) + const txHash = await safeSdk2.getTransactionHash(tx) + const txResponse = await safeSdk2.approveTransactionHash(txHash) + await txResponse.wait() + await chai + .expect(safeSdk2.executeTransaction(tx)) + .to.be.rejectedWith('There is 1 signature missing') + }) + + it('should fail if there are not enough signatures (>1 missing)', async () => { + const { accounts, contractNetworks } = await setupTests() + const [account1 ,account2, account3] = accounts + const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = await safeSdk1.createTransaction({ + to: safe.address, + value: '0', + data: '0x' + }) + await chai + .expect(safeSdk1.executeTransaction(tx)) + .to.be.rejectedWith('There are 2 signatures missing') + }) + + it('should execute a transaction with threshold 1', async () => { + const { accounts, contractNetworks } = await setupTests() + const [account1 ,account2, account3] = accounts + const safe = await getSafeWithOwners([account1.address]) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + await account1.signer.sendTransaction({ + to: safe.address, + value: BigNumber.from('1000000000000000000') // 1 ETH + }) + const safeInitialBalance = await safeSdk1.getBalance() + const tx = await safeSdk1.createTransaction({ + to: account2.address, + value: '500000000000000000', // 0.5 ETH + data: '0x' + }) + const txResponse = await safeSdk1.executeTransaction(tx) + await txResponse.wait() + const safeFinalBalance = await safeSdk1.getBalance() + chai + .expect(safeInitialBalance.toString()) + .to.be.eq(safeFinalBalance.add(BigNumber.from(tx.data.value).toString())) + }) + + it('should execute a transaction with threshold >1', async () => { + const { accounts, contractNetworks } = await setupTests() + const [account1 ,account2, account3] = accounts + const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ providerOrSigner: account2.signer, contractNetworks }) + const safeSdk3 = await safeSdk1.connect({ providerOrSigner: account3.signer, contractNetworks }) + await account1.signer.sendTransaction({ + to: safe.address, + value: BigNumber.from('1000000000000000000') // 1 ETH + }) + const safeInitialBalance = await safeSdk1.getBalance() + const tx = await safeSdk1.createTransaction({ + to: account2.address, + value: '500000000000000000', // 0.5 ETH + data: '0x' + }) + await safeSdk1.signTransaction(tx) + const txHash = await safeSdk2.getTransactionHash(tx) + const txResponse1 = await safeSdk2.approveTransactionHash(txHash) + await txResponse1.wait() + const txResponse2 = await safeSdk3.executeTransaction(tx) + await txResponse2.wait() + const safeFinalBalance = await safeSdk1.getBalance() + chai + .expect(safeInitialBalance.toString()) + .to.be.eq(safeFinalBalance.add(BigNumber.from(tx.data.value).toString())) + }) + + it('should execute a transaction when is not submitted by an owner', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1 ,account2, account3] = accounts + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ providerOrSigner: account2.signer, contractNetworks }) + const safeSdk3 = await safeSdk1.connect({ providerOrSigner: account3.signer, contractNetworks }) + await account2.signer.sendTransaction({ + to: safe.address, + value: BigNumber.from('1000000000000000000') // 1 ETH + }) + const safeInitialBalance = await safeSdk1.getBalance() + const tx = await safeSdk1.createTransaction({ + to: account2.address, + value: '500000000000000000', // 0.5 ETH + data: '0x' + }) + await safeSdk1.signTransaction(tx) + const txHash = await safeSdk2.getTransactionHash(tx) + const txResponse1 = await safeSdk2.approveTransactionHash(txHash) + await txResponse1.wait() + const txResponse2 = await safeSdk3.executeTransaction(tx) + await txResponse2.wait() + const safeFinalBalance = await safeSdk1.getBalance() + chai + .expect(safeInitialBalance.toString()) + .to.be.eq(safeFinalBalance.add(BigNumber.from(tx.data.value).toString())) + }) + }) + + describe('executeTransaction (MultiSend)', async () => { + it('should execute a batch transaction with threshold >1', async () => { + const { accounts, contractNetworks } = await setupTests() + const [account1 ,account2, account3] = accounts + const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ providerOrSigner: account2.signer, contractNetworks }) + const safeSdk3 = await safeSdk1.connect({ providerOrSigner: account3.signer, contractNetworks }) + await account1.signer.sendTransaction({ + to: safe.address, + value: BigNumber.from('2000000000000000000') // 2 ETH + }) + const safeInitialBalance = await safeSdk1.getBalance() + const txs: SafeTransactionDataPartial[] = [ + { + to: account2.address, + value: '1100000000000000000', // 1.1 ETH + data: '0x' + }, + { + to: account2.address, + value: '100000000000000000', // 0.1 ETH + data: '0x' + } + ] + const multiSendTx = await safeSdk1.createTransaction(...txs) + await safeSdk1.signTransaction(multiSendTx) + const txHash = await safeSdk2.getTransactionHash(multiSendTx) + const txResponse1 = await safeSdk2.approveTransactionHash(txHash) + await txResponse1.wait() + const txResponse2 = await safeSdk3.executeTransaction(multiSendTx) + await txResponse2.wait() + const safeFinalBalance = await safeSdk1.getBalance() + chai + .expect(safeInitialBalance.toString()) + .to.be.eq( + safeFinalBalance + .add(BigNumber.from(txs[0].value)) + .add(BigNumber.from(txs[1].value)) + .toString() + ) + }) + + it('should execute a batch transaction with contract calls and threshold >1', async () => { + const { accounts, contractNetworks, erc20Mintable } = await setupTests() + const [account1 ,account2, account3] = accounts + const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ providerOrSigner: account2.signer, contractNetworks }) + const safeSdk3 = await safeSdk1.connect({ providerOrSigner: account3.signer, contractNetworks }) + + await erc20Mintable.mint(safe.address, '1200000000000000000') // 1.2 ETH + const safeInitialERC20Balance = await erc20Mintable.balanceOf(safe.address) + chai.expect(safeInitialERC20Balance.toString()).to.be.eq('1200000000000000000') // 1.2 ETH + const accountInitialERC20Balance = await erc20Mintable.balanceOf(account2.address) + chai.expect(accountInitialERC20Balance.toString()).to.be.eq('0') // 0 ETH + + const txs: SafeTransactionDataPartial[] = [ + { + to: erc20Mintable.address, + value: '0', + data: erc20Mintable.interface.encodeFunctionData('transfer', [ + account2.address, + '1100000000000000000' // 1.1 ETH + ]) + }, + { + to: erc20Mintable.address, + value: '0', + data: erc20Mintable.interface.encodeFunctionData('transfer', [ + account2.address, + '100000000000000000' // 0.1 ETH + ]) + } + ] + const multiSendTx = await safeSdk1.createTransaction(...txs) + await safeSdk1.signTransaction(multiSendTx) + const txHash = await safeSdk2.getTransactionHash(multiSendTx) + const txResponse1 = await safeSdk2.approveTransactionHash(txHash) + await txResponse1.wait() + const txResponse2 = await safeSdk3.executeTransaction(multiSendTx) + await txResponse2.wait() + + const safeFinalERC20Balance = await erc20Mintable.balanceOf(safe.address) + chai.expect(safeFinalERC20Balance.toString()).to.be.eq('0') // 0 ETH + const accountFinalERC20Balance = await erc20Mintable.balanceOf(account2.address) + chai.expect(accountFinalERC20Balance.toString()).to.be.eq('1200000000000000000') // 1.2 ETH + }) + }) +}) diff --git a/packages/safe-core-sdk/tests/module-manager.test.ts b/packages/safe-core-sdk/tests/module-manager.test.ts new file mode 100644 index 000000000..a49d553e7 --- /dev/null +++ b/packages/safe-core-sdk/tests/module-manager.test.ts @@ -0,0 +1,234 @@ +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers } from 'ethers' +import { deployments, waffle } from 'hardhat' +import EthersSafe from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' +import { SENTINEL_ADDRESS, ZERO_ADDRESS } from '../src/utils/constants' +import { getAccounts } from './utils/setupConfig' +import { + getDailyLimitModule, + getMultiSend, + getSafeWithOwners, + getSocialRecoveryModule +} from './utils/setupContracts' +chai.use(chaiAsPromised) + +describe('Safe modules manager', () => { + const setupTests = deployments.createFixture(async ({ deployments }) => { + await deployments.fixture() + const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } + return { + dailyLimitModule: await getDailyLimitModule(), + socialRecoveryModule: await getSocialRecoveryModule(), + safe: await getSafeWithOwners([accounts[0].address]), + accounts, + contractNetworks + } + }) + + describe('getModules', async () => { + it('should return all the enabled modules', async () => { + const { safe, accounts, dailyLimitModule, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + chai.expect((await safeSdk.getModules()).length).to.be.eq(0) + const tx = await safeSdk.getEnableModuleTx(dailyLimitModule.address) + const txResponse = await safeSdk.executeTransaction(tx) + await txResponse.wait() + chai.expect((await safeSdk.getModules()).length).to.be.eq(1) + }) + }) + + describe('isModuleEnabled', async () => { + it('should return true if a module is enabled', async () => { + const { safe, accounts, dailyLimitModule, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.false + const tx = await safeSdk.getEnableModuleTx(dailyLimitModule.address) + const txResponse = await safeSdk.executeTransaction(tx) + await txResponse.wait() + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.true + }) + }) + + describe('getEnableModuleTx', async () => { + it('should fail if address is invalid', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getEnableModuleTx('0x123') + await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') + }) + + it('should fail if address is equal to sentinel', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getEnableModuleTx(SENTINEL_ADDRESS) + await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') + }) + + it('should fail if address is equal to 0x address', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getEnableModuleTx(ZERO_ADDRESS) + await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') + }) + + it('should fail if address is already enabled', async () => { + const { safe, accounts, dailyLimitModule, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx1 = await safeSdk.getEnableModuleTx(dailyLimitModule.address) + const txResponse = await safeSdk.executeTransaction(tx1) + await txResponse.wait() + const tx2 = safeSdk.getEnableModuleTx(dailyLimitModule.address) + await chai.expect(tx2).to.be.rejectedWith('Module provided is already enabled') + }) + + it('should enable a Safe module', async () => { + const { safe, accounts, dailyLimitModule, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + chai.expect((await safeSdk.getModules()).length).to.be.eq(0) + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.false + const tx = await safeSdk.getEnableModuleTx(dailyLimitModule.address) + const txResponse = await safeSdk.executeTransaction(tx) + await txResponse.wait() + chai.expect((await safeSdk.getModules()).length).to.be.eq(1) + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.true + }) + }) + + describe('getDisableModuleTx', async () => { + it('should fail if address is invalid', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getDisableModuleTx('0x123') + await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') + }) + + it('should fail if address is equal to sentinel', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getDisableModuleTx(SENTINEL_ADDRESS) + await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') + }) + + it('should fail if address is equal to 0x address', async () => { + const { safe, accounts, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getDisableModuleTx(ZERO_ADDRESS) + await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') + }) + + it('should fail if address is not enabled', async () => { + const { safe, accounts, dailyLimitModule, contractNetworks } = await setupTests() + const [account1] = accounts + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const tx = safeSdk.getDisableModuleTx(dailyLimitModule.address) + await chai.expect(tx).to.be.rejectedWith('Module provided is not enabled already') + }) + + it('should disable Safe modules', async () => { + const { dailyLimitModule, accounts, socialRecoveryModule, contractNetworks } = await setupTests() + const [account1] = accounts + const safe = await getSafeWithOwners([account1.address]) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + + const tx1 = await safeSdk.getEnableModuleTx(dailyLimitModule.address) + const txResponse1 = await safeSdk.executeTransaction(tx1) + await txResponse1.wait() + const tx2 = await safeSdk.getEnableModuleTx(socialRecoveryModule.address) + const txResponse2 = await safeSdk.executeTransaction(tx2) + await txResponse2.wait() + chai.expect((await safeSdk.getModules()).length).to.be.eq(2) + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.true + chai.expect(await safeSdk.isModuleEnabled(socialRecoveryModule.address)).to.be.true + + const tx3 = await safeSdk.getDisableModuleTx(dailyLimitModule.address) + const txResponse3 = await safeSdk.executeTransaction(tx3) + await txResponse3.wait() + chai.expect((await safeSdk.getModules()).length).to.be.eq(1) + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.false + chai.expect(await safeSdk.isModuleEnabled(socialRecoveryModule.address)).to.be.true + + const tx4 = await safeSdk.getDisableModuleTx(socialRecoveryModule.address) + const txResponse4 = await safeSdk.executeTransaction(tx4) + await txResponse4.wait() + chai.expect((await safeSdk.getModules()).length).to.be.eq(0) + chai.expect(await safeSdk.isModuleEnabled(dailyLimitModule.address)).to.be.false + chai.expect(await safeSdk.isModuleEnabled(socialRecoveryModule.address)).to.be.false + }) + }) +}) diff --git a/tests/off-chain-signatures.test.ts b/packages/safe-core-sdk/tests/off-chain-signatures.test.ts similarity index 61% rename from tests/off-chain-signatures.test.ts rename to packages/safe-core-sdk/tests/off-chain-signatures.test.ts index 06b360db1..ea80d3a5c 100644 --- a/tests/off-chain-signatures.test.ts +++ b/packages/safe-core-sdk/tests/off-chain-signatures.test.ts @@ -1,27 +1,38 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' import { ethers } from 'ethers' -import { deployments } from 'hardhat' +import { deployments, waffle } from 'hardhat' import EthersSafe from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' import { getAccounts } from './utils/setupConfig' -import { getSafeWithOwners } from './utils/setupContracts' +import { getMultiSend, getSafeWithOwners } from './utils/setupContracts' chai.use(chaiAsPromised) describe('Off-chain signatures', () => { const setupTests = deployments.createFixture(async ({ deployments }) => { await deployments.fixture() const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } return { safe: await getSafeWithOwners([accounts[0].address, accounts[1].address]), - accounts + accounts, + contractNetworks } }) describe('signTransactionHash', async () => { it('should fail if signer is not provided', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer.provider) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', @@ -34,9 +45,14 @@ describe('Off-chain signatures', () => { }) it('should fail if signer is not an owner', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const account3 = accounts[2] - const safeSdk = await EthersSafe.create(ethers, safe.address, account3.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account3.signer, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', @@ -49,9 +65,14 @@ describe('Off-chain signatures', () => { }) it('should sign a transaction hash with the current signer', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', @@ -65,9 +86,14 @@ describe('Off-chain signatures', () => { describe('signTransaction', async () => { it('should fail if signer is not provided', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer.provider) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', @@ -77,9 +103,14 @@ describe('Off-chain signatures', () => { }) it('should fail if signature is added by an account that is not an owner', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const account3 = accounts[2] - const safeSdk = await EthersSafe.create(ethers, safe.address, account3.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account3.signer, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', @@ -91,9 +122,14 @@ describe('Off-chain signatures', () => { }) it('should add the signature of the current signer', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', @@ -105,9 +141,14 @@ describe('Off-chain signatures', () => { }) it('should ignore duplicated signatures', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = await safeSdk.createTransaction({ to: safe.address, value: '0', diff --git a/tests/on-chain-signatures.test.ts b/packages/safe-core-sdk/tests/on-chain-signatures.test.ts similarity index 67% rename from tests/on-chain-signatures.test.ts rename to packages/safe-core-sdk/tests/on-chain-signatures.test.ts index 9f8a32333..455a7d3a3 100644 --- a/tests/on-chain-signatures.test.ts +++ b/packages/safe-core-sdk/tests/on-chain-signatures.test.ts @@ -1,27 +1,38 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' import { ethers } from 'ethers' -import { deployments } from 'hardhat' +import { deployments, waffle } from 'hardhat' import EthersSafe from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' import { getAccounts } from './utils/setupConfig' -import { getSafeWithOwners } from './utils/setupContracts' +import { getMultiSend, getSafeWithOwners } from './utils/setupContracts' chai.use(chaiAsPromised) describe('On-chain signatures', () => { const setupTests = deployments.createFixture(async ({ deployments }) => { await deployments.fixture() const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } return { safe: await getSafeWithOwners([accounts[0].address, accounts[1].address]), - accounts + accounts, + contractNetworks } }) describe('approveTransactionHash', async () => { it('should fail if signer is not provided', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer.provider) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer.provider, + contractNetworks + }) const tx = await safeSdk1.createTransaction({ to: safe.address, value: '0', @@ -34,9 +45,14 @@ describe('On-chain signatures', () => { }) it('should fail if a transaction hash is approved by an account that is not an owner', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const account3 = accounts[2] - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account3.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account3.signer, + contractNetworks + }) const tx = await safeSdk1.createTransaction({ to: safe.address, value: '0', @@ -49,9 +65,14 @@ describe('On-chain signatures', () => { }) it('should approve the transaction hash', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = await safeSdk1.createTransaction({ to: safe.address, value: '0', @@ -64,9 +85,14 @@ describe('On-chain signatures', () => { }) it('should ignore a duplicated signatures', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = await safeSdk1.createTransaction({ to: safe.address, value: '0', @@ -85,10 +111,15 @@ describe('On-chain signatures', () => { describe('getOwnersWhoApprovedTx', async () => { it('should return the list of owners who approved a transaction hash', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ providerOrSigner: account2.signer, contractNetworks }) const tx = await safeSdk1.createTransaction({ to: safe.address, value: '0', diff --git a/tests/owners.test.ts b/packages/safe-core-sdk/tests/owner-manager.test.ts similarity index 63% rename from tests/owners.test.ts rename to packages/safe-core-sdk/tests/owner-manager.test.ts index eb16c29f6..905ea856d 100644 --- a/tests/owners.test.ts +++ b/packages/safe-core-sdk/tests/owner-manager.test.ts @@ -1,32 +1,43 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { deployments, ethers } from 'hardhat' +import { deployments, ethers, waffle } from 'hardhat' import EthersSafe from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' import { SENTINEL_ADDRESS, ZERO_ADDRESS } from '../src/utils/constants' import { getAccounts } from './utils/setupConfig' -import { getSafeWithOwners } from './utils/setupContracts' +import { getMultiSend, getSafeWithOwners } from './utils/setupContracts' chai.use(chaiAsPromised) -describe('Safe Owners', () => { +describe('Safe owners manager', () => { const setupTests = deployments.createFixture(async ({ deployments }) => { await deployments.fixture() const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } return { safe: await getSafeWithOwners([ accounts[0].address, accounts[1].address, accounts[2].address ]), - accounts + accounts, + contractNetworks } }) describe('getOwners', async () => { it('should return the list of Safe owners', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address, account2.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const owners = await safeSdk.getOwners() chai.expect(owners.length).to.be.eq(2) chai.expect(owners[0]).to.be.eq(account1.address) @@ -36,19 +47,29 @@ describe('Safe Owners', () => { describe('isOwner', async () => { it('should return true if an account is an owner of the connected Safe', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const isOwner = await safeSdk.isOwner(account1.address) chai.expect(isOwner).to.be.true }) it('should return false if an account is not an owner of the connected Safe', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const isOwner = await safeSdk.isOwner(account2.address) chai.expect(isOwner).to.be.false }) @@ -56,46 +77,71 @@ describe('Safe Owners', () => { describe('getAddOwnerTx', async () => { it('should fail if address is invalid', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getAddOwnerTx('0x123') await chai.expect(tx).to.be.rejectedWith('Invalid owner address provided') }) it('should fail if address is equal to sentinel', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getAddOwnerTx(SENTINEL_ADDRESS) await chai.expect(tx).to.be.rejectedWith('Invalid owner address provided') }) it('should fail if address is equal to 0x address', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getAddOwnerTx(ZERO_ADDRESS) await chai.expect(tx).to.be.rejectedWith('Invalid owner address provided') }) it('should fail if address is already an owner', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getAddOwnerTx(account1.address) await chai.expect(tx).to.be.rejectedWith('Address provided is already an owner') }) it('should fail if the threshold is bigger than the number of owners', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const newThreshold = 3 const numOwners = (await safeSdk.getOwners()).length chai.expect(newThreshold).to.be.gt(numOwners) @@ -104,19 +150,29 @@ describe('Safe Owners', () => { }) it('should fail if the threshold is not bigger than 0', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getAddOwnerTx(account2.address, 0) await chai.expect(tx).to.be.rejectedWith('Threshold needs to be greater than 0') }) it('should add an owner and keep the same threshold', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const initialThreshold = await safeSdk.getThreshold() const initialOwners = await safeSdk.getOwners() chai.expect(initialOwners.length).to.be.eq(1) @@ -133,10 +189,15 @@ describe('Safe Owners', () => { }) it('should add an owner and update the threshold', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const newThreshold = 1 const initialOwners = await safeSdk.getOwners() chai.expect(initialOwners.length).to.be.eq(1) @@ -154,41 +215,66 @@ describe('Safe Owners', () => { describe('getRemoveOwnerTx', async () => { it('should fail if address is invalid', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getRemoveOwnerTx('0x123') await chai.expect(tx).to.be.rejectedWith('Invalid owner address provided') }) it('should fail if address is equal to sentinel', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getRemoveOwnerTx(SENTINEL_ADDRESS) await chai.expect(tx).to.be.rejectedWith('Invalid owner address provided') }) it('should fail if address is equal to 0x address', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getRemoveOwnerTx(ZERO_ADDRESS) await chai.expect(tx).to.be.rejectedWith('Invalid owner address provided') }) it('should fail if address is not an owner', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1, account2, account3, account4] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getRemoveOwnerTx(account4.address) await chai.expect(tx).to.be.rejectedWith('Address provided is not an owner') }) it('should fail if the threshold is bigger than the number of owners', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const newThreshold = 3 const numOwners = (await safeSdk.getOwners()).length chai.expect(newThreshold).to.be.gt(numOwners - 1) @@ -197,19 +283,35 @@ describe('Safe Owners', () => { }) it('should fail if the threshold is not bigger than 0', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getRemoveOwnerTx(account1.address, 0) await chai.expect(tx).to.be.rejectedWith('Threshold needs to be greater than 0') }) it('should remove the first owner of a Safe and decrease the threshold', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1, account2, account3] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const safeSdk3 = await safeSdk1.connect(account3.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ + providerOrSigner: account2.signer, + contractNetworks + }) + const safeSdk3 = await safeSdk1.connect({ + providerOrSigner: account3.signer, + contractNetworks + }) const initialThreshold = await safeSdk1.getThreshold() const initialOwners = await safeSdk1.getOwners() chai.expect(initialOwners.length).to.be.eq(3) @@ -230,11 +332,22 @@ describe('Safe Owners', () => { }) it('should remove any owner of a Safe and decrease the threshold', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1, account2, account3] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const safeSdk3 = await safeSdk1.connect(account3.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ + providerOrSigner: account2.signer, + contractNetworks + }) + const safeSdk3 = await safeSdk1.connect({ + providerOrSigner: account3.signer, + contractNetworks + }) const initialThreshold = await safeSdk1.getThreshold() const initialOwners = await safeSdk1.getOwners() chai.expect(initialOwners.length).to.be.eq(3) @@ -255,11 +368,22 @@ describe('Safe Owners', () => { }) it('should remove an owner and update the threshold', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1, account2, account3] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const safeSdk3 = await safeSdk1.connect(account3.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ + providerOrSigner: account2.signer, + contractNetworks + }) + const safeSdk3 = await safeSdk1.connect({ + providerOrSigner: account3.signer, + contractNetworks + }) const newThreshold = 1 const initialOwners = await safeSdk1.getOwners() chai.expect(initialOwners.length).to.be.eq(3) @@ -281,82 +405,127 @@ describe('Safe Owners', () => { describe('getSwapOwnerTx', async () => { it('should fail if old address is invalid', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx('0x123', account2.address) await chai.expect(tx).to.be.rejectedWith('Invalid old owner address provided') }) it('should fail if new address is invalid', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(account1.address, '0x123') await chai.expect(tx).to.be.rejectedWith('Invalid new owner address provided') }) it('should fail if old address is equal to sentinel', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(SENTINEL_ADDRESS, account2.address) await chai.expect(tx).to.be.rejectedWith('Invalid old owner address provided') }) it('should fail if new address is equal to sentinel', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(account1.address, SENTINEL_ADDRESS) await chai.expect(tx).to.be.rejectedWith('Invalid new owner address provided') }) it('should fail if old address is equal to 0x address', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(ZERO_ADDRESS, account2.address) await chai.expect(tx).to.be.rejectedWith('Invalid old owner address provided') }) it('should fail if new address is equal to 0x address', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(account1.address, ZERO_ADDRESS) await chai.expect(tx).to.be.rejectedWith('Invalid new owner address provided') }) it('should fail if old address is not an owner', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2, account3, account4] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(account4.address, account2.address) await chai.expect(tx).to.be.rejectedWith('Old address provided is not an owner') }) it('should fail if new address is already an owner', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const tx = safeSdk.getSwapOwnerTx(account1.address, account1.address) await chai.expect(tx).to.be.rejectedWith('New address provided is already an owner') }) it('should replace the first owner of a Safe', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const initialOwners = await safeSdk.getOwners() chai.expect(initialOwners.length).to.be.eq(1) chai.expect(initialOwners[0]).to.be.eq(account1.address) @@ -369,11 +538,22 @@ describe('Safe Owners', () => { }) it('should replace any owner of a Safe', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1, account2, account3, account4] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const safeSdk3 = await safeSdk1.connect(account3.signer) + const safeSdk1 = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) + const safeSdk2 = await safeSdk1.connect({ + providerOrSigner: account2.signer, + contractNetworks + }) + const safeSdk3 = await safeSdk1.connect({ + providerOrSigner: account3.signer, + contractNetworks + }) const initialOwners = await safeSdk1.getOwners() chai.expect(initialOwners.length).to.be.eq(3) chai.expect(initialOwners[0]).to.be.eq(account1.address) diff --git a/tests/threshold.test.ts b/packages/safe-core-sdk/tests/threshold.test.ts similarity index 57% rename from tests/threshold.test.ts rename to packages/safe-core-sdk/tests/threshold.test.ts index 7b2c6d5cb..9418b51b5 100644 --- a/tests/threshold.test.ts +++ b/packages/safe-core-sdk/tests/threshold.test.ts @@ -1,35 +1,51 @@ import chai from 'chai' import chaiAsPromised from 'chai-as-promised' -import { deployments, ethers } from 'hardhat' +import { deployments, ethers, waffle } from 'hardhat' import EthersSafe from '../src' +import { ContractNetworksConfig } from '../src/configuration/contracts' import { getAccounts } from './utils/setupConfig' -import { getSafeWithOwners } from './utils/setupContracts' +import { getMultiSend, getSafeWithOwners } from './utils/setupContracts' chai.use(chaiAsPromised) describe('Safe Threshold', () => { const setupTests = deployments.createFixture(async ({ deployments }) => { await deployments.fixture() const accounts = await getAccounts() + const chainId: number = (await waffle.provider.getNetwork()).chainId + const contractNetworks: ContractNetworksConfig = { + [chainId]: { multiSendAddress: (await getMultiSend()).address } + } return { safe: await getSafeWithOwners([accounts[0].address]), - accounts + accounts, + contractNetworks } }) describe('getThreshold', async () => { it('should return the Safe threshold', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) chai.expect(await safeSdk.getThreshold()).to.be.eq(1) }) }) describe('getChangeThresholdTx', async () => { it('should fail if the threshold is bigger than the number of owners', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const newThreshold = 2 const numOwners = (await safeSdk.getOwners()).length chai.expect(newThreshold).to.be.gt(numOwners) @@ -39,9 +55,14 @@ describe('Safe Threshold', () => { }) it('should fail if the threshold is not bigger than 0', async () => { - const { safe, accounts } = await setupTests() + const { safe, accounts, contractNetworks } = await setupTests() const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const newThreshold = 0 await chai .expect(safeSdk.getChangeThresholdTx(newThreshold)) @@ -49,10 +70,15 @@ describe('Safe Threshold', () => { }) it('should change the threshold', async () => { - const { accounts } = await setupTests() + const { accounts, contractNetworks } = await setupTests() const [account1, account2] = accounts const safe = await getSafeWithOwners([account1.address, account2.address], 1) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) + const safeSdk = await EthersSafe.create({ + ethers, + safeAddress: safe.address, + providerOrSigner: account1.signer, + contractNetworks + }) const newThreshold = 2 chai.expect(await safeSdk.getThreshold()).to.be.not.eq(newThreshold) const tx = await safeSdk.getChangeThresholdTx(newThreshold) diff --git a/tests/utils/setupConfig.ts b/packages/safe-core-sdk/tests/utils/setupConfig.ts similarity index 100% rename from tests/utils/setupConfig.ts rename to packages/safe-core-sdk/tests/utils/setupConfig.ts diff --git a/tests/utils/setupContracts.ts b/packages/safe-core-sdk/tests/utils/setupContracts.ts similarity index 58% rename from tests/utils/setupContracts.ts rename to packages/safe-core-sdk/tests/utils/setupContracts.ts index 40dd806e5..011e9830e 100644 --- a/tests/utils/setupContracts.ts +++ b/packages/safe-core-sdk/tests/utils/setupContracts.ts @@ -1,5 +1,12 @@ import { AddressZero } from '@ethersproject/constants' import { deployments, ethers } from 'hardhat' +import { + DailyLimitModule, + ERC20Mintable, + GnosisSafe, + MultiSend, + SocialRecoveryModule +} from '../../typechain' export const getSafeSingleton = async () => { const SafeDeployment = await deployments.get('GnosisSafe') @@ -13,16 +20,19 @@ export const getFactory = async () => { return Factory.attach(FactoryDeployment.address) } -export const getSafeTemplate = async () => { +export const getSafeTemplate = async (): Promise => { const singleton = await getSafeSingleton() const factory = await getFactory() const template = await factory.callStatic.createProxy(singleton.address, '0x') await factory.createProxy(singleton.address, '0x').then((tx: any) => tx.wait()) const Safe = await ethers.getContractFactory('GnosisSafe') - return Safe.attach(template) + return Safe.attach(template) as GnosisSafe } -export const getSafeWithOwners = async (owners: string[], threshold?: number) => { +export const getSafeWithOwners = async ( + owners: string[], + threshold?: number +): Promise => { const template = await getSafeTemplate() await template.setup( owners, @@ -37,14 +47,26 @@ export const getSafeWithOwners = async (owners: string[], threshold?: number) => return template } -export const getDailyLimitModule = async () => { +export const getMultiSend = async (): Promise => { + const MultiSendDeployment = await deployments.get('MultiSend') + const MultiSend = await ethers.getContractFactory('MultiSend') + return MultiSend.attach(MultiSendDeployment.address) as MultiSend +} + +export const getDailyLimitModule = async (): Promise => { const DailyLimitModuleDeployment = await deployments.get('DailyLimitModule') const DailyLimitModule = await ethers.getContractFactory('DailyLimitModule') - return DailyLimitModule.attach(DailyLimitModuleDeployment.address) + return DailyLimitModule.attach(DailyLimitModuleDeployment.address) as DailyLimitModule } -export const getSocialRecoveryModule = async () => { +export const getSocialRecoveryModule = async (): Promise => { const SocialRecoveryModuleDeployment = await deployments.get('SocialRecoveryModule') const SocialRecoveryModule = await ethers.getContractFactory('SocialRecoveryModule') - return SocialRecoveryModule.attach(SocialRecoveryModuleDeployment.address) + return SocialRecoveryModule.attach(SocialRecoveryModuleDeployment.address) as SocialRecoveryModule +} + +export const getERC20Mintable = async (): Promise => { + const ERC20MintableDeployment = await deployments.get('ERC20Mintable') + const ERC20Mintable = await ethers.getContractFactory('ERC20Mintable') + return ERC20Mintable.attach(ERC20MintableDeployment.address) as ERC20Mintable } diff --git a/packages/safe-core-sdk/tsconfig.json b/packages/safe-core-sdk/tsconfig.json new file mode 100644 index 000000000..15bffd7d6 --- /dev/null +++ b/packages/safe-core-sdk/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", /* Redirect output structure to the directory. */ + "baseUrl": "./src", /* Base directory to resolve non-absolute module names. */ + }, + "include": ["./src"] +} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 0fa382178..000000000 --- a/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SafeSignature } from 'utils/signatures/SafeSignature' -import EthersSafe from './EthersSafe' -import Safe from './Safe' -import SafeTransaction, { SafeTransactionDataPartial } from './utils/transactions/SafeTransaction' - -export default EthersSafe -export { Safe, SafeSignature, SafeTransactionDataPartial, SafeTransaction } diff --git a/src/utils/transactions/utils.ts b/src/utils/transactions/utils.ts deleted file mode 100644 index e2d349f7f..000000000 --- a/src/utils/transactions/utils.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GnosisSafe } from '../../../typechain' -import { ZERO_ADDRESS } from '../constants' -import { estimateTxGas } from './gas' -import { OperationType, SafeTransactionData, SafeTransactionDataPartial } from './SafeTransaction' - -export async function standardizeSafeTransaction( - contract: GnosisSafe, - tx: SafeTransactionDataPartial -): Promise { - const standardizedTxs = { - to: tx.to, - value: tx.value, - data: tx.data, - operation: tx.operation ?? OperationType.Call, - baseGas: tx.baseGas ?? 0, - gasPrice: tx.gasPrice ?? 0, - gasToken: tx.gasToken || ZERO_ADDRESS, - refundReceiver: tx.refundReceiver || ZERO_ADDRESS, - nonce: tx.nonce ?? (await contract.nonce()).toNumber() - } - const safeTxGas = - tx.safeTxGas ?? - (await estimateTxGas( - contract, - standardizedTxs.to, - standardizedTxs.value, - standardizedTxs.data, - standardizedTxs.operation - )) - return { - ...standardizedTxs, - safeTxGas - } -} diff --git a/tests/execution.test.ts b/tests/execution.test.ts deleted file mode 100644 index b35ebb21e..000000000 --- a/tests/execution.test.ts +++ /dev/null @@ -1,158 +0,0 @@ -import chai from 'chai' -import chaiAsPromised from 'chai-as-promised' -import { BigNumber } from 'ethers' -import { deployments, ethers } from 'hardhat' -import EthersSafe from '../src' -import { getAccounts } from './utils/setupConfig' -import { getSafeWithOwners } from './utils/setupContracts' -chai.use(chaiAsPromised) - -describe('Transactions execution', () => { - const setupTests = deployments.createFixture(async ({ deployments }) => { - await deployments.fixture() - const accounts = await getAccounts() - return { - safe: await getSafeWithOwners([accounts[0].address, accounts[1].address]), - accounts - } - }) - - describe('execTransaction', async () => { - it('should fail if a provider is provided', async () => { - const { safe, accounts } = await setupTests() - const safeSdk1 = await EthersSafe.create(ethers, safe.address, accounts[0].signer.provider) - const tx = await safeSdk1.createTransaction({ - to: safe.address, - value: '0', - data: '0x' - }) - await chai.expect(safeSdk1.executeTransaction(tx)).rejectedWith('No signer provided') - }) - - it('should fail if no provider or signer is provided', async () => { - const mainnetGnosisDAOSafe = '0x0da0c3e52c977ed3cbc641ff02dd271c3ed55afe' - const safeSdk1 = await EthersSafe.create(ethers, mainnetGnosisDAOSafe) - const tx = await safeSdk1.createTransaction({ - to: mainnetGnosisDAOSafe, - value: '0', - data: '0x' - }) - await chai.expect(safeSdk1.executeTransaction(tx)).rejectedWith('No signer provided') - }) - - it('should fail if there are not enough signatures (1 missing)', async () => { - const { accounts } = await setupTests() - const [account1, account2, account3] = accounts - const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const tx = await safeSdk1.createTransaction({ - to: safe.address, - value: '0', - data: '0x' - }) - await safeSdk1.signTransaction(tx) - const txHash = await safeSdk2.getTransactionHash(tx) - const txResponse = await safeSdk2.approveTransactionHash(txHash) - await txResponse.wait() - await chai - .expect(safeSdk2.executeTransaction(tx)) - .to.be.rejectedWith('There is 1 signature missing') - }) - - it('should fail if there are not enough signatures (>1 missing)', async () => { - const { accounts } = await setupTests() - const [account1, account2, account3] = accounts - const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = await safeSdk1.createTransaction({ - to: safe.address, - value: '0', - data: '0x' - }) - await chai - .expect(safeSdk1.executeTransaction(tx)) - .to.be.rejectedWith('There are 2 signatures missing') - }) - - it('should execute a transaction with threshold 1', async () => { - const { accounts } = await setupTests() - const [account1, account2] = accounts - const safe = await getSafeWithOwners([account1.address]) - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - await account1.signer.sendTransaction({ - to: safe.address, - value: BigNumber.from('1000000000000000000') - }) - const safeInitialBalance = await safeSdk1.getBalance() - const tx = await safeSdk1.createTransaction({ - to: account2.address, - value: '500000000000000000', - data: '0x' - }) - const txResponse = await safeSdk1.executeTransaction(tx) - await txResponse.wait() - const safeFinalBalance = await safeSdk1.getBalance() - chai - .expect(safeInitialBalance.toString()) - .to.be.eq(safeFinalBalance.add(BigNumber.from(tx.data.value).toString())) - }) - - it('should execute a transaction with threshold >1', async () => { - const { accounts } = await setupTests() - const [account1, account2, account3] = accounts - const safe = await getSafeWithOwners([account1.address, account2.address, account3.address]) - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const safeSdk3 = await safeSdk1.connect(account3.signer) - await account1.signer.sendTransaction({ - to: safe.address, - value: BigNumber.from('1000000000000000000') - }) - const safeInitialBalance = await safeSdk1.getBalance() - const tx = await safeSdk1.createTransaction({ - to: account2.address, - value: '500000000000000000', - data: '0x' - }) - await safeSdk1.signTransaction(tx) - const txHash = await safeSdk2.getTransactionHash(tx) - const txResponse1 = await safeSdk2.approveTransactionHash(txHash) - await txResponse1.wait() - const txResponse2 = await safeSdk3.executeTransaction(tx) - await txResponse2.wait() - const safeFinalBalance = await safeSdk1.getBalance() - chai - .expect(safeInitialBalance.toString()) - .to.be.eq(safeFinalBalance.add(BigNumber.from(tx.data.value).toString())) - }) - - it('should execute a transaction when is not submitted by an owner', async () => { - const { safe, accounts } = await setupTests() - const [account1, account2, account3] = accounts - const safeSdk1 = await EthersSafe.create(ethers, safe.address, account1.signer) - const safeSdk2 = await safeSdk1.connect(account2.signer) - const safeSdk3 = await safeSdk1.connect(account3.signer) - await account1.signer.sendTransaction({ - to: safe.address, - value: BigNumber.from('1000000000000000000') - }) - const safeInitialBalance = await safeSdk1.getBalance() - const tx = await safeSdk1.createTransaction({ - to: account2.address, - value: '500000000000000000', - data: '0x' - }) - await safeSdk1.signTransaction(tx) - const txHash = await safeSdk2.getTransactionHash(tx) - const txResponse1 = await safeSdk2.approveTransactionHash(txHash) - await txResponse1.wait() - const txResponse2 = await safeSdk3.executeTransaction(tx) - await txResponse2.wait() - const safeFinalBalance = await safeSdk1.getBalance() - chai - .expect(safeInitialBalance.toString()) - .to.be.eq(safeFinalBalance.add(BigNumber.from(tx.data.value).toString())) - }) - }) -}) diff --git a/tests/modules.test.ts b/tests/modules.test.ts deleted file mode 100644 index 5e79ab0e4..000000000 --- a/tests/modules.test.ts +++ /dev/null @@ -1,167 +0,0 @@ -import chai from 'chai' -import chaiAsPromised from 'chai-as-promised' -import { ethers } from 'ethers' -import { deployments } from 'hardhat' -import EthersSafe from '../src' -import { SENTINEL_ADDRESS, ZERO_ADDRESS } from '../src/utils/constants' -import { getAccounts } from './utils/setupConfig' -import { - getDailyLimitModule, - getSafeWithOwners, - getSocialRecoveryModule -} from './utils/setupContracts' -chai.use(chaiAsPromised) - -describe('Safe modules', () => { - const setupTests = deployments.createFixture(async ({ deployments }) => { - await deployments.fixture() - const accounts = await getAccounts() - return { - safe: await getSafeWithOwners([accounts[0].address]), - accounts, - module1: await getDailyLimitModule(), - module2: await getSocialRecoveryModule() - } - }) - - describe('getModules', async () => { - it('should return all the enabled modules', async () => { - const { safe, accounts, module1 } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - chai.expect((await safeSdk.getModules()).length).to.be.eq(0) - const tx = await safeSdk.getEnableModuleTx(module1.address) - const txResponse = await safeSdk.executeTransaction(tx) - await txResponse.wait() - chai.expect((await safeSdk.getModules()).length).to.be.eq(1) - }) - }) - - describe('isModuleEnabled', async () => { - it('should return true if a module is enabled', async () => { - const { safe, accounts, module1 } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.false - const tx = await safeSdk.getEnableModuleTx(module1.address) - const txResponse = await safeSdk.executeTransaction(tx) - await txResponse.wait() - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.true - }) - }) - - describe('getEnableModuleTx', async () => { - it('should fail if address is invalid', async () => { - const { safe, accounts } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getEnableModuleTx('0x123') - await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') - }) - - it('should fail if address is equal to sentinel', async () => { - const { safe, accounts } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getEnableModuleTx(SENTINEL_ADDRESS) - await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') - }) - - it('should fail if address is equal to 0x address', async () => { - const { safe, accounts } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getEnableModuleTx(ZERO_ADDRESS) - await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') - }) - - it('should fail if address is already enabled', async () => { - const { safe, accounts, module1 } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx1 = await safeSdk.getEnableModuleTx(module1.address) - const txResponse = await safeSdk.executeTransaction(tx1) - await txResponse.wait() - const tx2 = safeSdk.getEnableModuleTx(module1.address) - await chai.expect(tx2).to.be.rejectedWith('Module provided is already enabled') - }) - - it('should enable a Safe module', async () => { - const { safe, accounts, module1 } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - chai.expect((await safeSdk.getModules()).length).to.be.eq(0) - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.false - const tx = await safeSdk.getEnableModuleTx(module1.address) - const txResponse = await safeSdk.executeTransaction(tx) - await txResponse.wait() - chai.expect((await safeSdk.getModules()).length).to.be.eq(1) - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.true - }) - }) - - describe('getDisableModuleTx', async () => { - it('should fail if address is invalid', async () => { - const { safe, accounts } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getDisableModuleTx('0x123') - await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') - }) - - it('should fail if address is equal to sentinel', async () => { - const { safe, accounts } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getDisableModuleTx(SENTINEL_ADDRESS) - await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') - }) - - it('should fail if address is equal to 0x address', async () => { - const { safe, accounts } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getDisableModuleTx(ZERO_ADDRESS) - await chai.expect(tx).to.be.rejectedWith('Invalid module address provided') - }) - - it('should fail if address is not enabled', async () => { - const { safe, accounts, module1 } = await setupTests() - const [account1] = accounts - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - const tx = safeSdk.getDisableModuleTx(module1.address) - await chai.expect(tx).to.be.rejectedWith('Module provided is not enabled already') - }) - - it('should disable Safe modules', async () => { - const { accounts, module1, module2 } = await setupTests() - const [account1] = accounts - const safe = await getSafeWithOwners([account1.address]) - const safeSdk = await EthersSafe.create(ethers, safe.address, account1.signer) - - const tx1 = await safeSdk.getEnableModuleTx(module1.address) - const txResponse1 = await safeSdk.executeTransaction(tx1) - await txResponse1.wait() - const tx2 = await safeSdk.getEnableModuleTx(module2.address) - const txResponse2 = await safeSdk.executeTransaction(tx2) - await txResponse2.wait() - chai.expect((await safeSdk.getModules()).length).to.be.eq(2) - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.true - chai.expect(await safeSdk.isModuleEnabled(module2.address)).to.be.true - - const tx3 = await safeSdk.getDisableModuleTx(module1.address) - const txResponse3 = await safeSdk.executeTransaction(tx3) - await txResponse3.wait() - chai.expect((await safeSdk.getModules()).length).to.be.eq(1) - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.false - chai.expect(await safeSdk.isModuleEnabled(module2.address)).to.be.true - - const tx4 = await safeSdk.getDisableModuleTx(module2.address) - const txResponse4 = await safeSdk.executeTransaction(tx4) - await txResponse4.wait() - chai.expect((await safeSdk.getModules()).length).to.be.eq(0) - chai.expect(await safeSdk.isModuleEnabled(module1.address)).to.be.false - chai.expect(await safeSdk.isModuleEnabled(module2.address)).to.be.false - }) - }) -}) diff --git a/tsconfig.json b/tsconfig.base.json similarity index 91% rename from tsconfig.json rename to tsconfig.base.json index 8cbfa3281..c5306cbc7 100644 --- a/tsconfig.json +++ b/tsconfig.base.json @@ -5,7 +5,6 @@ "allowJs": false, /* Allow javascript files to be compiled. */ "declaration": true, /* Generates corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ "strict": true, /* Enable all strict type-checking options. */ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ "strictNullChecks": true, /* Enable strict null checks. */ @@ -18,14 +17,12 @@ "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - "baseUrl": "src", /* Base directory to resolve non-absolute module names. */ "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ - "resolveJsonModule": true, + "resolveJsonModule": true }, - "include": ["src"], "exclude": ["dist", "node_modules", "coverage"] } diff --git a/yarn.lock b/yarn.lock index b3c0cfd40..eeac3a63b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1499,6 +1499,677 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== +"@lerna/add@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" + integrity sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng== + dependencies: + "@lerna/bootstrap" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + npm-package-arg "^8.1.0" + p-map "^4.0.0" + pacote "^11.2.6" + semver "^7.3.4" + +"@lerna/bootstrap@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-4.0.0.tgz#5f5c5e2c6cfc8fcec50cb2fbe569a8c607101891" + integrity sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/has-npm-version" "4.0.0" + "@lerna/npm-install" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/rimraf-dir" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/symlink-binary" "4.0.0" + "@lerna/symlink-dependencies" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + get-port "^5.1.1" + multimatch "^5.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + p-map "^4.0.0" + p-map-series "^2.1.0" + p-waterfall "^2.1.1" + read-package-tree "^5.3.1" + semver "^7.3.4" + +"@lerna/changed@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-4.0.0.tgz#b9fc76cea39b9292a6cd263f03eb57af85c9270b" + integrity sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ== + dependencies: + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/listable" "4.0.0" + "@lerna/output" "4.0.0" + +"@lerna/check-working-tree@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz#257e36a602c00142e76082a19358e3e1ae8dbd58" + integrity sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q== + dependencies: + "@lerna/collect-uncommitted" "4.0.0" + "@lerna/describe-ref" "4.0.0" + "@lerna/validation-error" "4.0.0" + +"@lerna/child-process@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-4.0.0.tgz#341b96a57dffbd9705646d316e231df6fa4df6e1" + integrity sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q== + dependencies: + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/clean@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-4.0.0.tgz#8f778b6f2617aa2a936a6b5e085ae62498e57dc5" + integrity sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/rimraf-dir" "4.0.0" + p-map "^4.0.0" + p-map-series "^2.1.0" + p-waterfall "^2.1.1" + +"@lerna/cli@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-4.0.0.tgz#8eabd334558836c1664df23f19acb95e98b5bbf3" + integrity sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA== + dependencies: + "@lerna/global-options" "4.0.0" + dedent "^0.7.0" + npmlog "^4.1.2" + yargs "^16.2.0" + +"@lerna/collect-uncommitted@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz#855cd64612969371cfc2453b90593053ff1ba779" + integrity sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g== + dependencies: + "@lerna/child-process" "4.0.0" + chalk "^4.1.0" + npmlog "^4.1.2" + +"@lerna/collect-updates@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-4.0.0.tgz#8e208b1bafd98a372ff1177f7a5e288f6bea8041" + integrity sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/describe-ref" "4.0.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + slash "^3.0.0" + +"@lerna/command@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-4.0.0.tgz#991c7971df8f5bf6ae6e42c808869a55361c1b98" + integrity sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/project" "4.0.0" + "@lerna/validation-error" "4.0.0" + "@lerna/write-log-file" "4.0.0" + clone-deep "^4.0.1" + dedent "^0.7.0" + execa "^5.0.0" + is-ci "^2.0.0" + npmlog "^4.1.2" + +"@lerna/conventional-commits@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz#660fb2c7b718cb942ead70110df61f18c6f99750" + integrity sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw== + dependencies: + "@lerna/validation-error" "4.0.0" + conventional-changelog-angular "^5.0.12" + conventional-changelog-core "^4.2.2" + conventional-recommended-bump "^6.1.0" + fs-extra "^9.1.0" + get-stream "^6.0.0" + lodash.template "^4.5.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + pify "^5.0.0" + semver "^7.3.4" + +"@lerna/create-symlink@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-4.0.0.tgz#8c5317ce5ae89f67825443bd7651bf4121786228" + integrity sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig== + dependencies: + cmd-shim "^4.1.0" + fs-extra "^9.1.0" + npmlog "^4.1.2" + +"@lerna/create@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-4.0.0.tgz#b6947e9b5dfb6530321952998948c3e63d64d730" + integrity sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + fs-extra "^9.1.0" + globby "^11.0.2" + init-package-json "^2.0.2" + npm-package-arg "^8.1.0" + p-reduce "^2.1.0" + pacote "^11.2.6" + pify "^5.0.0" + semver "^7.3.4" + slash "^3.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + whatwg-url "^8.4.0" + yargs-parser "20.2.4" + +"@lerna/describe-ref@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-4.0.0.tgz#53c53b4ea65fdceffa072a62bfebe6772c45d9ec" + integrity sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ== + dependencies: + "@lerna/child-process" "4.0.0" + npmlog "^4.1.2" + +"@lerna/diff@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-4.0.0.tgz#6d3071817aaa4205a07bf77cfc6e932796d48b92" + integrity sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/validation-error" "4.0.0" + npmlog "^4.1.2" + +"@lerna/exec@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-4.0.0.tgz#eb6cb95cb92d42590e9e2d628fcaf4719d4a8be6" + integrity sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/profiler" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + p-map "^4.0.0" + +"@lerna/filter-options@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-4.0.0.tgz#ac94cc515d7fa3b47e2f7d74deddeabb1de5e9e6" + integrity sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw== + dependencies: + "@lerna/collect-updates" "4.0.0" + "@lerna/filter-packages" "4.0.0" + dedent "^0.7.0" + npmlog "^4.1.2" + +"@lerna/filter-packages@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-4.0.0.tgz#b1f70d70e1de9cdd36a4e50caa0ac501f8d012f2" + integrity sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA== + dependencies: + "@lerna/validation-error" "4.0.0" + multimatch "^5.0.0" + npmlog "^4.1.2" + +"@lerna/get-npm-exec-opts@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz#dc955be94a4ae75c374ef9bce91320887d34608f" + integrity sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ== + dependencies: + npmlog "^4.1.2" + +"@lerna/get-packed@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-4.0.0.tgz#0989d61624ac1f97e393bdad2137c49cd7a37823" + integrity sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w== + dependencies: + fs-extra "^9.1.0" + ssri "^8.0.1" + tar "^6.1.0" + +"@lerna/github-client@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-4.0.0.tgz#2ced67721363ef70f8e12ffafce4410918f4a8a4" + integrity sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw== + dependencies: + "@lerna/child-process" "4.0.0" + "@octokit/plugin-enterprise-rest" "^6.0.1" + "@octokit/rest" "^18.1.0" + git-url-parse "^11.4.4" + npmlog "^4.1.2" + +"@lerna/gitlab-client@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz#00dad73379c7b38951d4b4ded043504c14e2b67d" + integrity sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA== + dependencies: + node-fetch "^2.6.1" + npmlog "^4.1.2" + whatwg-url "^8.4.0" + +"@lerna/global-options@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-4.0.0.tgz#c7d8b0de6a01d8a845e2621ea89e7f60f18c6a5f" + integrity sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ== + +"@lerna/has-npm-version@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz#d3fc3292c545eb28bd493b36e6237cf0279f631c" + integrity sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg== + dependencies: + "@lerna/child-process" "4.0.0" + semver "^7.3.4" + +"@lerna/import@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-4.0.0.tgz#bde656c4a451fa87ae41733ff8a8da60547c5465" + integrity sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + fs-extra "^9.1.0" + p-map-series "^2.1.0" + +"@lerna/info@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/info/-/info-4.0.0.tgz#b9fb0e479d60efe1623603958a831a88b1d7f1fc" + integrity sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/output" "4.0.0" + envinfo "^7.7.4" + +"@lerna/init@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-4.0.0.tgz#dadff67e6dfb981e8ccbe0e6a310e837962f6c7a" + integrity sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + write-json-file "^4.3.0" + +"@lerna/link@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-4.0.0.tgz#c3a38aabd44279d714e90f2451e31b63f0fb65ba" + integrity sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/symlink-dependencies" "4.0.0" + p-map "^4.0.0" + slash "^3.0.0" + +"@lerna/list@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-4.0.0.tgz#24b4e6995bd73f81c556793fe502b847efd9d1d7" + integrity sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/listable" "4.0.0" + "@lerna/output" "4.0.0" + +"@lerna/listable@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-4.0.0.tgz#d00d6cb4809b403f2b0374fc521a78e318b01214" + integrity sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ== + dependencies: + "@lerna/query-graph" "4.0.0" + chalk "^4.1.0" + columnify "^1.5.4" + +"@lerna/log-packed@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-4.0.0.tgz#95168fe2e26ac6a71e42f4be857519b77e57a09f" + integrity sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ== + dependencies: + byte-size "^7.0.0" + columnify "^1.5.4" + has-unicode "^2.0.1" + npmlog "^4.1.2" + +"@lerna/npm-conf@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-4.0.0.tgz#b259fd1e1cee2bf5402b236e770140ff9ade7fd2" + integrity sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw== + dependencies: + config-chain "^1.1.12" + pify "^5.0.0" + +"@lerna/npm-dist-tag@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz#d1e99b4eccd3414142f0548ad331bf2d53f3257a" + integrity sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw== + dependencies: + "@lerna/otplease" "4.0.0" + npm-package-arg "^8.1.0" + npm-registry-fetch "^9.0.0" + npmlog "^4.1.2" + +"@lerna/npm-install@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-4.0.0.tgz#31180be3ab3b7d1818a1a0c206aec156b7094c78" + integrity sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/get-npm-exec-opts" "4.0.0" + fs-extra "^9.1.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + signal-exit "^3.0.3" + write-pkg "^4.0.0" + +"@lerna/npm-publish@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-4.0.0.tgz#84eb62e876fe949ae1fd62c60804423dbc2c4472" + integrity sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w== + dependencies: + "@lerna/otplease" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + fs-extra "^9.1.0" + libnpmpublish "^4.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + pify "^5.0.0" + read-package-json "^3.0.0" + +"@lerna/npm-run-script@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz#dfebf4f4601442e7c0b5214f9fb0d96c9350743b" + integrity sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/get-npm-exec-opts" "4.0.0" + npmlog "^4.1.2" + +"@lerna/otplease@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-4.0.0.tgz#84972eb43448f8a1077435ba1c5e59233b725850" + integrity sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw== + dependencies: + "@lerna/prompt" "4.0.0" + +"@lerna/output@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/output/-/output-4.0.0.tgz#b1d72215c0e35483e4f3e9994debc82c621851f2" + integrity sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w== + dependencies: + npmlog "^4.1.2" + +"@lerna/pack-directory@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-4.0.0.tgz#8b617db95d20792f043aaaa13a9ccc0e04cb4c74" + integrity sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ== + dependencies: + "@lerna/get-packed" "4.0.0" + "@lerna/package" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + npm-packlist "^2.1.4" + npmlog "^4.1.2" + tar "^6.1.0" + temp-write "^4.0.0" + +"@lerna/package-graph@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-4.0.0.tgz#16a00253a8ac810f72041481cb46bcee8d8123dd" + integrity sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw== + dependencies: + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/validation-error" "4.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + semver "^7.3.4" + +"@lerna/package@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/package/-/package-4.0.0.tgz#1b4c259c4bcff45c876ee1d591a043aacbc0d6b7" + integrity sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q== + dependencies: + load-json-file "^6.2.0" + npm-package-arg "^8.1.0" + write-pkg "^4.0.0" + +"@lerna/prerelease-id-from-version@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz#c7e0676fcee1950d85630e108eddecdd5b48c916" + integrity sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg== + dependencies: + semver "^7.3.4" + +"@lerna/profiler@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-4.0.0.tgz#8a53ab874522eae15d178402bff90a14071908e9" + integrity sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q== + dependencies: + fs-extra "^9.1.0" + npmlog "^4.1.2" + upath "^2.0.1" + +"@lerna/project@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/project/-/project-4.0.0.tgz#ff84893935833533a74deff30c0e64ddb7f0ba6b" + integrity sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg== + dependencies: + "@lerna/package" "4.0.0" + "@lerna/validation-error" "4.0.0" + cosmiconfig "^7.0.0" + dedent "^0.7.0" + dot-prop "^6.0.1" + glob-parent "^5.1.1" + globby "^11.0.2" + load-json-file "^6.2.0" + npmlog "^4.1.2" + p-map "^4.0.0" + resolve-from "^5.0.0" + write-json-file "^4.3.0" + +"@lerna/prompt@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-4.0.0.tgz#5ec69a803f3f0db0ad9f221dad64664d3daca41b" + integrity sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ== + dependencies: + inquirer "^7.3.3" + npmlog "^4.1.2" + +"@lerna/publish@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-4.0.0.tgz#f67011305adeba120066a3b6d984a5bb5fceef65" + integrity sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg== + dependencies: + "@lerna/check-working-tree" "4.0.0" + "@lerna/child-process" "4.0.0" + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/describe-ref" "4.0.0" + "@lerna/log-packed" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/npm-dist-tag" "4.0.0" + "@lerna/npm-publish" "4.0.0" + "@lerna/otplease" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/pack-directory" "4.0.0" + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + "@lerna/version" "4.0.0" + fs-extra "^9.1.0" + libnpmaccess "^4.0.1" + npm-package-arg "^8.1.0" + npm-registry-fetch "^9.0.0" + npmlog "^4.1.2" + p-map "^4.0.0" + p-pipe "^3.1.0" + pacote "^11.2.6" + semver "^7.3.4" + +"@lerna/pulse-till-done@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz#04bace7d483a8205c187b806bcd8be23d7bb80a3" + integrity sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg== + dependencies: + npmlog "^4.1.2" + +"@lerna/query-graph@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-4.0.0.tgz#09dd1c819ac5ee3f38db23931143701f8a6eef63" + integrity sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg== + dependencies: + "@lerna/package-graph" "4.0.0" + +"@lerna/resolve-symlink@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz#6d006628a210c9b821964657a9e20a8c9a115e14" + integrity sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA== + dependencies: + fs-extra "^9.1.0" + npmlog "^4.1.2" + read-cmd-shim "^2.0.0" + +"@lerna/rimraf-dir@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz#2edf3b62d4eb0ef4e44e430f5844667d551ec25a" + integrity sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg== + dependencies: + "@lerna/child-process" "4.0.0" + npmlog "^4.1.2" + path-exists "^4.0.0" + rimraf "^3.0.2" + +"@lerna/run-lifecycle@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz#e648a46f9210a9bcd7c391df6844498cb5079334" + integrity sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ== + dependencies: + "@lerna/npm-conf" "4.0.0" + npm-lifecycle "^3.1.5" + npmlog "^4.1.2" + +"@lerna/run-topologically@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-4.0.0.tgz#af846eeee1a09b0c2be0d1bfb5ef0f7b04bb1827" + integrity sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA== + dependencies: + "@lerna/query-graph" "4.0.0" + p-queue "^6.6.2" + +"@lerna/run@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-4.0.0.tgz#4bc7fda055a729487897c23579694f6183c91262" + integrity sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/npm-run-script" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/profiler" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/timer" "4.0.0" + "@lerna/validation-error" "4.0.0" + p-map "^4.0.0" + +"@lerna/symlink-binary@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz#21009f62d53a425f136cb4c1a32c6b2a0cc02d47" + integrity sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA== + dependencies: + "@lerna/create-symlink" "4.0.0" + "@lerna/package" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + +"@lerna/symlink-dependencies@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz#8910eca084ae062642d0490d8972cf2d98e9ebbd" + integrity sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw== + dependencies: + "@lerna/create-symlink" "4.0.0" + "@lerna/resolve-symlink" "4.0.0" + "@lerna/symlink-binary" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + p-map-series "^2.1.0" + +"@lerna/timer@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-4.0.0.tgz#a52e51bfcd39bfd768988049ace7b15c1fd7a6da" + integrity sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg== + +"@lerna/validation-error@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-4.0.0.tgz#af9d62fe8304eaa2eb9a6ba1394f9aa807026d35" + integrity sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw== + dependencies: + npmlog "^4.1.2" + +"@lerna/version@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-4.0.0.tgz#532659ec6154d8a8789c5ab53878663e244e3228" + integrity sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA== + dependencies: + "@lerna/check-working-tree" "4.0.0" + "@lerna/child-process" "4.0.0" + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/conventional-commits" "4.0.0" + "@lerna/github-client" "4.0.0" + "@lerna/gitlab-client" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + chalk "^4.1.0" + dedent "^0.7.0" + load-json-file "^6.2.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + p-map "^4.0.0" + p-pipe "^3.1.0" + p-reduce "^2.1.0" + p-waterfall "^2.1.1" + semver "^7.3.4" + slash "^3.0.0" + temp-write "^4.0.0" + write-json-file "^4.3.0" + +"@lerna/write-log-file@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-4.0.0.tgz#18221a38a6a307d6b0a5844dd592ad53fa27091e" + integrity sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg== + dependencies: + npmlog "^4.1.2" + write-file-atomic "^3.0.3" + "@microsoft/fetch-event-source@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" @@ -1560,6 +2231,170 @@ dependencies: "@types/bignumber.js" "^5.0.0" +"@npmcli/ci-detect@^1.0.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz#6c1d2c625fb6ef1b9dea85ad0a5afcbef85ef22a" + integrity sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q== + +"@npmcli/git@^2.0.1": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.0.9.tgz#915bbfe66300e67b4da5ef765a4475ffb2ca5b6b" + integrity sha512-hTMbMryvOqGLwnmMBKs5usbPsJtyEsMsgXwJbmNrsEuQQh1LAIMDU77IoOrwkCg+NgQWl+ySlarJASwM3SutCA== + dependencies: + "@npmcli/promise-spawn" "^1.3.2" + lru-cache "^6.0.0" + mkdirp "^1.0.4" + npm-pick-manifest "^6.1.1" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== + dependencies: + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz#3cdc1f30e9736dbc417373ed803b42b1a0a29ede" + integrity sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg== + +"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^1.8.2": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.5.tgz#f250a0c5e1a08a792d775a315d0ff42fc3a51e1d" + integrity sha512-NQspusBCpTjNwNRFMtz2C5MxoxyzlbuJ4YEhxAKrIonTiirKDtatsZictx9RgamQIx6+QuHMNmPl0wQdoESs9A== + dependencies: + "@npmcli/node-gyp" "^1.0.2" + "@npmcli/promise-spawn" "^1.3.2" + infer-owner "^1.0.4" + node-gyp "^7.1.0" + read-package-json-fast "^2.0.1" + +"@octokit/auth-token@^2.4.4": + version "2.4.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" + integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.2.3": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" + integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.4.12" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.11" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" + integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.2.tgz#ec44abdfa87f2b9233282136ae33e4ba446a04e7" + integrity sha512-WmsIR1OzOr/3IqfG9JIczI8gMJUMzzyx5j0XXQ4YihHtKlQc+u35VpVoOXhlKAlaBntvry1WpAzPl/a+s3n89Q== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.0.0.tgz#0f6992db9854af15eca77d71ab0ec7fad2f20411" + integrity sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw== + +"@octokit/plugin-enterprise-rest@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== + +"@octokit/plugin-paginate-rest@^2.6.2": + version "2.13.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" + integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== + dependencies: + "@octokit/types" "^6.11.0" + +"@octokit/plugin-request-log@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" + integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== + +"@octokit/plugin-rest-endpoint-methods@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.0.1.tgz#631b8d4edc6798b03489911252a25f2a4e58c594" + integrity sha512-vvWbPtPqLyIzJ7A4IPdTl+8IeuKAwMJ4LjvmqWOOdfSuqWQYZXq2CEd0hsnkidff2YfKlguzujHs/reBdAx8Sg== + dependencies: + "@octokit/types" "^6.13.1" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" + integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": + version "5.4.15" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" + integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^6.7.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + universal-user-agent "^6.0.0" + +"@octokit/rest@^18.1.0": + version "18.5.3" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.5.3.tgz#6a2e6006a87ebbc34079c419258dd29ec9ff659d" + integrity sha512-KPAsUCr1DOdLVbZJgGNuE/QVLWEaVBpFQwDAz/2Cnya6uW2wJ/P5RVGk0itx7yyN1aGa8uXm2pri4umEqG1JBA== + dependencies: + "@octokit/core" "^3.2.3" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "5.0.1" + +"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.1", "@octokit/types@^6.7.1": + version "6.14.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.14.2.tgz#64c9457f38fb8522bdbba3c8cc814590a2d61bf5" + integrity sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA== + dependencies: + "@octokit/openapi-types" "^7.0.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2028,6 +2863,11 @@ event-iterator "^2.0.0" loglevel "^1.7.0" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@truffle/abi-utils@^0.2.1": version "0.2.1" resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.2.1.tgz#c34e4c5c9605f59282d8c99c49c38c16cdf89f08" @@ -2504,6 +3344,16 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/minimatch@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + "@types/mkdirp@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" @@ -2524,7 +3374,7 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^15.0.3": +"@types/node@*", "@types/node@>=13.7.0": version "15.0.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.3.tgz#ee09fcaac513576474c327da5818d421b98db88a" integrity sha512-/WbxFeBU+0F79z9RdEOXH4CsDga+ibi5M8uEYr91u3CkT/pdWcV8MCook+4wDPnZBexRdwWS+PiVZ2xJviAzcQ== @@ -2549,6 +3399,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.13.tgz#e743bae112bd779ac9650f907197dd2caa7f0364" integrity sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A== +"@types/node@^15.3.0": + version "15.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" + integrity sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -2792,6 +3652,14 @@ resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -2902,6 +3770,11 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + adm-zip@^0.4.16: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" @@ -2924,6 +3797,15 @@ agent-base@6: dependencies: debug "4" +agentkeepalive@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" + integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2962,7 +3844,7 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -3228,6 +4110,11 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -3299,16 +4186,31 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + array-filter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -3335,7 +4237,17 @@ array.prototype.map@^1.0.1: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.5" -asap@~2.0.3: +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -4137,6 +5049,11 @@ bech32@=1.1.3: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== +before-after-hook@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" + integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -4522,6 +5439,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.2.0" +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + busboy@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" @@ -4529,6 +5451,16 @@ busboy@^0.3.1: dependencies: dicer "0.3.0" +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +byte-size@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" + integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== + bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" @@ -4549,6 +5481,29 @@ bytewise@~1.1.0: bytewise-core "^1.2.2" typewise "^1.0.3" +cacache@^15.0.5: + version "15.0.6" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.6.tgz#65a8c580fda15b59150fb76bf3f3a8e45d583099" + integrity sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -4632,7 +5587,24 @@ camel-case@^3.0.0: no-case "^2.2.0" upper-case "^1.1.1" -camelcase@^2.0.1: +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= @@ -4741,6 +5713,11 @@ change-case@3.0.2: upper-case "^1.1.1" upper-case-first "^1.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" @@ -4828,6 +5805,11 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -4914,6 +5896,11 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -4955,6 +5942,15 @@ clone-buffer@1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -4982,6 +5978,13 @@ clone@^1.0.0, clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +cmd-shim@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" + integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== + dependencies: + mkdirp-infer-owner "^2.0.0" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -5039,6 +6042,14 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +columnify@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -5080,6 +6091,14 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + component-emitter@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -5119,6 +6138,24 @@ concat-stream@^1.5.1: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + configstore@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" @@ -5165,6 +6202,91 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +conventional-changelog-angular@^5.0.12: + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-core@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz#f0897df6d53b5d63dec36b9442bd45354f8b3ce5" + integrity sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^4.0.18" + conventional-commits-parser "^3.2.0" + dateformat "^3.0.0" + get-pkg-repo "^1.0.0" + git-raw-commits "^2.0.8" + git-remote-origin-url "^2.0.0" + git-semver-tags "^4.1.1" + lodash "^4.17.15" + normalize-package-data "^3.0.0" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + shelljs "^0.8.3" + through2 "^4.0.0" + +conventional-changelog-preset-loader@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" + integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== + +conventional-changelog-writer@^4.0.18: + version "4.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz#1ca7880b75aa28695ad33312a1f2366f4b12659f" + integrity sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw== + dependencies: + compare-func "^2.0.0" + conventional-commits-filter "^2.0.7" + dateformat "^3.0.0" + handlebars "^4.7.6" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^8.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^4.0.0" + +conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz#ba44f0b3b6588da2ee9fd8da508ebff50d116ce2" + integrity sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + trim-off-newlines "^1.0.0" + +conventional-recommended-bump@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" + integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== + dependencies: + concat-stream "^2.0.0" + conventional-changelog-preset-loader "^2.3.4" + conventional-commits-filter "^2.0.7" + conventional-commits-parser "^3.2.0" + git-raw-commits "^2.0.8" + git-semver-tags "^4.1.1" + meow "^8.0.0" + q "^1.5.1" + convert-source-map@1.X, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -5332,7 +6454,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5405,6 +6527,13 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": dependencies: cssom "0.3.x" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -5413,6 +6542,11 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -5425,6 +6559,11 @@ dataloader@2.0.0: resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f" integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ== +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + debug-fabulous@0.0.X: version "0.0.4" resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763" @@ -5476,7 +6615,20 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.2.0: +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5643,7 +6795,7 @@ delimit-stream@0.1.0: resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= -depd@~1.1.2: +depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= @@ -5653,6 +6805,11 @@ deprecated-decorator@^0.1.6: resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -5673,6 +6830,16 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-indent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -5683,6 +6850,14 @@ detect-newline@2.X: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + dicer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" @@ -5812,11 +6987,30 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dotenv@^8.0.0, dotenv@^8.2.0: +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dotenv@^8.0.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + dotignore@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" @@ -5834,6 +7028,11 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + duplexify@^3.2.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -5948,7 +7147,7 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" -encoding@^0.1.11, encoding@^0.1.13: +encoding@^0.1.11, encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5996,7 +7195,12 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -err-code@^2.0.0, err-code@^2.0.3: +envinfo@^7.7.4: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.0, err-code@^2.0.2, err-code@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== @@ -6818,6 +8022,11 @@ eventemitter3@^3.1.0, eventemitter3@^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.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -6846,6 +8055,21 @@ execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + exit-on-epipe@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" @@ -6941,6 +8165,15 @@ extend@^3.0.0, extend@~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" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -7107,7 +8340,7 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" -figures@^3.2.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -7182,6 +8415,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -7235,7 +8473,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.1.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= @@ -7477,6 +8715,13 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.6.0" +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -7602,11 +8847,32 @@ get-params@^0.1.2: resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe" integrity sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4= +get-pkg-repo@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" + integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= + dependencies: + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.0.0" + +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + get-prototype-of@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/get-prototype-of/-/get-prototype-of-0.0.0.tgz#98772bd10716d16deb4b322516c469efca28ac44" integrity sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ= +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -7626,6 +8892,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + 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-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -7638,6 +8909,55 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-raw-commits@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" + integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" + integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== + dependencies: + meow "^8.0.0" + semver "^6.0.0" + +git-up@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" + integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== + dependencies: + is-ssh "^1.3.0" + parse-url "^5.0.0" + +git-url-parse@^11.4.4: + version "11.4.4" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.4.tgz#5d747debc2469c17bc385719f7d0427802d83d77" + integrity sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw== + dependencies: + git-up "^4.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + dependencies: + ini "^1.3.2" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -7661,7 +8981,7 @@ glob-parent@^3.0.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, 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== @@ -7768,7 +9088,7 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@11.0.3, globby@^11.0.1: +globby@11.0.3, globby@^11.0.1, globby@^11.0.2: version "11.0.3" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== @@ -7822,7 +9142,7 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -7922,6 +9242,18 @@ gulp-sourcemaps@^1.5.2: through2 "2.X" vinyl "1.X" +handlebars@^4.7.6: + 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" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -7935,6 +9267,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + hardhat-deploy@^0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.5.tgz#d31edcca709e9a8314efeaecb9a35792c295bc77" @@ -7966,10 +9303,10 @@ hardhat-typechain@^0.3.5: resolved "https://registry.yarnpkg.com/hardhat-typechain/-/hardhat-typechain-0.3.5.tgz#8e50616a9da348b33bd001168c8fda9c66b7b4af" integrity sha512-w9lm8sxqTJACY+V7vijiH+NkPExnmtiQEjsV9JKD1KgMdVk2q8y+RhvU/c4B7+7b1+HylRUCxpOIvFuB3rE4+w== -hardhat@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.2.1.tgz#bef0031b994e3f60a88d428f2097195c58cf9ed2" - integrity sha512-8s7MtGXdh0NDwQKdlA8m8QdloVIN1+hv5aFpn0G5Ljj9vfNY9kUoc0a9pMboeGbd9WrS+XrZs5YlsPgQjaW/Tg== +hardhat@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.3.0.tgz#5c29f8b4d08155c3dc8c908af9713fd5079522d5" + integrity sha512-nc4ro2bM4wPaA6/0Y22o5F5QrifQk2KCyPUUKLPUeFFZoGNGYB8vmeW/k9gV9DdMukdWTzfYlKc2Jn4bfb6tDQ== dependencies: "@ethereumjs/block" "^3.2.1" "@ethereumjs/blockchain" "^5.2.1" @@ -8056,7 +9393,7 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" -has-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= @@ -8179,6 +9516,13 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -8207,7 +9551,7 @@ htmlparser2@~3.8.1: entities "1.0" readable-stream "1.1" -http-cache-semantics@^4.0.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.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== @@ -8250,6 +9594,15 @@ http-https@^1.0.0: resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -8272,6 +9625,18 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + husky@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" @@ -8285,7 +9650,7 @@ ice-cap@0.0.4: cheerio "0.20.0" color-logger "0.0.3" -iconv-lite@0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -8311,7 +9676,7 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^3.0.1: +ignore-walk@^3.0.1, ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== @@ -8368,6 +9733,14 @@ import-from@3.0.0: dependencies: resolve-from "^5.0.0" +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imul@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" @@ -8378,11 +9751,23 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -8406,11 +9791,44 @@ inherits@=2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +init-package-json@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.3.tgz#c8ae4f2a4ad353bcbc089e5ffe98a8f1a314e8fd" + integrity sha512-tk/gAgbMMxR6fn1MgMaM1HpU1ryAmBWWitnxG5OhuNXeX0cbpbgV5jA4AIpQJVNoyOfOevTtO6WX+rPs+EFqaQ== + dependencies: + glob "^7.1.1" + npm-package-arg "^8.1.2" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "^3.0.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -8440,6 +9858,11 @@ ip-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -8812,6 +10235,11 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + is-lower-case@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" @@ -8863,12 +10291,17 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== -is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0, 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= @@ -8885,6 +10318,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -8930,6 +10368,13 @@ is-set@^2.0.2: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-ssh@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" + integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== + dependencies: + protocols "^1.1.0" + is-stream@^1.0.0, is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -8952,6 +10397,13 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + is-typed-array@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" @@ -9339,6 +10791,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +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-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" @@ -9410,7 +10867,7 @@ json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.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= @@ -9470,6 +10927,11 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -9526,7 +10988,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -9577,6 +11039,30 @@ leb128@0.0.5: bn.js "^5.0.0" buffer-pipe "0.0.3" +lerna@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" + integrity sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg== + dependencies: + "@lerna/add" "4.0.0" + "@lerna/bootstrap" "4.0.0" + "@lerna/changed" "4.0.0" + "@lerna/clean" "4.0.0" + "@lerna/cli" "4.0.0" + "@lerna/create" "4.0.0" + "@lerna/diff" "4.0.0" + "@lerna/exec" "4.0.0" + "@lerna/import" "4.0.0" + "@lerna/info" "4.0.0" + "@lerna/init" "4.0.0" + "@lerna/link" "4.0.0" + "@lerna/list" "4.0.0" + "@lerna/publish" "4.0.0" + "@lerna/run" "4.0.0" + "@lerna/version" "4.0.0" + import-local "^3.0.2" + npmlog "^4.1.2" + level-codec@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247" @@ -9852,6 +11338,27 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libnpmaccess@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.2.tgz#781832fb7ccb867b26343a75a85ad9c43e50406e" + integrity sha512-avXtJibZuGap0/qADDYqb9zdpgzVu/yG5+tl2sTRa7MCkDNv2ZlGwCYI0r6/+tmqXPj0iB9fKexHz426vB326w== + dependencies: + aproba "^2.0.0" + minipass "^3.1.1" + npm-package-arg "^8.1.2" + npm-registry-fetch "^10.0.0" + +libnpmpublish@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.1.tgz#08ca2cbb5d7f6be1ce4f3f9c49b3822682bcf166" + integrity sha512-hZCrZ8v4G9YH3DxpIyBdob25ijD5v5LNzRbwsej4pPDopjdcLLj1Widl+BUeFa7D0ble1JYL4F3owjLJqiA8yA== + dependencies: + normalize-package-data "^3.0.2" + npm-package-arg "^8.1.2" + npm-registry-fetch "^10.0.0" + semver "^7.1.3" + ssri "^8.0.1" + libp2p-crypto@^0.19.0: version "0.19.4" resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.19.4.tgz#90603a1318e903fbf142db3124ff3b2a1ba07ec7" @@ -9929,6 +11436,26 @@ load-json-file@^1.0.0, load-json-file@^1.1.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +load-json-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -10019,6 +11546,11 @@ lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + lodash.keys@^4.0.0, lodash.keys@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" @@ -10066,6 +11598,14 @@ lodash.template@4.2.4: lodash.templatesettings "^4.0.0" lodash.tostring "^4.0.0" +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + lodash.templatesettings@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" @@ -10103,7 +11643,7 @@ lodash@4.17.20: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@4.17.21, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1: +lodash@4.17.21, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10179,6 +11719,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lower-case-first@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" @@ -10251,6 +11799,14 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -10263,11 +11819,42 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^8.0.9: + version "8.0.14" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" + integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.0.5" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" + integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== + map-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.6.tgz#d2ef4eb811a28644c7a8989985c69c2fdd496827" @@ -10355,6 +11942,39 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -10527,6 +12147,11 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -10544,6 +12169,15 @@ minimatch@*, "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -10554,11 +12188,58 @@ minimist@1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" + integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -10567,6 +12248,13 @@ minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + minizlib@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -10574,6 +12262,14 @@ minizlib@^1.2.1: dependencies: minipass "^2.9.0" +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -10582,6 +12278,15 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-infer-owner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== + dependencies: + chownr "^2.0.0" + infer-owner "^1.0.4" + mkdirp "^1.0.3" + mkdirp-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" @@ -10589,7 +12294,7 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*: +mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -10712,6 +12417,11 @@ mock-fs@^4.1.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + module@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/module/-/module-1.2.5.tgz#b503eb06cdc13473f56818426974cde7ec59bf15" @@ -10740,7 +12450,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, 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== @@ -10867,6 +12577,17 @@ multihashing-async@^2.0.0, multihashing-async@^2.1.2: murmurhash3js-revisited "^3.0.0" uint8arrays "^2.1.3" +multimatch@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + murmur-128@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" @@ -10881,6 +12602,11 @@ murmurhash3js-revisited@^3.0.0: resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== +mute-stream@0.0.8, mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nan@^2.12.1, nan@^2.13.2, nan@^2.14.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" @@ -10976,6 +12702,11 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +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" @@ -11062,6 +12793,39 @@ node-gyp-build@~4.1.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== +node-gyp@^5.0.2: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" + integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -11120,7 +12884,14 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2: +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: 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== @@ -11130,6 +12901,16 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" + integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== + dependencies: + hosted-git-info "^4.0.1" + resolve "^1.20.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -11142,40 +12923,122 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + 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== -npm-bundled@^1.0.1: +npm-bundled@^1.0.1, npm-bundled@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" -npm-normalize-package-bin@^1.0.1: +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-lifecycle@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" + integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.15" + node-gyp "^5.0.2" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== +npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.2.tgz#b868016ae7de5619e729993fbd8d11dc3c52ab62" + integrity sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npm-packlist@^2.1.4: + version "2.2.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" + npm-install-checks "^4.0.0" npm-normalize-package-bin "^1.0.1" + npm-package-arg "^8.1.2" + semver "^7.3.4" -npm-run-path@^4.0.0: +npm-registry-fetch@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-10.1.1.tgz#97bc7a0fca5e8f76cc5162185b8de8caa8bea639" + integrity sha512-F6a3l+ffCQ7hvvN16YG5bpm1rPZntCg66PLHDQ1apWJPOCUVHoKnL2w5fqEaTVhp42dmossTyXeR7hTGirfXrg== + dependencies: + lru-cache "^6.0.0" + make-fetch-happen "^8.0.9" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-registry-fetch@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" + integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== + dependencies: + "@npmcli/ci-detect" "^1.0.0" + lru-cache "^6.0.0" + make-fetch-happen "^8.0.9" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.0.2: +npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -11396,7 +13259,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -11580,6 +13443,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== + p-map@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" @@ -11594,6 +13462,24 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-pipe@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -11601,6 +13487,13 @@ p-timeout@^1.1.1: dependencies: p-finally "^1.0.0" +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + 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" @@ -11611,6 +13504,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +p-waterfall@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== + dependencies: + p-reduce "^2.0.0" + package-hash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" @@ -11621,6 +13521,31 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" +pacote@^11.2.6: + version "11.3.3" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.3.tgz#d7d6091464f77c09691699df2ded13ab906b3e68" + integrity sha512-GQxBX+UcVZrrJRYMK2HoG+gPeSUX/rQhnbPkkGrCYa4n2F/bgClFPaMm0nsdnYrxnmUy85uMHoFXZ0jTD0drew== + dependencies: + "@npmcli/git" "^2.0.1" + "@npmcli/installed-package-contents" "^1.0.6" + "@npmcli/promise-spawn" "^1.2.0" + "@npmcli/run-script" "^1.8.2" + cacache "^15.0.5" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.3" + mkdirp "^1.0.3" + npm-package-arg "^8.0.1" + npm-packlist "^2.1.4" + npm-pick-manifest "^6.0.0" + npm-registry-fetch "^10.0.0" + promise-retry "^2.0.1" + read-package-json-fast "^2.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.1.0" + param-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" @@ -11658,6 +13583,11 @@ parse-duration@^0.4.4: resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== +parse-github-repo-url@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" + integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -11680,6 +13610,14 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +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= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -11690,6 +13628,26 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-path@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" + integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + qs "^6.9.4" + query-string "^6.13.8" + +parse-url@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" + integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -11833,6 +13791,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -11894,6 +13859,16 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +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== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -11916,7 +13891,7 @@ pkg-conf@^1.1.2: object-assign "^4.0.1" symbol "^0.2.1" -pkg-dir@^4.1.0: +pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -12296,6 +14271,19 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.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" @@ -12322,6 +14310,13 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -12331,6 +14326,11 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + protobufjs@^6.10.2: version "6.11.2" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" @@ -12355,6 +14355,11 @@ protocol-buffers-schema@^3.3.1: resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz#8388e768d383ac8cbea23e1280dfadb79f4122ad" integrity sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw== +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" + integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== + protons@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.1.tgz#bfee5123c100001dcf56ab8f71b1b36f2e8289f1" @@ -12476,6 +14481,11 @@ pure-rand@^4.1.1: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-4.1.2.tgz#cbad2a3e3ea6df0a8d80d8ba204779b5679a5205" integrity sha512-uLzZpQWfroIqyFWmX/pl0OL2JHJdoU3dbh0dvZ25fChHFJJi56J5oQZhW6QgbT2Llwh1upki84LnTwlZvsungA== +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -12502,6 +14512,16 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +query-string@^6.13.8: + version "6.14.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -12517,6 +14537,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -12581,6 +14606,48 @@ react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +read-cmd-shim@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" + integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== + +read-package-json-fast@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz#2dcb24d9e8dd50fb322042c8c35a954e6cc7ac9e" + integrity sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-json@^3.0.0, read-package-json@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-3.0.1.tgz#c7108f0b9390257b08c21e3004d2404c806744b9" + integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^3.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-tree@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" + integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== + dependencies: + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + util-promisify "^2.1.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -12589,6 +14656,23 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -12598,6 +14682,32 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read@1, read@~1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + readable-stream@1.0.33: version "1.0.33" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.33.tgz#3a360dd66c1b1d7fd4705389860eda1d0f61126c" @@ -12628,7 +14738,7 @@ readable-stream@1.1.14, readable-stream@^1.0.33: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -12677,6 +14787,16 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + readdirp@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" @@ -12712,6 +14832,22 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redux-cli-logger@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz#7e546502a4b08c7fac4fe2faee2326a6326cb4a1" @@ -12918,7 +15054,7 @@ replace-ext@0.0.1: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= -request@^2.55.0, request@^2.79.0, request@^2.85.0, request@^2.88.2: +request@^2.55.0, request@^2.79.0, request@^2.85.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -12990,6 +15126,13 @@ reset@^0.1.0: resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" integrity sha1-n8cxQXGZWubLC35YsGznUir0uvs= +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -13012,7 +15155,7 @@ resolve@1.17.0, resolve@~1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -13060,7 +15203,7 @@ retimer@^2.0.0: resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== -retry@0.12.0: +retry@0.12.0, retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= @@ -13117,6 +15260,11 @@ rpc-websockets@^5.3.1: uuid "^3.4.0" ws "^5.2.2" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -13136,7 +15284,7 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@6, rxjs@^6.6.7: +rxjs@6, rxjs@^6.6.0, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -13250,7 +15398,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -13265,7 +15413,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -13387,6 +15535,13 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shallowequal@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -13434,7 +15589,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -13498,6 +15653,16 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slide@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" @@ -13551,6 +15716,23 @@ socketcluster-client@^14.2.1: uuid "3.2.1" ws "7.1.0" +socks-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" + integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA== + dependencies: + agent-base "6" + debug "4" + socks "^2.3.3" + +socks@^2.3.3: + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + solc@0.5.17: version "0.5.17" resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.17.tgz#8a76c50e98d49ca7610cca2fdc78ff3016540c67" @@ -13605,6 +15787,20 @@ solc@^0.6.3: semver "^5.5.0" tmp "0.0.33" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" + integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== + dependencies: + is-plain-obj "^2.0.0" + source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -13711,6 +15907,11 @@ spinnies@^0.5.1: cli-cursor "^3.0.0" strip-ansi "^5.2.0" +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -13718,6 +15919,20 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -13746,6 +15961,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -13806,6 +16028,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-argv@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -13942,6 +16169,11 @@ strip-bom@2.X, strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +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-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -13959,6 +16191,20 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -13974,6 +16220,15 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + sublevel-pouchdb@7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz#49e46cd37883bf7ff5006d7c5b9bcc7bcc1f422f" @@ -14126,7 +16381,7 @@ tape@^4.6.3: string.prototype.trim "~1.2.1" through "~2.3.8" -tar@^4, tar@^4.0.2: +tar@^4, tar@^4.0.2, tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -14139,6 +16394,34 @@ tar@^4, tar@^4.0.2: safe-buffer "^5.1.2" yallist "^3.0.3" +tar@^6.0.2, tar@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +temp-write@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" + integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== + dependencies: + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.3.2" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -14161,6 +16444,11 @@ testrpc@0.0.1: resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -14213,7 +16501,14 @@ through2@^0.6.0: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through@^2.3.8, through@~2.3.4, through@~2.3.8: +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +through@2, "through@>=2.2.7 <3", through@^2.3.4, 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= @@ -14369,11 +16664,33 @@ tough-cookie@^2.2.0, tough-cookie@^2.3.1, tough-cookie@~2.5.0: punycode "^2.1.1" universalify "^0.1.2" +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + tr46@~0.0.1: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -14534,6 +16851,11 @@ type-detect@4.0.8, 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.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -14544,6 +16866,16 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" @@ -14666,6 +16998,16 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== +uglify-js@^3.1.4: + version "3.13.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" + integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" @@ -14686,6 +17028,11 @@ ultron@~1.1.0: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== +umask@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -14711,6 +17058,20 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + unique-stream@^2.0.2: version "2.3.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" @@ -14726,6 +17087,11 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -14761,6 +17127,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" @@ -14847,6 +17218,13 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + dependencies: + object.getownpropertydescriptors "^2.0.3" + util.promisify@^1.0.0, util.promisify@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" @@ -14920,7 +17298,7 @@ valid-url@1.0.9: resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= -validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: 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== @@ -14928,6 +17306,13 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + value-or-promise@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.6.tgz#218aa4794aa2ee24dcf48a29aba4413ed584747f" @@ -14994,7 +17379,7 @@ vuvuzela@1.0.3: resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b" integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws= -wcwidth@^1.0.1: +wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= @@ -15520,6 +17905,11 @@ webidl-conversions@^2.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + websocket@1.0.32: version "1.0.32" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" @@ -15567,6 +17957,15 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" +whatwg-url@^8.4.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + dependencies: + lodash "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.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" @@ -15601,14 +18000,14 @@ which-typed-array@^1.1.2: has-symbols "^1.0.1" is-typed-array "^1.1.3" -which@1.3.1, which@^1.2.9: +which@1.3.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@2.0.2, which@^2.0.1: +which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -15639,6 +18038,11 @@ word-wrap@^1.2.3, word-wrap@~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== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + workerpool@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" @@ -15689,7 +18093,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: +write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -15698,7 +18102,7 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -15708,6 +18112,39 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-json-file@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" + integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.15" + make-dir "^2.1.0" + pify "^4.0.1" + sort-keys "^2.0.0" + write-file-atomic "^2.4.2" + +write-json-file@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" + integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== + dependencies: + detect-indent "^6.0.0" + graceful-fs "^4.1.15" + is-plain-obj "^2.0.0" + make-dir "^3.0.0" + sort-keys "^4.0.0" + write-file-atomic "^3.0.0" + +write-pkg@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== + dependencies: + sort-keys "^2.0.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" + write-stream@~0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1" @@ -15899,7 +18336,7 @@ yargs-parser@^2.4.0, yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.7" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== @@ -16015,6 +18452,19 @@ yargs@^15.0.2, yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.0.1.tgz#6a1ced4ed5ee0b388010ba9fd67af83b9362e0bb" + integrity sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"