diff --git a/.github/workflows/tests_and_checks.yml b/.github/workflows/tests_and_checks.yml index 3e70ef4c..1fbded19 100644 --- a/.github/workflows/tests_and_checks.yml +++ b/.github/workflows/tests_and_checks.yml @@ -1,8 +1,8 @@ name: Tests and checks on: pull_request jobs: - test: - name: App tests + unit_tests: + name: Unit Tests runs-on: ubuntu-latest steps: - name: Checkout repo @@ -10,7 +10,7 @@ jobs: - name: Set up node uses: actions/setup-node@v3 with: - node-version: 14 + node-version: 18 cache: 'yarn' - name: Install dependencies run: yarn install --immutable @@ -18,10 +18,37 @@ jobs: run: yarn lint - name: Run tests run: yarn test + env: + RPC_URL: ${{ secrets.RPC_URL }} + CHAIN_ID: 17000 + LOCATOR_DEVNET_ADDRESS: "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8" + WALLET_PRIVATE_KEY: ${{ secrets.WALLET_PRIVATE_KEY }} + + e2e_tests: + name: E2E Tests + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + - name: Set up node + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'yarn' + - name: Install dependencies + run: yarn install --immutable - name: Run e2e transports run: docker compose -f docker-compose.test.yml up -d + - name: Pull kapi + run: docker pull lidofinance/lido-keys-api:staging + - name: Pull psql + run: docker pull postgres:14-alpine - name: Run e2e tests run: yarn test:e2e env: RPC_URL: ${{ secrets.RPC_URL }} WALLET_PRIVATE_KEY: ${{ secrets.WALLET_PRIVATE_KEY }} + KEYS_API_URL: http://127.0.0.1:3000 + CHAIN_ID: 17000 + LOCATOR_DEVNET_ADDRESS: "0x28FAB2059C713A7F9D8c86Db49f9bb0e96Af1ef8" + diff --git a/hardhat.config.ts b/hardhat.config.ts new file mode 100644 index 00000000..70c8ad5f --- /dev/null +++ b/hardhat.config.ts @@ -0,0 +1,31 @@ +import { HardhatUserConfig } from 'hardhat/config'; +import * as dotenv from 'dotenv'; +dotenv.config(); + +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +const RPC_URL = process.env.RPC_URL!; +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +const secretKey = process.env.WALLET_PRIVATE_KEY!; +const CHAIN_ID = process.env.CHAIN_ID || '17000'; + +const config: HardhatUserConfig = { + networks: { + hardhat: { + forking: { + url: RPC_URL, + }, + chainId: parseInt(CHAIN_ID, 10), + accounts: [ + { + privateKey: secretKey, + balance: (BigInt(1e18) * BigInt(100)).toString(), + }, + ], + }, + }, + solidity: { + version: '0.8.4', + }, +}; + +export default config; diff --git a/package.json b/package.json index 0592193e..5aed3e1b 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "start:debug": "nest start --debug --watch", "start:prod": "node --max-old-space-size=4096 dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "test": "jest", + "test": "jest --detectOpenHandles", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "yarn cache:clear && jest --detectOpenHandles --forceExit --config ./test/jest-e2e.json", + "test:e2e": "yarn cache:clear && jest --detectOpenHandles --runInBand --forceExit --config ./test/jest-e2e.json", "typechain": "typechain --target=ethers-v5 --out-dir ./src/generated ./src/abi/*.json", "postinstall": "yarn typechain", "docker:build": "docker build -t $npm_package_config_dockerorg/$npm_package_name:$npm_package_version .", @@ -48,6 +48,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "compare-versions": "^6.1.0", + "dockerode": "^4.0.2", "ethers": "5.7.2", "glob": "^7.1.2", "kafkajs": "^1.15.0", @@ -67,7 +68,9 @@ "@nestjs/cli": "^8.2.5", "@nestjs/schematics": "^8.0.0", "@nestjs/testing": "^8.0.11", + "@nomicfoundation/hardhat-ethers": "^3.0.6", "@typechain/ethers-v5": "^7.1.2", + "@typechain/hardhat": "^9.1.0", "@types/app-root-path": "^1.2.4", "@types/cache-manager": "^3.4.3", "@types/glob": "^8.1.0", @@ -82,7 +85,9 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", "ganache": "7.9.0", + "hardhat": "^2.22.14", "jest": "^27.0.6", + "pg": "^8.13.0", "prettier": "^2.3.2", "supertest": "^6.1.3", "ts-jest": "^27.0.3", diff --git a/src/contracts/data-bus/data-bus.client.spec.ts b/src/contracts/data-bus/data-bus.client.spec.ts index 7ac0d44b..78aa7ecb 100644 --- a/src/contracts/data-bus/data-bus.client.spec.ts +++ b/src/contracts/data-bus/data-bus.client.spec.ts @@ -1,14 +1,7 @@ import { Block } from '@ethersproject/providers'; import { ethers } from 'ethers'; import { formatBytes32String } from 'ethers/lib/utils'; -import { Server } from 'ganache'; -import { - CHAIN_ID, - FORK_BLOCK, - GANACHE_PORT, - UNLOCKED_ACCOUNTS, -} from '../../../test/constants'; -import { makeServer } from '../../../test/server'; +import { TEST_SERVER_PORT } from './utils/constants'; import { DataBusClient } from './data-bus.client'; import { MessageDepositV1, @@ -19,6 +12,11 @@ import { MessagesNames, MessageUnvetV1, } from './data-bus.serializer'; +import { HardhatServer } from '../../../test/helpers/hardhat-server'; +import { accountImpersonate, setBalance } from '../../../test/helpers/provider'; +import { getSecurityOwner } from '../../../test/helpers/dsm'; + +jest.setTimeout(40_000); export const randomInt = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1)) + min; @@ -100,25 +98,30 @@ describe('DataBus', () => { let provider: ethers.providers.JsonRpcProvider; let owner: ethers.Signer; let sdk: DataBusClient; - let server: Server<'ethereum'>; let variants: ReturnType; + let hardhatServer: HardhatServer; + let dsmOwnerAddress: string; const setupServer = async () => { - server = makeServer(FORK_BLOCK, CHAIN_ID, UNLOCKED_ACCOUNTS, true); - await server.listen(GANACHE_PORT); + hardhatServer = new HardhatServer(); + await hardhatServer.start(); }; beforeEach(async () => { await setupServer(); + dsmOwnerAddress = await getSecurityOwner(); + await accountImpersonate(dsmOwnerAddress); + await setBalance(dsmOwnerAddress, 100); + // Set up Ganache provider (ensure Ganache is running on port 8545) provider = new ethers.providers.JsonRpcProvider( - 'http://localhost:' + GANACHE_PORT, + 'http://127.0.0.1:' + TEST_SERVER_PORT, ); variants = getVariants(await provider.getBlock('latest')); // Get the first account as the owner - const accounts = await provider.listAccounts(); - owner = provider.getSigner(accounts[0]); + // const accounts = await provider.listAccounts(); + owner = provider.getSigner(dsmOwnerAddress); //accounts[0]); // Deploy the DataBus contract from bytecode const dataBusBytecode = @@ -142,7 +145,7 @@ describe('DataBus', () => { }); afterEach(async () => { - await server.close(); + await hardhatServer.stop(); }); it('should measure gas for sendPingMessage', async () => { diff --git a/src/contracts/data-bus/utils/constants.ts b/src/contracts/data-bus/utils/constants.ts new file mode 100644 index 00000000..77e12188 --- /dev/null +++ b/src/contracts/data-bus/utils/constants.ts @@ -0,0 +1 @@ +export const TEST_SERVER_PORT = 8545; diff --git a/src/guardian/guardian-message/guardian-message.service.ts b/src/guardian/guardian-message/guardian-message.service.ts index c12ee496..543a82e7 100644 --- a/src/guardian/guardian-message/guardian-message.service.ts +++ b/src/guardian/guardian-message/guardian-message.service.ts @@ -74,6 +74,10 @@ export class GuardianMessageService { }); } + /** + * Sends an unvetting message to the message broker + * @param message - MessageUnvet object + */ public sendUnvetMessage(message: Omit) { return this.sendMessageFromGuardian({ ...message, diff --git a/src/guardian/guardian.service.ts b/src/guardian/guardian.service.ts index 9d388b6f..7af27436 100644 --- a/src/guardian/guardian.service.ts +++ b/src/guardian/guardian.service.ts @@ -213,8 +213,10 @@ export class GuardianService implements OnModuleInit { this.handleKeys(stakingModulesData, blockData, lidoKeys) .catch(this.logger.error) .finally(() => { - this.logger.log('End of unvetting and deposits processing by Guardian'); - endTimer() + this.logger.log( + 'End of unvetting and deposits processing by Guardian', + ); + endTimer(); }); } catch (error) { this.logger.error('Guardian cycle processing error'); diff --git a/src/keys-api/interfaces/SRModuleKeyListResponse.ts b/src/keys-api/interfaces/SRModuleKeyListResponse.ts new file mode 100644 index 00000000..cd198158 --- /dev/null +++ b/src/keys-api/interfaces/SRModuleKeyListResponse.ts @@ -0,0 +1,13 @@ +import { SRModule } from '.'; +import { ELBlockSnapshot } from './ELBlockSnapshot'; +import { RegistryKey } from './RegistryKey'; + +export type SRModuleKeyListResponse = { + data: { + keys: Array; + module: SRModule; + }; + meta: { + elBlockSnapshot: ELBlockSnapshot; + }; +}; diff --git a/src/keys-api/keys-api.service.ts b/src/keys-api/keys-api.service.ts index 538d3d50..e26b5141 100644 --- a/src/keys-api/keys-api.service.ts +++ b/src/keys-api/keys-api.service.ts @@ -8,6 +8,7 @@ import { Configuration } from 'common/config'; import { GroupedByModuleOperatorListResponse } from './interfaces/GroupedByModuleOperatorListResponse'; import { InconsistentLastChangedBlockHash } from 'common/custom-errors'; import { SRModuleListResponse } from './interfaces/SRModuleListResponse'; +import { SRModuleKeyListResponse } from './interfaces/SRModuleKeyListResponse'; import { ELBlockSnapshot } from './interfaces/ELBlockSnapshot'; import { DeepReadonly } from 'common/ts-utils'; @@ -157,6 +158,16 @@ export class KeysApiService { return result; } + /** + * The /v1/modules/{module_id}/keys endpoint returns full list of keys + */ + public async getModuleKeys(moduleId: number, opId: number) { + const result = await this.fetch( + `/v1/modules/${moduleId}/keys?operatorIndex=${opId}`, + ); + return result; + } + /** * Verifies the consistency of metadata by comparing hashes. * @param firstRequestHash - Hash of the first request diff --git a/src/provider/index.ts b/src/provider/index.ts index 4bf9bfdf..00d56c56 100644 --- a/src/provider/index.ts +++ b/src/provider/index.ts @@ -3,4 +3,4 @@ export * from './provider.constants'; export * from './provider.mock'; export * from './provider.module'; export * from './provider.service'; -export * from './provider.ganache'; +export * from './provider.test'; diff --git a/src/provider/provider.ganache.ts b/src/provider/provider.test.ts similarity index 78% rename from src/provider/provider.ganache.ts rename to src/provider/provider.test.ts index 053753cf..8c8d5efc 100644 --- a/src/provider/provider.ganache.ts +++ b/src/provider/provider.test.ts @@ -4,12 +4,12 @@ import { Configuration } from 'common/config'; import { RpcBatchProvider, RpcProvider } from './interfaces'; import { ProviderService } from './provider.service'; -export const GANACHE_PORT = 8545; -export const GANACHE_URL = `http://127.0.0.1:${GANACHE_PORT}`; +export const TEST_SERVER_PORT = 8545; +export const TEST_SERVER_URL = `http://127.0.0.1:${TEST_SERVER_PORT}`; const getProviderFactory = () => { return async (): Promise => { - class FormatterGanache extends Formatter { + class FormatterTest extends Formatter { blockTag(blockTag: any): any { if (typeof blockTag === 'object' && blockTag != null) { return 'latest'; @@ -24,25 +24,25 @@ const getProviderFactory = () => { static getFormatter(): Formatter { if (this._formatter == null) { - this._formatter = new FormatterGanache(); + this._formatter = new FormatterTest(); } return this._formatter; } clone() { - return new Provider(GANACHE_URL); + return new Provider(TEST_SERVER_URL); } } - return new Provider(GANACHE_URL); + return new Provider(TEST_SERVER_URL); }; }; @Module({}) -export class GanacheProviderModule { +export class TestProviderModule { static forRoot(): DynamicModule { return { - module: GanacheProviderModule, + module: TestProviderModule, global: true, providers: [ ProviderService, diff --git a/src/staking-module-data-collector/staking-module-data-collector.service.ts b/src/staking-module-data-collector/staking-module-data-collector.service.ts index afd1ee38..38239c64 100644 --- a/src/staking-module-data-collector/staking-module-data-collector.service.ts +++ b/src/staking-module-data-collector/staking-module-data-collector.service.ts @@ -210,6 +210,7 @@ export class StakingModuleDataCollectorService { (key) => !key.used && key.vetted && key.moduleAddress === stakingModuleAddress, ); + return vettedUnusedKeys; } } diff --git a/test/constants.ts b/test/constants.ts index fed8229e..65ea080f 100644 --- a/test/constants.ts +++ b/test/constants.ts @@ -1,4 +1,3 @@ -import { CHAINS } from '@lido-sdk/constants'; import { SecretKey } from '@chainsafe/blst'; import { fromHexString } from '@chainsafe/ssz'; @@ -9,38 +8,12 @@ export const TESTS_TIMEOUT = 30_000; // Needs to be higher on gh actions for reliable runs export const SLEEP_FOR_RESULT = 3_000; -// Addresses -export const SECURITY_MODULE = '0x808DE3b26Be9438F12E9B45528955EA94C17f217'; -// https://holesky.etherscan.io/address/0x808DE3b26Be9438F12E9B45528955EA94C17f217#readContract -// getOwner -export const SECURITY_MODULE_OWNER = - '0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d'; - -export const SECURITY_MODULE_V2 = '0x045dd46212a178428c088573a7d102b9d89a022a'; -// https://holesky.etherscan.io/address/0x045dd46212a178428c088573a7d102b9d89a022a#readContract -// getOwner -export const SECURITY_MODULE_OWNER_V2 = - '0xDA6bEE5441f2e6b364F3b25E85d5f3C29Bfb669E'; -export const STAKING_ROUTER = '0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229'; -export const NOP_REGISTRY = '0x595F64Ddc3856a3b5Ff4f4CC1d1fb4B46cFd2bAC'; -export const DEPOSIT_CONTRACT = '0x4242424242424242424242424242424242424242'; -export const SIMPLE_DVT = '0x11a93807078f8BB880c1BD0ee4C387537de4b4b6'; -export const CSM = '0x4562c3e63c2e586cD1651B958C22F88135aCAd4f'; -export const SANDBOX = '0xD6C2ce3BB8bea2832496Ac8b5144819719f343AC'; // Withdrawal credentials -export const LIDO_WC = - '0x010000000000000000000000f0179dec45a37423ead4fad5fcb136197872ead9'; export const BAD_WC = '0x010000000000000000000000b9d7934878b5fb9610b3fe8a5e441e8fad7e291f'; -// Fork node config -export const CHAIN_ID = CHAINS.Holesky; - -export const FORK_BLOCK = 1894357; -export const FORK_BLOCK_V2 = 1817726; -export const UNLOCKED_ACCOUNTS = [SECURITY_MODULE_OWNER]; -export const UNLOCKED_ACCOUNTS_V2 = [SECURITY_MODULE_OWNER_V2]; -export const GANACHE_PORT = 8545; +export const TEST_SERVER_PORT = 8545; +export const TEST_SERVER_URL = 'http://127.0.0.1:8545'; // BLS key for the validator export const BLS_PRIV_KEY = diff --git a/test/duplicates-v3.e2e-spec.ts b/test/duplicates-v3.e2e-spec.ts index 0140e624..917b6c2b 100644 --- a/test/duplicates-v3.e2e-spec.ts +++ b/test/duplicates-v3.e2e-spec.ts @@ -1,54 +1,43 @@ // Constants -import { - TESTS_TIMEOUT, - SLEEP_FOR_RESULT, - STAKING_ROUTER, - CHAIN_ID, - FORK_BLOCK, - GANACHE_PORT, - NOP_REGISTRY, - SIMPLE_DVT, - UNLOCKED_ACCOUNTS, -} from './constants'; - -// Contract Factories -import { StakingRouterAbi__factory } from '../src/generated'; - -// Mock rabbit straight away -jest.mock('../src/transport/stomp/stomp.client.ts'); - -jest.setTimeout(10_000); - -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; -import { getWalletAddress } from './helpers/deposit'; +import { SLEEP_FOR_RESULT, pk, sk } from './constants'; +import { setupTestingModule, initLevelDB } from './helpers/test-setup'; +import { getWalletAddress, signDeposit } from './helpers/deposit'; import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; import { ProviderService } from 'provider'; import { GuardianService } from 'guardian'; import { KeysApiService } from 'keys-api/keys-api.service'; import { SecurityService } from 'contracts/security'; -import { Server } from 'ganache'; import { GuardianMessageService } from 'guardian/guardian-message'; import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; -import { makeServer } from './server'; -import { addGuardians } from './helpers/dsm'; -import { BlsService } from 'bls'; -import { mockKey, mockKey2, mockKeyEvent } from './helpers/keys-fixtures'; import { - keysApiMockGetAllKeys, - keysApiMockGetModules, - mockedModuleCurated, - mockedModuleDvt, - mockMeta, -} from './helpers'; + addGuardians, + getGuardians, + getLidoWC, + getSecurityContract, + getSecurityOwner, +} from './helpers/dsm'; +import { BlsService } from 'bls'; import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; +import { accountImpersonate, testSetupProvider } from './helpers/provider'; +import { waitForNewerBlock, waitKAPIUpdateModulesKeys } from './helpers/kapi'; +import { truncateTables } from './helpers/pg'; +import { CuratedOnchainV1 } from './helpers/nor.contract'; +import { toHexString } from 'contracts/deposits-registry/crypto'; +import { getStakingModulesInfo } from './helpers/sr.contract'; +import { SecretKey } from '@chainsafe/blst'; +import { packNodeOperatorIds } from 'guardian/unvetting/bytes'; +import { HardhatServer } from './helpers/hardhat-server'; +import { + setupContainers, + startContainerIfNotRunning, +} from './helpers/docker-containers/utils'; +import { cutModulesKeys } from './helpers/reduce-keys'; + +jest.mock('../src/transport/stomp/stomp.client.ts'); +jest.setTimeout(100_000); -describe('Deposits in case of duplicates', () => { - let server: Server<'ethereum'>; +describe('Duplicates e2e tests', () => { let providerService: ProviderService; let keysApiService: KeysApiService; let guardianService: GuardianService; @@ -64,18 +53,8 @@ describe('Deposits in case of duplicates', () => { // methods mocks let sendDepositMessage: jest.SpyInstance; let sendUnvetMessage: jest.SpyInstance; - let sendPauseMessage: jest.SpyInstance; let unvetSigningKeys: jest.SpyInstance; - const setupServer = async () => { - server = makeServer(FORK_BLOCK, CHAIN_ID, UNLOCKED_ACCOUNTS); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians(); - }; - const setupMocks = () => { // broker messages sendDepositMessage = jest @@ -84,9 +63,6 @@ describe('Deposits in case of duplicates', () => { jest .spyOn(guardianMessageService, 'pingMessageBroker') .mockImplementation(() => Promise.resolve()); - sendPauseMessage = jest - .spyOn(guardianMessageService, 'sendPauseMessageV3') - .mockImplementation(() => Promise.resolve()); sendUnvetMessage = jest .spyOn(guardianMessageService, 'sendUnvetMessage') .mockImplementation(() => Promise.resolve()); @@ -102,12 +78,7 @@ describe('Deposits in case of duplicates', () => { .spyOn(depositIntegrityCheckerService, 'checkFinalizedRoot') .mockImplementation(() => Promise.resolve(true)); - // mock unvetting method of contract - // as we dont use real keys api and work with fixtures of operators and keys - // we cant make real unvetting - unvetSigningKeys = jest - .spyOn(securityService, 'unvetSigningKeys') - .mockImplementation(() => Promise.resolve(null as any)); + unvetSigningKeys = jest.spyOn(securityService, 'unvetSigningKeys'); }; const setupTestingServices = async (moduleRef) => { @@ -143,24 +114,108 @@ describe('Deposits in case of duplicates', () => { guardianService = moduleRef.get(GuardianService); }; - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); - - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); - }, 15000); - - test( - 'skip deposits for module if find duplicated key across operator', - async () => { + let stakingModulesAddresses: string[]; + let curatedModuleAddress: string; + let sdvtModuleAddress: string; + let stakingModulesCount: number; + let curatedFirstOperator: any; + let curatedSecondOperator: any; + let sdvtOperator: any; + let nor: CuratedOnchainV1; + let sdvt: CuratedOnchainV1; + const duplicatePK: Uint8Array = pk; + const duplicateSK: SecretKey = sk; + let duplicateDepositSignature: Uint8Array; + let guardianIndex: number; + let lidoWC: string; + + let postgresContainer; + let keysApiContainer; + let hardhatServer: HardhatServer; + + beforeAll(async () => { + const { kapi, psql } = await setupContainers(); + keysApiContainer = kapi; + postgresContainer = psql; + + await startContainerIfNotRunning(postgresContainer); + + hardhatServer = new HardhatServer(); + await hardhatServer.start(); + + console.log('Hardhat node is ready. Starting key cutting process...'); + await cutModulesKeys(); + + await startContainerIfNotRunning(keysApiContainer); + + await waitKAPIUpdateModulesKeys(); + + const securityModule = await getSecurityContract(); + const securityModuleOwner = await getSecurityOwner(); + await accountImpersonate(securityModuleOwner); + const oldGuardians = await getGuardians(); + await addGuardians({ + securityModuleAddress: securityModule.address, + securityModuleOwner, + }); + const newGuardians = await getGuardians(); + // TODO: read from contract by address + guardianIndex = newGuardians.length - 1; + expect(newGuardians.length).toEqual(oldGuardians.length + 1); + + ({ stakingModulesAddresses, curatedModuleAddress, sdvtModuleAddress } = + await getStakingModulesInfo()); + + stakingModulesCount = stakingModulesAddresses.length; + + // get two different active operators + nor = new CuratedOnchainV1(curatedModuleAddress); + sdvt = new CuratedOnchainV1(sdvtModuleAddress); + + const curatedActiveOperators = await nor.getActiveOperators(); + const sdvtActiveOperators = await sdvt.getActiveOperators(); + curatedFirstOperator = curatedActiveOperators[0]; + curatedSecondOperator = curatedActiveOperators[1]; + sdvtOperator = sdvtActiveOperators[0]; + + // create duplicate + lidoWC = await getLidoWC(); + const { signature } = await signDeposit(duplicatePK, duplicateSK, lidoWC); + duplicateDepositSignature = signature; + }, 200_000); + + afterAll(async () => { + await keysApiContainer.stop(); + await hardhatServer.stop(); + await postgresContainer.stop(); + }); + + describe('Duplicated key across operators of one modules', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - // Set deposit cache await levelDBService.setCachedEvents({ data: [], headers: { @@ -169,278 +224,172 @@ describe('Deposits in case of duplicates', () => { }, }); - const earliestKey = { - ...mockKey, - operatorIndex: 0, - moduleAddress: NOP_REGISTRY, - index: 0, - }; - const duplicates = [ - earliestKey, - { ...mockKey, operatorIndex: 0, moduleAddress: NOP_REGISTRY, index: 1 }, - { ...mockKey, operatorIndex: 0, moduleAddress: NOP_REGISTRY, index: 2 }, - ]; - // Mock Keys API - const vettedUnusedKeys = [ - ...duplicates, - { - ...mockKey2, - moduleAddress: SIMPLE_DVT, - }, - ]; - - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, vettedUnusedKeys, meta); - - // mock events cache to check await signingKeysRegistryService.setCachedEvents({ - data: [], // dont need events in this test + data: [], headers: { - startBlock: currentBlock.number - 2, + startBlock: currentBlock.number, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( + test('add unused unvetted key to first operator of the first module', async () => { + // 1 module is Curated v1 onchain + const currentBlock = await providerService.provider.getBlock('latest'); + + await nor.addSigningKey( + curatedFirstOperator.index, 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedFirstOperator.rewardAddress, ); - expect(isOnPause).toBe(false); - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - const walletAddress = getWalletAddress(); - // just skip on this iteration deposit for Curated staking module - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendUnvetMessage).toBeCalledTimes(1); - expect(sendUnvetMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000001', - }), - ); - expect(unvetSigningKeys).toBeCalledTimes(1); + await waitForNewerBlock(currentBlock.number); + }); - // Mine a new block - await providerService.provider.send('evm_mine', []); + test('add duplicate key to first operator of the first module', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); - // after deleting duplicates in staking module, - // council will resume deposits to module - const unusedKeysWithoutDuplicates = [ - earliestKey, - { - ...mockKey2, - moduleAddress: SIMPLE_DVT, - }, - ]; - - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - expect(newBlock.number).toBeGreaterThan(currentBlock.number); - - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys( - keysApiService, - unusedKeysWithoutDuplicates, - newMeta, + await nor.addSigningKey( + curatedSecondOperator.index, + 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedSecondOperator.rewardAddress, ); - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); + await waitForNewerBlock(currentBlock.number); + }); + + test('no unvetting', async () => { await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage.mock.calls[0][0]).toEqual( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage.mock.calls[1][0]).toEqual( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); expect(sendUnvetMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); + }); + + test('deposits work', async () => { + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); - test( - 'skip deposits for module if find duplicated key across operators of two modules', - async () => { + test('increase staking limit for the first operator', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = getWalletAddress(); - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - const duplicates = [ - { ...mockKey, moduleAddress: NOP_REGISTRY }, - { - ...mockKey, - moduleAddress: SIMPLE_DVT, - }, - ]; + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + // as modules have the same amount of keys + await nor.setStakingLimit(curatedFirstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); + test('no unvetting after staking limit increase for the first operator', async () => { + await guardianService.handleNewBlock(); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - await signingKeysRegistryService.setCachedEvents({ - data: [ - mockKeyEvent, - // key of second module was added later - { - ...mockKeyEvent, - moduleAddress: SIMPLE_DVT, - blockNumber: mockKeyEvent.blockNumber + 1, - blockHash: 'somefakehash', - }, - ], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); + expect(sendUnvetMessage).toBeCalledTimes(0); + expect(unvetSigningKeys).toBeCalledTimes(0); + }); - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); + test('deposits work', async () => { + // second iteration of deposits + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount * 2); + }); + + test('increase staking limit for the second operator', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(curatedSecondOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for nor operator before unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Check staking limit for sdvt operator before unvetting', async () => { + const op = await nor.getOperator(curatedSecondOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + test('unvetting happen', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + const walletAddress = await getWalletAddress(); - // just skip on this iteration deposit for Curated staking module - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - // check that duplicates problem didn't trigger pause - expect(sendPauseMessage).toBeCalledTimes(0); + // unvetting for second module expect(sendUnvetMessage).toBeCalledTimes(1); expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000000', + guardianIndex: guardianIndex, + stakingModuleId: 1, + operatorIds: packNodeOperatorIds([curatedSecondOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', }), ); + expect(unvetSigningKeys).toBeCalledTimes(1); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 1, + packNodeOperatorIds([curatedSecondOperator.index]), + '0x00000000000000000000000000000003', + expect.any(Object), + ); + }, 60_000); - // after deleting duplicates in staking module, - // council will resume deposits to module - const unusedKeysWithoutDuplicates = [ - { ...mockKey, moduleAddress: NOP_REGISTRY }, - ]; - - // Mine a new block - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys( - keysApiService, - unusedKeysWithoutDuplicates, - newMeta, + test('no deposits for module', async () => { + // 8 prev + 3 new + expect(sendDepositMessage).toBeCalledTimes( + stakingModulesCount * 2 + stakingModulesCount - 1, ); + }); - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); - sendPauseMessage.mockClear(); + test('Check staking limit for nor operator after unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); - await guardianService.handleNewBlock(); + test('Check staking limit for sdvt operator after unvetting', async () => { + const op = await nor.getOperator(curatedSecondOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); + }); + }); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + describe('Duplicate created for already deposited key', () => { + let snapshotId: number; - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'skip deposits for module if find duplicated key across operators of one modules', - async () => { + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); await levelDBService.setCachedEvents({ data: [], @@ -450,136 +399,129 @@ describe('Deposits in case of duplicates', () => { }, }); - const duplicates = [ - { ...mockKey, index: 0, operatorIndex: 0 }, - { - ...mockKey, - index: 0, - operatorIndex: 1, - }, - ]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - await signingKeysRegistryService.setCachedEvents({ - data: [ - { - ...mockKeyEvent, - blockNumber: currentBlock.number - 4, - blockHash: 'somefakehash1', - operatorIndex: 0, - }, - // key of second operator was added later - { - ...mockKeyEvent, - blockNumber: currentBlock.number - 3, - blockHash: 'somefakehash2', - operatorIndex: 1, - }, - ], + data: [], headers: { - startBlock: currentBlock.number - 5, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + startBlock: currentBlock.number, + endBlock: currentBlock.number, + stakingModulesAddresses, }, }); + }); - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( + test('Add unused unvetted key for the first operator of the first module', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // TODO: better to create new key, deposit it and than create duplicaate on it + // as 0 key of operator is not necessary should be deposited + const { + data: { keys }, + } = await keysApiService.getModuleKeys(1, 0); + + const publicKey = keys[0].key; + const depositSignature = keys[0].depositSignature; + + await nor.addSigningKey( + curatedFirstOperator.index, 1, + publicKey, + depositSignature, + curatedFirstOperator.rewardAddress, ); - expect(isOnPause).toBe(false); - await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); + }); + test('No unvetting', async () => { + await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - // just skip on this iteration deposit for Curated staking module - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - // check that duplicates problem didnt trigger pause - expect(sendPauseMessage).toBeCalledTimes(0); + expect(sendUnvetMessage).toBeCalledTimes(0); + }); + + test('Deposits work', async () => { + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + + test('Increase staking limit for the first operator', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(curatedFirstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for nor operator', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Unvetting happen for first operator', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); + const walletAddress = await getWalletAddress(); + + // unvetting for second module expect(sendUnvetMessage).toBeCalledTimes(1); expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, + guardianIndex: guardianIndex, stakingModuleId: 1, - operatorIds: '0x0000000000000001', - vettedKeysByOperator: '0x00000000000000000000000000000000', + operatorIds: packNodeOperatorIds([curatedFirstOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', }), ); + expect(unvetSigningKeys).toBeCalledTimes(1); - expect(sendPauseMessage).toBeCalledTimes(0); - - // after deleting duplicates in staking module, - // council will resume deposits to module - const noDuplicatesKeys = [{ ...mockKey, operatorIndex: 0 }]; - - // Mine a new block - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, noDuplicatesKeys, newMeta); - - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); - sendPauseMessage.mockClear(); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 1, + packNodeOperatorIds([curatedFirstOperator.index]), + '0x00000000000000000000000000000003', + expect.any(Object), + ); + }); - await guardianService.handleNewBlock(); + test('no deposits for module', async () => { + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount - 1); + }); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + test('Check staking limit for nor operator after unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); + }); + }); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); + describe('Duplicated key one operator of one modules', () => { + let snapshotId: number; - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'added unused keys for that deposit was already made', - async () => { + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = getWalletAddress(); await levelDBService.setCachedEvents({ data: [], @@ -589,183 +531,129 @@ describe('Deposits in case of duplicates', () => { }, }); - const duplicates = [ - { ...mockKey, operatorIndex: 0, used: true }, - { - ...mockKey, - operatorIndex: 1, - used: false, - }, - ]; - - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - await signingKeysRegistryService.setCachedEvents({ data: [], headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + startBlock: currentBlock.number, + endBlock: currentBlock.number, + stakingModulesAddresses, }, }); + }); - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, + test('Add unused unvetted duplicated key to first operator', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + await nor.addSigningKey( + curatedFirstOperator.index, + 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedFirstOperator.rewardAddress, ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( + + await nor.addSigningKey( + curatedFirstOperator.index, 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedFirstOperator.rewardAddress, ); - expect(isOnPause).toBe(false); - await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); + }); + test('No unvetting', async () => { + await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - // deposit will be skipped until unvetting - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); + expect(sendUnvetMessage).toBeCalledTimes(0); + }); + + test('Deposits work', async () => { + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + + test('Increase staking limit for the first operator', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 5 + await nor.setStakingLimit(curatedFirstOperator.index, 5); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for nor operator after unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(5); + }); + + test('Unvetting happen', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await guardianService.handleNewBlock(); + + await waitForNewerBlock(currentBlock.number); + + const walletAddress = await getWalletAddress(); + + // unvetting for second module expect(sendUnvetMessage).toBeCalledTimes(1); expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, + guardianIndex: guardianIndex, stakingModuleId: 1, - operatorIds: '0x0000000000000001', - vettedKeysByOperator: '0x00000000000000000000000000000000', + operatorIds: packNodeOperatorIds([curatedFirstOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000004', }), ); expect(unvetSigningKeys).toBeCalledTimes(1); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 1, + packNodeOperatorIds([curatedFirstOperator.index]), + '0x00000000000000000000000000000004', + expect.any(Object), + ); + }); - // after deleting duplicates in staking module, - // council will resume deposits to module - const noDuplicatesKeys = [{ ...mockKey, operatorIndex: 0, used: true }]; - // Mine a new block - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); + test('No deposits for module', async () => { + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount - 1); + }); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, noDuplicatesKeys, newMeta); + test('Check staking limit for nor operator after unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + }); - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); - sendPauseMessage.mockClear(); + describe('Duplicated key across operators of two modules', () => { + let snapshotId: number; - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test('adding not vetted duplicate will not set on soft pause module', async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - const duplicates = [ - { ...mockKey, index: 0, operatorIndex: 1, used: false, vetted: true }, - { - ...mockKey, - index: 1, - operatorIndex: 1, - used: false, - vetted: false, - }, - ]; - - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(unvetSigningKeys).toBeCalledTimes(0); - }); + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); - test( - 'skip deposits if cannot resolve duplicates', - async () => { + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); await levelDBService.setCachedEvents({ data: [], @@ -775,102 +663,165 @@ describe('Deposits in case of duplicates', () => { }, }); - const duplicates = [ - { ...mockKey, moduleAddress: NOP_REGISTRY }, - { - ...mockKey, - moduleAddress: SIMPLE_DVT, - }, - ]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - await signingKeysRegistryService.setCachedEvents({ - data: [mockKeyEvent], + data: [], headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + startBlock: currentBlock.number, + endBlock: currentBlock.number, + stakingModulesAddresses, }, }); + }); - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, + test('add unused unvetted key to the first operator of the NOR contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await nor.addSigningKey( + curatedFirstOperator.index, + 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedFirstOperator.rewardAddress, ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( + + await waitForNewerBlock(currentBlock.number); + }); + + test('add duplicate key to the first operator of the SDVT contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + await sdvt.addSigningKey( + sdvtOperator.index, 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + sdvtOperator.rewardAddress, ); - expect(isOnPause).toBe(false); + await waitForNewerBlock(currentBlock.number); + }); + + test('no unvetting', async () => { await guardianService.handleNewBlock(); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + + expect(sendUnvetMessage).toBeCalledTimes(0); + }); + + test('deposits work', async () => { + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + test('increase staking limit for op = 0', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(curatedFirstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('no unvetting after staking limit increase for 0 operator of NOR contract', async () => { + await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - // just skip on this iteration deposit for Curated staking module - expect(sendDepositMessage).toBeCalledTimes(0); - // check that duplicates problem didnt trigger pause - expect(sendPauseMessage).toBeCalledTimes(0); expect(sendUnvetMessage).toBeCalledTimes(0); expect(unvetSigningKeys).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - - // after deleting duplicates in staking module, - // council will resume deposits to module - await providerService.provider.send('evm_mine', []); - const noDuplicatesKeys = [{ ...mockKey, moduleAddress: NOP_REGISTRY }]; - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, noDuplicatesKeys, newMeta); - - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); - sendPauseMessage.mockClear(); + }); + test('deposits work', async () => { + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount); + }); + + test('increase staking limit for the first operator of SDVT contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await sdvt.setStakingLimit(sdvtOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for nor operator before unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Check staking limit for sdvt operator before unvetting', async () => { + const op = await sdvt.getOperator(sdvtOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('unvetting happen', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + const walletAddress = await getWalletAddress(); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( + // unvetting for second module + expect(sendUnvetMessage).toBeCalledTimes(1); + expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ - blockNumber: newBlock.number, + blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, + guardianIndex: guardianIndex, + stakingModuleId: 2, + operatorIds: packNodeOperatorIds([sdvtOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', }), ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), + expect(unvetSigningKeys).toBeCalledTimes(1); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 2, + packNodeOperatorIds([sdvtOperator.index]), + '0x00000000000000000000000000000003', + expect.any(Object), ); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'if duplicates in both modules, skip deposits for modules and unvet only for first on first iteration', - async () => { + }); + + test('no deposits for module', async () => { + expect(sendDepositMessage).toBeCalledTimes(3 * stakingModulesCount - 1); + }); + + test('Check staking limit for nor operator after unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Check staking limit for sdvt operator after unvetting', async () => { + const op = await sdvt.getOperator(sdvtOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); + }); + }); + + describe('Unvetting in two modules', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - // await providerService.provider.send('evm_mine', []); - // Set deposit cache await levelDBService.setCachedEvents({ data: [], headers: { @@ -879,91 +830,179 @@ describe('Deposits in case of duplicates', () => { }, }); - const earliestKey = { - ...mockKey, - operatorIndex: 0, - moduleAddress: NOP_REGISTRY, - index: 0, - }; - const duplicatesСurated = [ - earliestKey, - { ...mockKey, operatorIndex: 0, moduleAddress: NOP_REGISTRY, index: 1 }, - { ...mockKey, operatorIndex: 0, moduleAddress: NOP_REGISTRY, index: 2 }, - ]; - - const duplicatesSimpleDVT = [ - { - ...mockKey2, - operatorIndex: 0, - moduleAddress: SIMPLE_DVT, - index: 0, - }, - { - ...mockKey2, - operatorIndex: 0, - moduleAddress: SIMPLE_DVT, - index: 1, - }, - ]; - - // Mock Keys API - const vettedUnusedKeys = [...duplicatesСurated, ...duplicatesSimpleDVT]; - - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, vettedUnusedKeys, meta); - - // mock events cache to check await signingKeysRegistryService.setCachedEvents({ - data: [], // dont need events in this test + data: [], headers: { - startBlock: currentBlock.number - 2, + startBlock: currentBlock.number, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); + + test('add unused unvetted key to op = 0 of nor contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, + // add two keys + // key with smaller index will be considered across one operator as original + await nor.addSigningKey( + curatedFirstOperator.index, + 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedFirstOperator.rewardAddress, ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( + await nor.addSigningKey( + curatedFirstOperator.index, 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + curatedFirstOperator.rewardAddress, ); - expect(isOnPause).toBe(false); - await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); + }); + + test('add duplicate key to op = 0 of SDVT contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + await sdvt.addSigningKey( + sdvtOperator.index, + 1, + toHexString(duplicatePK), + toHexString(duplicateDepositSignature), + sdvtOperator.rewardAddress, + ); + + await waitForNewerBlock(currentBlock.number); + }); + + test('no unvetting', async () => { + await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - const walletAddress = getWalletAddress(); - // just skip on this iteration deposit for Curated staking module - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( + expect(sendUnvetMessage).toBeCalledTimes(0); + }); + + test('deposits work', async () => { + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + + test('increase staking limit for op = 0 of NOR contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(curatedFirstOperator.index, 5); + await waitForNewerBlock(currentBlock.number); + }); + + test('increase staking limit for op = 0 of SDVT contract', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await sdvt.setStakingLimit(sdvtOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for nor operator before unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(5); + }); + + test('Check staking limit for sdvt operator before unvetting', async () => { + const op = await sdvt.getOperator(sdvtOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('unvetting happen in first module', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); + + const walletAddress = await getWalletAddress(); + + // unvetting for second module + expect(sendUnvetMessage).toBeCalledTimes(1); + expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, + guardianIndex, + stakingModuleId: 1, + operatorIds: packNodeOperatorIds([curatedFirstOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000004', }), ); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendUnvetMessage).toBeCalledTimes(1); + + expect(unvetSigningKeys).toBeCalledTimes(1); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 1, + packNodeOperatorIds([curatedFirstOperator.index]), + '0x00000000000000000000000000000004', + expect.any(Object), + ); + }); + + test('no deposits for module for both modules', async () => { + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount - 2); + }); + + test('Check staking limit for nor operator after unvetting', async () => { + const op = await nor.getOperator(curatedFirstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Unvetting for sdvt didnt happen, staking limit the same', async () => { + const op = await sdvt.getOperator(sdvtOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Unvetting happen in second module', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await guardianService.handleNewBlock(); + await waitForNewerBlock(currentBlock.number); + + const walletAddress = await getWalletAddress(); + + // unvetting for second module + // it is already second unvetting during test + expect(sendUnvetMessage).toBeCalledTimes(2); expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000001', + guardianIndex, + stakingModuleId: 2, + operatorIds: packNodeOperatorIds([sdvtOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', }), ); - }, - TESTS_TIMEOUT, - ); + + expect(unvetSigningKeys).toBeCalledTimes(2); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 2, + packNodeOperatorIds([sdvtOperator.index]), + '0x00000000000000000000000000000003', + expect.any(Object), + ); + }); + + test('Staking limit for sdvt after unvetting', async () => { + const op = await sdvt.getOperator(sdvtOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); + }); + + test('Deposits again work for first module, but not for second', async () => { + expect(sendDepositMessage).toBeCalledTimes( + 3 * stakingModulesCount - 2 - 1, + ); + }); + }); }); diff --git a/test/duplicates.e2e-spec.ts b/test/duplicates.e2e-spec.ts deleted file mode 100644 index 7ce4d974..00000000 --- a/test/duplicates.e2e-spec.ts +++ /dev/null @@ -1,521 +0,0 @@ -import { - mockMeta, - keysApiMockGetModules, - keysApiMockGetAllKeys, - mockedModuleCurated, - mockedModuleDvt, -} from './helpers'; - -// Constants -import { - TESTS_TIMEOUT, - SLEEP_FOR_RESULT, - STAKING_ROUTER, - CHAIN_ID, - GANACHE_PORT, - NOP_REGISTRY, - SIMPLE_DVT, - UNLOCKED_ACCOUNTS_V2, - FORK_BLOCK_V2, - SECURITY_MODULE_V2, - SECURITY_MODULE_OWNER_V2, -} from './constants'; - -// Contract Factories -import { StakingRouterAbi__factory } from './../src/generated'; - -// Mock rabbit straight away -jest.mock('../src/transport/stomp/stomp.client.ts'); - -jest.setTimeout(10_000); - -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; -import { getWalletAddress } from './helpers/deposit'; -import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; -import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; -import { ProviderService } from 'provider'; -import { GuardianService } from 'guardian'; -import { KeysApiService } from 'keys-api/keys-api.service'; -import { Server } from 'ganache'; -import { GuardianMessageService } from 'guardian/guardian-message'; -import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; -import { addGuardians } from './helpers/dsm'; -import { makeServer } from './server'; -import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; -import { BlsService } from 'bls'; -import { mockKey, mockKey2, mockKeyEvent } from './helpers/keys-fixtures'; - -describe('ganache e2e tests', () => { - let server: Server<'ethereum'>; - let providerService: ProviderService; - let keysApiService: KeysApiService; - let guardianService: GuardianService; - let sendDepositMessage: jest.SpyInstance; - let sendPauseMessage: jest.SpyInstance; - let levelDBService: DepositsRegistryStoreService; - let signKeyLevelDBService: SignKeyLevelDBService; - let signingKeysRegistryService: SigningKeysRegistryService; - let guardianMessageService: GuardianMessageService; - let depositIntegrityCheckerService: DepositIntegrityCheckerService; - - const setupServer = async () => { - server = makeServer(FORK_BLOCK_V2, CHAIN_ID, UNLOCKED_ACCOUNTS_V2); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians({ - securityModule: SECURITY_MODULE_V2, - securityModuleOwner: SECURITY_MODULE_OWNER_V2, - }); - }; - - const setupMocks = () => { - // broker messages - sendDepositMessage = jest - .spyOn(guardianMessageService, 'sendDepositMessage') - .mockImplementation(() => Promise.resolve()); - jest - .spyOn(guardianMessageService, 'pingMessageBroker') - .mockImplementation(() => Promise.resolve()); - sendPauseMessage = jest - .spyOn(guardianMessageService, 'sendPauseMessageV3') - .mockImplementation(() => Promise.resolve()); - - // deposit cache mocks - jest - .spyOn(depositIntegrityCheckerService, 'putEventsToTree') - .mockImplementation(() => Promise.resolve()); - jest - .spyOn(depositIntegrityCheckerService, 'checkLatestRoot') - .mockImplementation(() => Promise.resolve(true)); - jest - .spyOn(depositIntegrityCheckerService, 'checkFinalizedRoot') - .mockImplementation(() => Promise.resolve(true)); - }; - - const setupTestingServices = async (moduleRef) => { - // leveldb service - levelDBService = moduleRef.get(DepositsRegistryStoreService); - signKeyLevelDBService = moduleRef.get(SignKeyLevelDBService); - - await initLevelDB(levelDBService, signKeyLevelDBService); - - // deposit events related services - depositIntegrityCheckerService = moduleRef.get( - DepositIntegrityCheckerService, - ); - - const blsService = moduleRef.get(BlsService); - await blsService.onModuleInit(); - - // keys events service - signingKeysRegistryService = moduleRef.get(SigningKeysRegistryService); - - providerService = moduleRef.get(ProviderService); - - // keys api servies - keysApiService = moduleRef.get(KeysApiService); - - // rabbitmq message sending methods - guardianMessageService = moduleRef.get(GuardianMessageService); - - // main service that check keys and make decision - guardianService = moduleRef.get(GuardianService); - }; - - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); - - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); - }); - - test( - 'skip deposit if find duplicated key', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - // Keys api mock - const duplicates = [ - { ...mockKey, index: 0 }, - { ...mockKey, index: 1 }, - { ...mockKey, index: 2 }, - { ...mockKey2, moduleAddress: SIMPLE_DVT }, - ]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - // just skip on this iteration deposit for Curated staking module - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - - // after deleting duplicates in staking module, - // council will resume deposits to module - const unusedKeysWithoutDuplicates = [ - { ...mockKey, index: 0, moduleAddress: NOP_REGISTRY }, - { ...mockKey2, index: 0, moduleAddress: SIMPLE_DVT }, - ]; - - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys( - keysApiService, - unusedKeysWithoutDuplicates, - newMeta, - ); - - sendDepositMessage.mockClear(); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - }, - TESTS_TIMEOUT, - ); - - test( - 'skip deposit if find duplicated key in another staking module', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - // Keys api mock - const duplicates = [ - { ...mockKey, index: 0, moduleAddress: NOP_REGISTRY }, - { ...mockKey, index: 0, moduleAddress: SIMPLE_DVT }, - ]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - - await signingKeysRegistryService.setCachedEvents({ - data: [ - mockKeyEvent, - { - ...mockKeyEvent, - moduleAddress: SIMPLE_DVT, - blockNumber: mockKeyEvent.blockNumber + 1, - }, - ], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - - await providerService.provider.send('evm_mine', []); - // after deleting duplicates in staking module, - // council will resume deposits to module - const unusedKeysWithoutDuplicates = [ - { ...mockKey, index: 0, moduleAddress: NOP_REGISTRY }, - { - ...mockKey2, - moduleAddress: SIMPLE_DVT, - }, - ]; - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys( - keysApiService, - unusedKeysWithoutDuplicates, - newMeta, - ); - - sendDepositMessage.mockClear(); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - }, - TESTS_TIMEOUT, - ); - - test( - 'added unused keys for that deposit was already made', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - // Keys api mock - const duplicates = [ - { ...mockKey, used: true }, - { - ...mockKey, - moduleAddress: SIMPLE_DVT, - used: false, - }, - ]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - // Check that module was not paused - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendPauseMessage).toBeCalledTimes(0); - - // after deleting duplicates in staking module, - // council will resume deposits to module - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const keysWithoutDulicates = [{ ...mockKey, used: true }]; - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keysWithoutDulicates, newMeta); - - sendDepositMessage.mockClear(); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - }, - TESTS_TIMEOUT, - ); - - test('adding not vetted duplicate will not set on soft pause module', async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - const walletAddress = await getWalletAddress(); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - // Keys api mock - const duplicates = [ - { ...mockKey, index: 0, operatorIndex: 0, used: false, vetted: true }, - { - ...mockKey, - index: 1, - operatorIndex: 0, - used: false, - vetted: false, - }, - ]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, duplicates, meta); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number - 1, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - }); -}); diff --git a/test/front-run-v3.e2e-spec.ts b/test/front-run-v3.e2e-spec.ts index 660857ef..3e0ae90f 100644 --- a/test/front-run-v3.e2e-spec.ts +++ b/test/front-run-v3.e2e-spec.ts @@ -2,32 +2,9 @@ import { toHexString } from '@chainsafe/ssz'; // Helpers -import { - keysApiMockGetAllKeys, - keysApiMockGetModules, - mockedKeysApiFind, - mockedModuleCurated, - mockedModuleDvt, - mockMeta, -} from './helpers'; // Constants -import { - TESTS_TIMEOUT, - SLEEP_FOR_RESULT, - LIDO_WC, - BAD_WC, - CHAIN_ID, - FORK_BLOCK, - GANACHE_PORT, - sk, - pk, - NOP_REGISTRY, - SIMPLE_DVT, - UNLOCKED_ACCOUNTS, - SECURITY_MODULE, - NO_PRIVKEY_MESSAGE, -} from './constants'; +import { SLEEP_FOR_RESULT, BAD_WC, sk, pk } from './constants'; // Contract Factories import { SecurityAbi__factory } from '../src/generated'; @@ -35,39 +12,51 @@ import { SecurityAbi__factory } from '../src/generated'; // BLS helpers // App modules and services -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; -import { SecurityService } from 'contracts/security'; +import { setupTestingModule, initLevelDB } from './helpers/test-setup'; import { GuardianService } from 'guardian'; import { KeysApiService } from 'keys-api/keys-api.service'; import { ProviderService } from 'provider'; -import { Server } from 'ganache'; import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; import { GuardianMessageService } from 'guardian/guardian-message'; import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; -import { makeServer } from './server'; -import { addGuardians } from './helpers/dsm'; +import { + addGuardians, + deposit, + getGuardians, + getLidoWC, + getSecurityContract, + getSecurityOwner, +} from './helpers/dsm'; import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; import { BlsService } from 'bls'; -import { makeDeposit, signDeposit } from './helpers/deposit'; -import { mockKey, mockKey2 } from './helpers/keys-fixtures'; -import { ethers } from 'ethers'; +import { getWalletAddress, makeDeposit, signDeposit } from './helpers/deposit'; +import { CuratedOnchainV1 } from './helpers/nor.contract'; +import { + waitForNewerBlock, + waitForNewerOrEqBlock, + waitKAPIUpdateModulesKeys, +} from './helpers/kapi'; +import { truncateTables } from './helpers/pg'; +import { accountImpersonate, testSetupProvider } from './helpers/provider'; +import { SecretKey } from '@chainsafe/blst'; +import { getStakingModulesInfo } from './helpers/sr.contract'; +import { packNodeOperatorIds } from 'guardian/unvetting/bytes'; +import { + setupContainers, + startContainerIfNotRunning, +} from './helpers/docker-containers/utils'; +import { HardhatServer } from './helpers/hardhat-server'; +import { cutModulesKeys } from './helpers/reduce-keys'; // Mock rabbit straight away jest.mock('../src/transport/stomp/stomp.client.ts'); +jest.setTimeout(100_000); -jest.setTimeout(10_000); - -describe('ganache e2e tests', () => { - let server: Server<'ethereum'>; +describe('Front-run e2e tests', () => { let providerService: ProviderService; let keysApiService: KeysApiService; let guardianService: GuardianService; - let securityService: SecurityService; let levelDBService: DepositsRegistryStoreService; let signKeyLevelDBService: SignKeyLevelDBService; let guardianMessageService: GuardianMessageService; @@ -78,16 +67,6 @@ describe('ganache e2e tests', () => { let sendDepositMessage: jest.SpyInstance; let sendPauseMessage: jest.SpyInstance; let sendUnvetMessage: jest.SpyInstance; - let unvetSigningKeys: jest.SpyInstance; - - const setupServer = async () => { - server = makeServer(FORK_BLOCK, CHAIN_ID, UNLOCKED_ACCOUNTS); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians(); - }; const setupTestingServices = async (moduleRef) => { // leveldb service @@ -109,9 +88,6 @@ describe('ganache e2e tests', () => { providerService = moduleRef.get(ProviderService); - // dsm methods and council sign services - securityService = moduleRef.get(SecurityService); - // keys api servies keysApiService = moduleRef.get(KeysApiService); @@ -147,56 +123,113 @@ describe('ganache e2e tests', () => { jest .spyOn(depositIntegrityCheckerService, 'checkFinalizedRoot') .mockImplementation(() => Promise.resolve(true)); - - // mock unvetting method of contract - // as we dont use real keys api and work with fixtures of operators and keys - // we cant make real unvetting - unvetSigningKeys = jest - .spyOn(securityService, 'unvetSigningKeys') - .mockImplementation(() => Promise.resolve(null as any)); }; - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); - - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); - }); - - test( - 'node operator deposit frontrun, 2 modules in staking router', - async () => { + let stakingModulesAddresses: string[]; + let curatedModuleAddress: string; + let stakingModulesCount: number; + let firstOperator: any; + let nor: CuratedOnchainV1; + const frontrunPK: Uint8Array = pk; + const frontrunSK: SecretKey = sk; + let lidoDepositSignature: Uint8Array; + let guardianIndex: number; + let lidoWC: string; + let lidoDepositData: { + signature: Uint8Array; + pubkey: Uint8Array; + withdrawalCredentials: Uint8Array; + amount: number; + }; + let securityModuleAddress: string; + + let postgresContainer; + let keysApiContainer; + let hardhatServer: HardhatServer; + + beforeAll(async () => { + const { kapi, psql } = await setupContainers(); + keysApiContainer = kapi; + postgresContainer = psql; + + await startContainerIfNotRunning(postgresContainer); + + hardhatServer = new HardhatServer(); + await hardhatServer.start(); + + console.log('Hardhat node is ready. Starting key cutting process...'); + await cutModulesKeys(); + + await startContainerIfNotRunning(keysApiContainer); + + await waitKAPIUpdateModulesKeys(); + + const securityModule = await getSecurityContract(); + const securityModuleOwner = await getSecurityOwner(); + await accountImpersonate(securityModuleOwner); + const oldGuardians = await getGuardians(); + securityModuleAddress = securityModule.address; + await addGuardians({ + securityModuleAddress, + securityModuleOwner, + }); + + const newGuardians = await getGuardians(); + // TODO: read from contract + guardianIndex = newGuardians.length - 1; + expect(newGuardians.length).toEqual(oldGuardians.length + 1); + + ({ stakingModulesAddresses, curatedModuleAddress } = + await getStakingModulesInfo()); + stakingModulesCount = stakingModulesAddresses.length; + + // get two different active operators + nor = new CuratedOnchainV1(curatedModuleAddress); + const activeOperators = await nor.getActiveOperators(); + firstOperator = activeOperators[0]; + // create duplicate + lidoWC = await getLidoWC(); + const { signature, depositData } = await signDeposit( + frontrunPK, + frontrunSK, + lidoWC, + ); + lidoDepositSignature = signature; + lidoDepositData = depositData; + }, 360_000); + + afterAll(async () => { + await keysApiContainer.stop(); + await hardhatServer.stop(); + await postgresContainer.stop(); + }, 40_000); + + describe('Front-run attempt', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - // create correct sign for deposit message for pk - const { signature } = signDeposit(pk, sk, LIDO_WC); - - // Keys api mock - // all keys in keys api on current block state - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(signature), - operatorIndex: 0, - used: false, - index: 1, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - { - ...mockKey2, - index: 0, - moduleAddress: SIMPLE_DVT, - operatorIndex: 0, - vetted: true, - }, - ]; - // add in deposit cache event of deposit on key with lido creds await levelDBService.setCachedEvents({ data: [], headers: { @@ -205,65 +238,136 @@ describe('ganache e2e tests', () => { }, }); - // dont set events for keys as we check this cache only in case of duplicated keys await signingKeysRegistryService.setCachedEvents({ data: [], headers: { startBlock: currentBlock.number, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); + + test('add unused unvetted key', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await nor.addSigningKey( + firstOperator.index, + 1, + toHexString(frontrunPK), + toHexString(lidoDepositSignature), + firstOperator.rewardAddress, + ); + await waitForNewerBlock(currentBlock.number); + }); + + test('Make deposit with non-lido WC', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // Attempt to front run + const { depositData: theftDepositData } = await signDeposit( + frontrunPK, + frontrunSK, + BAD_WC, + ); + await makeDeposit(theftDepositData, providerService); + await waitForNewerBlock(currentBlock.number); + }); + + test('Make deposit with lido WC', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); // Attempt to front run - const { depositData: theftDepositData } = signDeposit(pk, sk, BAD_WC); - const { wallet } = await makeDeposit(theftDepositData, providerService); + await makeDeposit(lidoDepositData, providerService); + await waitForNewerBlock(currentBlock.number); + }); + + test('Key is not vetted, module will not be set on soft pause', async () => { + await guardianService.handleNewBlock(); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + + expect(sendUnvetMessage).toBeCalledTimes(0); + // 4 - number of modules + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + + test('Increase staking limit', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(firstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); + test('Check staking limit for curated operator before unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); - // Run a cycle and wait for possible changes + test('Unvetting', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - // soft pause for 1 module, sign deposit for 2 - expect(sendPauseMessage).toBeCalledTimes(0); + const walletAddress = await getWalletAddress(); + expect(sendUnvetMessage).toBeCalledTimes(1); expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, + blockNumber: currentBlock.number, + guardianAddress: walletAddress, + guardianIndex, stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000001', + // TODO: get rid of use function here + // write value, as function can have error + operatorIds: packNodeOperatorIds([firstOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', }), ); - expect(unvetSigningKeys).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount - 1); + }, 50_000); + + test('no pause happen', async () => { + expect(sendPauseMessage).toBeCalledTimes(0); + + const securityContract = SecurityAbi__factory.connect( + securityModuleAddress, + providerService.provider, ); - }, - TESTS_TIMEOUT, - ); - test( - 'failed 1eth deposit attack to stop deposits', - async () => { + const isOnPause = await securityContract.isDepositsPaused(); + expect(isOnPause).toBe(false); + }); + + test('Check staking limit for sdvt operator after unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); + }); + }); + + describe('Failed 1eth deposit attack to stop deposits', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); await levelDBService.setCachedEvents({ @@ -279,73 +383,102 @@ describe('ganache e2e tests', () => { headers: { startBlock: currentBlock.number, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); + + test('add unused unvetted key', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await nor.addSigningKey( + firstOperator.index, + 1, + toHexString(frontrunPK), + toHexString(lidoDepositSignature), + firstOperator.rewardAddress, + ); - const { signature: goodSign } = signDeposit(pk, sk, LIDO_WC, 32000000000); + await waitForNewerBlock(currentBlock.number); + }); - const { depositData: depositData } = signDeposit( - pk, - sk, - LIDO_WC, + test('Make deposit with lido WC', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // Attempt to front run + const { depositData: goodDepositData } = await signDeposit( + frontrunPK, + frontrunSK, + lidoWC, 1000000000, ); - await makeDeposit(depositData, providerService, 1); - - // Mock Keys API - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - { - ...mockKey2, - index: 0, - moduleAddress: SIMPLE_DVT, - operatorIndex: 0, - vetted: true, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Run a cycle and wait for possible changes + await makeDeposit(goodDepositData, providerService, 1); + await waitForNewerBlock(currentBlock.number); + }); + + test('Increase staking limit', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(firstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for sdvt operator before unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('no unvetting will happen', async () => { await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + expect(sendUnvetMessage).toBeCalledTimes(0); + // deposits work for every module + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + + test('no pause happen', async () => { + expect(sendPauseMessage).toBeCalledTimes(0); + const securityContract = SecurityAbi__factory.connect( - SECURITY_MODULE, + securityModuleAddress, providerService.provider, ); const isOnPause = await securityContract.isDepositsPaused(); - expect(isOnPause).toBe(false); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(unvetSigningKeys).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'failed 1eth deposit attack to stop deposits with a wrong signature and wc', - async () => { + }); + + test('Check staking limit for sdvt operator after unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + }); + + describe('Failed 1eth deposit attack to stop deposits with a wrong signature and wc', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); await levelDBService.setCachedEvents({ @@ -361,307 +494,180 @@ describe('ganache e2e tests', () => { headers: { startBlock: currentBlock.number, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); + + test('add unused unvetted key', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await nor.addSigningKey( + firstOperator.index, + 1, + toHexString(frontrunPK), + toHexString(lidoDepositSignature), + firstOperator.rewardAddress, + ); - const { signature: goodSign } = signDeposit(pk, sk, LIDO_WC, 32000000000); + await waitForNewerBlock(currentBlock.number); + }); + + test('Make invalid deposit with non-lido wc', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); - // wrong deposit, fill not set on soft pause deposits - const { signature: weirdSign } = signDeposit(pk, sk, BAD_WC, 0); - const { depositData } = signDeposit(pk, sk, BAD_WC, 1000000000); + const { signature: weirdSign } = await signDeposit( + frontrunPK, + frontrunSK, + BAD_WC, + 0, + ); + const { depositData } = await signDeposit(pk, sk, BAD_WC, 1000000000); await makeDeposit( { ...depositData, signature: weirdSign }, providerService, 1, ); - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Run a cycle and wait for possible changes - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(unvetSigningKeys).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'good scenario', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); + await waitForNewerBlock(currentBlock.number); + }); - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); + test('Increase staking limit', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(firstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); - const { signature: goodSign, depositData } = signDeposit( - pk, - sk, - LIDO_WC, - 32000000000, - ); + test('Check staking limit for sdvt operator before unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); - const { wallet } = await makeDeposit(depositData, providerService); - - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Check if the service is ok and ready to go + test('no unvetting will happen', async () => { await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); expect(sendUnvetMessage).toBeCalledTimes(0); - expect(unvetSigningKeys).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'inconsistent kapi requests data', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); + }); - // Mock Keys API - const keys = [mockKey]; - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - keysApiMockGetAllKeys(keysApiService, keys, newMeta); + test('no pause happen', async () => { + expect(sendPauseMessage).toBeCalledTimes(0); - await guardianService.handleNewBlock(); + const securityContract = SecurityAbi__factory.connect( + securityModuleAddress, + providerService.provider, + ); - expect(sendDepositMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(unvetSigningKeys).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'historical front-run', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); + const isOnPause = await securityContract.isDepositsPaused(); + expect(isOnPause).toBe(false); + }); - const { signature: lidoSign } = signDeposit(pk, sk); - const { signature: theftDepositSign } = signDeposit(pk, sk, BAD_WC); - - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(lidoSign), - operatorIndex: 0, - used: true, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; + test('deposits still work', async () => { + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - mockedKeysApiFind(keysApiService, keys, meta); + test('Check staking limit for sdvt operator before unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + }); - await levelDBService.setCachedEvents({ - data: [ - { - valid: true, - pubkey: toHexString(pk), - amount: '32000000000', - wc: BAD_WC, - signature: toHexString(theftDepositSign), - tx: '0x122', - blockHash: '0x123456', - blockNumber: currentBlock.number - 1, - logIndex: 1, - depositCount: 1, - depositDataRoot: new Uint8Array(), - index: '', - }, - { - valid: true, - pubkey: toHexString(pk), - amount: '32000000000', - wc: LIDO_WC, - signature: toHexString(lidoSign), - tx: '0x123', - blockHash: currentBlock.hash, - blockNumber: currentBlock.number, - logIndex: 1, - depositCount: 2, - depositDataRoot: new Uint8Array(), - index: '', - }, - ], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number, - }, - }); + describe('Historical front-run', () => { + let snapshotId: number; - await guardianService.handleNewBlock(); + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); - expect(sendPauseMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(0); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(unvetSigningKeys).toBeCalledTimes(0); + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); - const securityContract = SecurityAbi__factory.connect( - SECURITY_MODULE, - providerService.provider, + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('add unused unvetted key', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await nor.addSigningKey( + firstOperator.index, + 1, + toHexString(frontrunPK), + toHexString(lidoDepositSignature), + firstOperator.rewardAddress, ); - const isOnPause = await securityContract.isDepositsPaused(); - expect(isOnPause).toBe(true); - }, - TESTS_TIMEOUT, - ); + await waitForNewerBlock(currentBlock.number); + }); - test( - 'should not trigger pause for front-run attempt with non-Lido WC and Lido WC deposits when key is unused', - async () => { + test('Increase staking limit', async () => { const currentBlock = await providerService.provider.getBlock('latest'); - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(firstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); - const { signature: lidoSign } = signDeposit(pk, sk); - const { signature: theftDepositSign } = signDeposit(pk, sk, BAD_WC); - - if (!process.env.WALLET_PRIVATE_KEY) throw new Error(NO_PRIVKEY_MESSAGE); - const wallet = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY); - - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(lidoSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; + test('deposit lido key', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + await deposit(1); + await waitForNewerBlock(currentBlock.number); + }, 60_000); - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - mockedKeysApiFind(keysApiService, keys, meta); + test('Check staking limit for operator that key was deposited', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + expect(Number(op.totalAddedValidators)).toEqual(4); + expect(Number(op.totalDepositedValidators)).toEqual(4); + + await waitForNewerOrEqBlock(currentBlock.number); + }); + + test('Check kapi see new used key', async () => { + const { + data: { keys }, + } = await keysApiService.getModuleKeys(1, firstOperator.index); + expect(keys.length).toBe(4); + const lastKeys = keys.find(({ index }) => index === 3); + expect(lastKeys?.used).toBe(true); + }); + + test('Set cache to current block', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + const { signature: lidoSign } = await signDeposit( + frontrunPK, + frontrunSK, + lidoWC, + ); + const { signature: theftDepositSign } = await signDeposit( + frontrunPK, + frontrunSK, + BAD_WC, + ); await levelDBService.setCachedEvents({ data: [ { valid: true, - pubkey: toHexString(pk), + pubkey: toHexString(frontrunPK), amount: '32000000000', wc: BAD_WC, signature: toHexString(theftDepositSign), tx: '0x122', blockHash: '0x123456', - blockNumber: currentBlock.number - 1, + blockNumber: currentBlock.number - 9, logIndex: 1, depositCount: 1, depositDataRoot: new Uint8Array(), @@ -669,13 +675,13 @@ describe('ganache e2e tests', () => { }, { valid: true, - pubkey: toHexString(pk), + pubkey: toHexString(frontrunPK), amount: '32000000000', - wc: LIDO_WC, + wc: lidoWC, signature: toHexString(lidoSign), tx: '0x123', blockHash: currentBlock.hash, - blockNumber: currentBlock.number, + blockNumber: currentBlock.number - 8, logIndex: 1, depositCount: 2, depositDataRoot: new Uint8Array(), @@ -683,61 +689,7 @@ describe('ganache e2e tests', () => { }, ], headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number, - }, - }); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendPauseMessage).toBeCalledTimes(0); - - const securityContract = SecurityAbi__factory.connect( - SECURITY_MODULE, - providerService.provider, - ); - - const isOnPause = await securityContract.isDepositsPaused(); - - expect(isOnPause).toBe(false); - - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendUnvetMessage).toBeCalledTimes(1); - expect(sendUnvetMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000000', - }), - ); - expect(unvetSigningKeys).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - }, - TESTS_TIMEOUT, - ); - - test( - 'frontrun of unvetted key will not set module on soft pause', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, + startBlock: currentBlock.number - 10, endBlock: currentBlock.number, }, }); @@ -745,72 +697,31 @@ describe('ganache e2e tests', () => { await signingKeysRegistryService.setCachedEvents({ data: [], headers: { - startBlock: currentBlock.number, + startBlock: currentBlock.number - 10, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); - const { signature: goodSign } = signDeposit(pk, sk, LIDO_WC, 32000000000); - - const { depositData: theftDepositData } = signDeposit(pk, sk, BAD_WC); - const { wallet } = await makeDeposit(theftDepositData, providerService); - - const unvettedKeys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: false, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, unvettedKeys, meta); - - // Check if the service is ok and ready to go - // the same scenario as "failed 1eth deposit attack to stop deposits" + test('Run council daemon', async () => { await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + }); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(unvetSigningKeys).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - + test('Pause happen', async () => { const securityContract = SecurityAbi__factory.connect( - SECURITY_MODULE, + securityModuleAddress, providerService.provider, ); const isOnPause = await securityContract.isDepositsPaused(); - expect(isOnPause).toBe(false); - }, - TESTS_TIMEOUT, - ); + expect(isOnPause).toBe(true); + expect(sendPauseMessage).toBeCalledTimes(1); + }); + + test('Deposits does not work for whole list of modules', () => { + expect(sendDepositMessage).toBeCalledTimes(0); + }); + }); }); diff --git a/test/front-run.e2e-spec.ts b/test/front-run.e2e-spec.ts deleted file mode 100644 index b929fc27..00000000 --- a/test/front-run.e2e-spec.ts +++ /dev/null @@ -1,722 +0,0 @@ -// Global Helpers -import { toHexString } from '@chainsafe/ssz'; - -// Helpers -import { - mockedKeysApiFind, - keysApiMockGetAllKeys, - keysApiMockGetModules, - mockedModuleCurated, - mockedModuleDvt, - mockMeta, -} from './helpers'; - -// Constants -import { - TESTS_TIMEOUT, - SLEEP_FOR_RESULT, - STAKING_ROUTER, - LIDO_WC, - BAD_WC, - CHAIN_ID, - GANACHE_PORT, - sk, - pk, - NOP_REGISTRY, - SIMPLE_DVT, - SECURITY_MODULE_V2, - UNLOCKED_ACCOUNTS_V2, - FORK_BLOCK_V2, - SECURITY_MODULE_OWNER_V2, -} from './constants'; - -// Contract Factories -import { StakingRouterAbi__factory } from './../src/generated'; - -// BLS helpers - -// App modules and services -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; -import { GuardianService } from 'guardian'; -import { KeysApiService } from 'keys-api/keys-api.service'; -import { ProviderService } from 'provider'; -import { Server } from 'ganache'; -import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; -import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; -import { GuardianMessageService } from 'guardian/guardian-message'; -import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; -import { makeServer } from './server'; -import { addGuardians } from './helpers/dsm'; -import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; -import { BlsService } from 'bls'; -import { makeDeposit, signDeposit } from './helpers/deposit'; -import { mockKey, mockKey2 } from './helpers/keys-fixtures'; - -// Mock rabbit straight away -jest.mock('../src/transport/stomp/stomp.client.ts'); - -jest.setTimeout(10_000); - -describe('ganache e2e tests', () => { - let server: Server<'ethereum'>; - let providerService: ProviderService; - let keysApiService: KeysApiService; - let guardianService: GuardianService; - let sendDepositMessage: jest.SpyInstance; - let sendPauseMessage: jest.SpyInstance; - let levelDBService: DepositsRegistryStoreService; - let signKeyLevelDBService: SignKeyLevelDBService; - let guardianMessageService: GuardianMessageService; - let signingKeysRegistryService: SigningKeysRegistryService; - let depositIntegrityCheckerService: DepositIntegrityCheckerService; - - const setupServer = async () => { - server = makeServer(FORK_BLOCK_V2, CHAIN_ID, UNLOCKED_ACCOUNTS_V2); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians({ - securityModule: SECURITY_MODULE_V2, - securityModuleOwner: SECURITY_MODULE_OWNER_V2, - }); - }; - - const setupTestingServices = async (moduleRef) => { - // leveldb service - levelDBService = moduleRef.get(DepositsRegistryStoreService); - signKeyLevelDBService = moduleRef.get(SignKeyLevelDBService); - - await initLevelDB(levelDBService, signKeyLevelDBService); - - // deposit events related services - depositIntegrityCheckerService = moduleRef.get( - DepositIntegrityCheckerService, - ); - - const blsService = moduleRef.get(BlsService); - await blsService.onModuleInit(); - - // keys events service - signingKeysRegistryService = moduleRef.get(SigningKeysRegistryService); - - providerService = moduleRef.get(ProviderService); - // keys api servies - keysApiService = moduleRef.get(KeysApiService); - - // rabbitmq message sending methods - guardianMessageService = moduleRef.get(GuardianMessageService); - - // main service that check keys and make decision - guardianService = moduleRef.get(GuardianService); - }; - - const setupMocks = () => { - // broker messages - sendDepositMessage = jest - .spyOn(guardianMessageService, 'sendDepositMessage') - .mockImplementation(() => Promise.resolve()); - jest - .spyOn(guardianMessageService, 'pingMessageBroker') - .mockImplementation(() => Promise.resolve()); - sendPauseMessage = jest - .spyOn(guardianMessageService, 'sendPauseMessageV2') - .mockImplementation(() => Promise.resolve()); - - // deposit cache mocks - jest - .spyOn(depositIntegrityCheckerService, 'putEventsToTree') - .mockImplementation(() => Promise.resolve()); - jest - .spyOn(depositIntegrityCheckerService, 'checkLatestRoot') - .mockImplementation(() => Promise.resolve(true)); - jest - .spyOn(depositIntegrityCheckerService, 'checkFinalizedRoot') - .mockImplementation(() => Promise.resolve(true)); - }; - - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); - - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); - }); - - test( - 'node operator deposit frontrun, 2 modules in staking router', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - // create correct sign for deposit message for pk - const { signature } = signDeposit(pk, sk, LIDO_WC); - - // Keys api mock - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(signature), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - { - ...mockKey2, - index: 0, - moduleAddress: SIMPLE_DVT, - operatorIndex: 0, - vetted: true, - }, - ]; - - // add in deposit cache event of deposit on key with lido creds - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - // dont set events for keys as we check this cache only in case of duplicated keys - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - // Attempt to front run - const { depositData: theftDepositData } = signDeposit(pk, sk, BAD_WC); - const { wallet } = await makeDeposit(theftDepositData, providerService); - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Run a cycle and wait for possible changes - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - // soft pause for 1 module, sign deposit for 2 - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - }, - TESTS_TIMEOUT, - ); - - test( - 'failed 1eth deposit attack to stop deposits', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const { signature: goodSign } = signDeposit(pk, sk, LIDO_WC, 32000000000); - - const { depositData: depositData } = signDeposit( - pk, - sk, - LIDO_WC, - 1000000000, - ); - await makeDeposit(depositData, providerService, 1); - - // Mock Keys API - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - { - ...mockKey2, - index: 0, - moduleAddress: SIMPLE_DVT, - operatorIndex: 0, - vetted: true, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Run a cycle and wait for possible changes - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - // Check if on pause now - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendDepositMessage).toBeCalledTimes(2); - }, - TESTS_TIMEOUT, - ); - - test( - 'failed 1eth deposit attack to stop deposits with a wrong signature and wc', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const { signature: goodSign } = signDeposit(pk, sk, LIDO_WC, 32000000000); - - // wrong deposit, fill not set on soft pause deposits - const { signature: weirdSign } = signDeposit(pk, sk, BAD_WC, 0); - const { depositData } = signDeposit(pk, sk, BAD_WC, 1000000000); - await makeDeposit( - { ...depositData, signature: weirdSign }, - providerService, - 1, - ); - - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Run a cycle and wait for possible changes - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - expect(sendPauseMessage).toBeCalledTimes(0); - expect(sendDepositMessage).toBeCalledTimes(2); - }, - TESTS_TIMEOUT, - ); - - test( - 'good scenario', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const { signature: goodSign, depositData } = signDeposit( - pk, - sk, - LIDO_WC, - 32000000000, - ); - - const { wallet } = await makeDeposit(depositData, providerService); - - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: true, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - // Check if the service is ok and ready to go - // the same scenario as "failed 1eth deposit attack to stop deposits" - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - - // Check if on pause now - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - const isOnPause2 = await routerContract.getStakingModuleIsDepositsPaused( - 2, - ); - expect(isOnPause2).toBe(false); - }, - TESTS_TIMEOUT, - ); - - test( - 'inconsistent kapi requests data', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - const keys = [mockKey]; - - // Mock Keys API - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - keysApiMockGetAllKeys(keysApiService, keys, newMeta); - - await guardianService.handleNewBlock(); - - expect(sendDepositMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test( - 'frontrun of unvetted key will not set module on soft pause', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const { signature: goodSign } = signDeposit(pk, sk, LIDO_WC, 32000000000); - - const { depositData: theftDepositData } = signDeposit(pk, sk, BAD_WC); - const { wallet } = await makeDeposit(theftDepositData, providerService); - - const unvettedKeys = [ - { - key: toHexString(pk), - depositSignature: toHexString(goodSign), - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: false, - }, - ]; - - // Mock Keys API again on new block - const newBlock = await providerService.provider.getBlock('latest'); - // setup elBlockSnapshot - const meta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, unvettedKeys, meta); - - // Check if the service is ok and ready to go - // the same scenario as "failed 1eth deposit attack to stop deposits" - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: wallet.address, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - - // Check if on pause now - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - }, - TESTS_TIMEOUT, - ); - - test( - 'historical front-run', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const { signature: lidoSign } = signDeposit(pk, sk); - const { signature: theftDepositSign } = signDeposit(pk, sk, BAD_WC); - - const keys = [ - { - key: toHexString(pk), - depositSignature: toHexString(lidoSign), - operatorIndex: 0, - used: true, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }, - ]; - - await levelDBService.setCachedEvents({ - data: [ - { - valid: true, - pubkey: toHexString(pk), - amount: '32000000000', - wc: BAD_WC, - signature: toHexString(theftDepositSign), - tx: '0x122', - blockHash: '0x123456', - blockNumber: currentBlock.number - 1, - logIndex: 1, - depositCount: 1, - depositDataRoot: new Uint8Array(), - index: '', - }, - { - valid: true, - pubkey: toHexString(pk), - amount: '32000000000', - wc: LIDO_WC, - signature: toHexString(lidoSign), - tx: '0x123', - blockHash: currentBlock.hash, - blockNumber: currentBlock.number, - logIndex: 1, - depositCount: 2, - depositDataRoot: new Uint8Array(), - index: '', - }, - ], - headers: { - startBlock: currentBlock.number - 2, - endBlock: currentBlock.number, - }, - }); - - // setup elBlockSnapshot - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - mockedKeysApiFind(keysApiService, keys, meta); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - - expect(isOnPause).toBe(true); - - const isOnPause2Module = - await routerContract.getStakingModuleIsDepositsPaused(2); - - expect(isOnPause2Module).toBe(false); - expect(sendDepositMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(1); - - // Mine a new block - await providerService.provider.send('evm_mine', []); - - // // Your assertions after mining the block - const newBlock = await providerService.provider.getBlock('latest'); - - // setup elBlockSnapshot - const newMeta = mockMeta(newBlock, newBlock.hash); - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, newMeta); - mockedKeysApiFind(keysApiService, keys, newMeta); - - sendPauseMessage.mockClear(); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - const isOnPause1NextIter = - await routerContract.getStakingModuleIsDepositsPaused(1); - - expect(isOnPause1NextIter).toBe(true); - - const isOnPause2NextIter = - await routerContract.getStakingModuleIsDepositsPaused(2); - - expect(isOnPause2NextIter).toBe(true); - - expect(sendDepositMessage).toBeCalledTimes(0); - expect(sendPauseMessage).toBeCalledTimes(1); - }, - TESTS_TIMEOUT, - ); -}); diff --git a/test/guardian-balance-monitoring.e2e-spec.ts b/test/guardian-balance-monitoring.e2e-spec.ts index 75b9d47e..c855e5c3 100644 --- a/test/guardian-balance-monitoring.e2e-spec.ts +++ b/test/guardian-balance-monitoring.e2e-spec.ts @@ -1,61 +1,54 @@ -// Mocking and Setup -jest.mock('../src/transport/stomp/stomp.client.ts'); -jest.setTimeout(10_000); - -// External Libraries -import { Server } from 'ganache'; - -// Helper Functions and Mocks -import { - keysApiMockGetAllKeys, - keysApiMockGetModules, - mockedModuleCurated, - mockedModuleDvt, - mockMeta, -} from './helpers'; +// Global Helpers +import { toHexString } from '@chainsafe/ssz'; -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; +// Constants +import { SLEEP_FOR_RESULT, pk, NO_PRIVKEY_MESSAGE } from './constants'; -import { makeServer } from './server'; +// Mock rabbit straight away +jest.mock('../src/transport/stomp/stomp.client.ts'); -// Constants -import { - SLEEP_FOR_RESULT, - CHAIN_ID, - GANACHE_PORT, - NOP_REGISTRY, - SIMPLE_DVT, - UNLOCKED_ACCOUNTS, - FORK_BLOCK, -} from './constants'; - -// Contract and Service Imports +import { setupTestingModule, initLevelDB } from './helpers/test-setup'; import { SecurityService } from 'contracts/security'; import { GuardianService } from 'guardian'; -import { KeysApiService } from 'keys-api/keys-api.service'; import { ProviderService } from 'provider'; import { GuardianMessageService } from 'guardian/guardian-message'; import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; +import { KeyValidatorInterface } from '@lido-nestjs/key-validation'; + import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; +import { + addGuardians, + getGuardians, + getSecurityContract, + getSecurityOwner, +} from './helpers/dsm'; import { BlsService } from 'bls'; import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; - -// Test Data -import { mockKey, mockKey2 } from './helpers/keys-fixtures'; -import { addGuardians, setGuardianBalance } from './helpers/dsm'; -import { RegistryKey } from 'keys-api/interfaces/RegistryKey'; +import { + accountImpersonate, + setBalance, + testSetupProvider, +} from './helpers/provider'; +import { waitForNewerBlock, waitKAPIUpdateModulesKeys } from './helpers/kapi'; +import { CuratedOnchainV1 } from './helpers/nor.contract'; +import { truncateTables } from './helpers/pg'; +import { packNodeOperatorIds } from 'guardian/unvetting/bytes'; +import { getStakingModulesInfo } from './helpers/sr.contract'; import { ethers } from 'ethers'; +import { + setupContainers, + startContainerIfNotRunning, +} from './helpers/docker-containers/utils'; +import { HardhatServer } from './helpers/hardhat-server'; +import { cutModulesKeys } from './helpers/reduce-keys'; + +jest.setTimeout(40_000); -describe('Guardian balance monitoring test', () => { - let server: Server<'ethereum'>; +describe('Guardian balance ', () => { let providerService: ProviderService; - let keysApiService: KeysApiService; let guardianService: GuardianService; + let keyValidator: KeyValidatorInterface; let levelDBService: DepositsRegistryStoreService; let signKeyLevelDBService: SignKeyLevelDBService; let guardianMessageService: GuardianMessageService; @@ -65,176 +58,45 @@ describe('Guardian balance monitoring test', () => { // mocks let sendDepositMessage: jest.SpyInstance; + let validateKeys: jest.SpyInstance; let sendUnvetMessage: jest.SpyInstance; let unvetSigningKeys: jest.SpyInstance; - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); - - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); - }); - - test('should check unvetting will not happen if guardian balance lower critical threshold', async () => { - await setBalance('0.2'); - - const currentBlock = await providerService.getBlock(); - await setupDefaultCache(currentBlock.number); - setupKAPIWithInvalidSignProblem(currentBlock); - - await guardianService.handleNewBlock(); - await waitForProcessing(); - - expect(unvetSigningKeys).toBeCalledTimes(0); - expect(sendUnvetMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(0); - - // at next iteration it should unvet keys of second module - }); - - test('should check unvetting will happen if guardian balance is sufficient', async () => { - await setBalance('1'); - - const currentBlock = await providerService.getBlock(); - await setupDefaultCache(currentBlock.number); - setupKAPIWithInvalidSignProblem(currentBlock); - - await guardianService.handleNewBlock(); - await waitForProcessing(); - - expect(unvetSigningKeys).toBeCalledTimes(1); - expect(sendUnvetMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(0); - - // at next iteration it should unvet keys of second module - }); - - // Helper functions - - async function setBalance(eth: string) { - await setGuardianBalance(eth); - await waitForProcessing(); - } - - const setupDefaultCache = async (blockNumber) => { - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: blockNumber, - endBlock: blockNumber, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: blockNumber, - endBlock: blockNumber, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - }; - - const setupKAPIWithInvalidSignProblem = (block: ethers.providers.Block) => { - // keys fixtures - const norKeyWithWrongSign: RegistryKey = { - ...mockKey, - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - vetted: true, - }; - const dvtKey: RegistryKey = { - ...mockKey2, - index: 1, - used: false, - operatorIndex: 0, - moduleAddress: SIMPLE_DVT, - vetted: true, - }; - const dvtKey2 = { ...dvtKey, index: 2 }; - - // setup elBlockSnapshot - const meta = mockMeta(block, block.hash); - - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - - // setup /v1/keys - const keys = [norKeyWithWrongSign, dvtKey, dvtKey2]; - keysApiMockGetAllKeys(keysApiService, keys, meta); - }; - - async function waitForProcessing() { - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - } - - const setupServer = async () => { - server = makeServer(FORK_BLOCK, CHAIN_ID, UNLOCKED_ACCOUNTS); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians(); - }; - const setupTestingServices = async (moduleRef) => { - await initializeLevelDBServices(moduleRef); - initializeDepositServices(moduleRef); - await initializeBlsService(moduleRef); - initializeKeyEventServices(moduleRef); - initializeProviders(moduleRef); - initializeMessagingServices(moduleRef); - initializeGuardianService(moduleRef); - }; - - const initializeLevelDBServices = async (moduleRef) => { + // leveldb service levelDBService = moduleRef.get(DepositsRegistryStoreService); signKeyLevelDBService = moduleRef.get(SignKeyLevelDBService); + await initLevelDB(levelDBService, signKeyLevelDBService); - }; - const initializeDepositServices = (moduleRef) => { + // deposit events related services depositIntegrityCheckerService = moduleRef.get( DepositIntegrityCheckerService, ); - }; - const initializeKeyEventServices = (moduleRef) => { + const blsService = moduleRef.get(BlsService); + await blsService.onModuleInit(); + + // keys events service signingKeysRegistryService = moduleRef.get(SigningKeysRegistryService); - }; - const initializeProviders = (moduleRef) => { providerService = moduleRef.get(ProviderService); + + // dsm methods and council sign services securityService = moduleRef.get(SecurityService); - keysApiService = moduleRef.get(KeysApiService); - }; - const initializeMessagingServices = (moduleRef) => { + // rabbitmq message sending methods guardianMessageService = moduleRef.get(GuardianMessageService); - }; - const initializeBlsService = async (moduleRef) => { - const blsService = moduleRef.get(BlsService); - await blsService.onModuleInit(); - }; - - const initializeGuardianService = (moduleRef) => { + // main service that check keys and make decision guardianService = moduleRef.get(GuardianService); - }; - const setupMocks = () => { - mockBrokerMessages(); - mockDepositCacheMethods(); - mockUnvettingMethod(); + // sign validation + keyValidator = moduleRef.get(KeyValidatorInterface); }; - const mockBrokerMessages = () => { + const setupMocks = () => { + // broker messages sendDepositMessage = jest .spyOn(guardianMessageService, 'sendDepositMessage') .mockImplementation(() => Promise.resolve()); @@ -244,9 +106,8 @@ describe('Guardian balance monitoring test', () => { sendUnvetMessage = jest .spyOn(guardianMessageService, 'sendUnvetMessage') .mockImplementation(() => Promise.resolve()); - }; - const mockDepositCacheMethods = () => { + // deposit cache mocks jest .spyOn(depositIntegrityCheckerService, 'putEventsToTree') .mockImplementation(() => Promise.resolve()); @@ -256,11 +117,232 @@ describe('Guardian balance monitoring test', () => { jest .spyOn(depositIntegrityCheckerService, 'checkFinalizedRoot') .mockImplementation(() => Promise.resolve(true)); - }; - const mockUnvettingMethod = () => { - unvetSigningKeys = jest - .spyOn(securityService, 'unvetSigningKeys') - .mockImplementation(() => Promise.resolve(null as any)); + // sign validation + validateKeys = jest.spyOn(keyValidator, 'validateKeys'); + + unvetSigningKeys = jest.spyOn(securityService, 'unvetSigningKeys'); }; + + let stakingModulesAddresses: string[]; + let curatedModuleAddress: string; + let stakingModulesCount: number; + let firstOperator: any; + let nor: CuratedOnchainV1; + const frontrunPK: Uint8Array = pk; + let guardianIndex: number; + let securityModuleAddress: string; + let guardianAddress: string; + + let postgresContainer; + let keysApiContainer; + let hardhatServer: HardhatServer; + + beforeAll(async () => { + const { kapi, psql } = await setupContainers(); + keysApiContainer = kapi; + postgresContainer = psql; + + await startContainerIfNotRunning(postgresContainer); + + hardhatServer = new HardhatServer(); + await hardhatServer.start(); + + console.log('Hardhat node is ready. Starting key cutting process...'); + await cutModulesKeys(); + + await startContainerIfNotRunning(keysApiContainer); + + await waitKAPIUpdateModulesKeys(); + + const securityModule = await getSecurityContract(); + const securityModuleOwner = await getSecurityOwner(); + await accountImpersonate(securityModuleOwner); + const oldGuardians = await getGuardians(); + securityModuleAddress = securityModule.address; + await addGuardians({ + securityModuleAddress, + securityModuleOwner, + }); + + const newGuardians = await getGuardians(); + // TODO: read from contract + guardianIndex = newGuardians.length - 1; + expect(newGuardians.length).toEqual(oldGuardians.length + 1); + + ({ stakingModulesAddresses, curatedModuleAddress } = + await getStakingModulesInfo()); + + stakingModulesCount = stakingModulesAddresses.length; + + // get two different active operators + nor = new CuratedOnchainV1(curatedModuleAddress); + const activeOperators = await nor.getActiveOperators(); + firstOperator = activeOperators[0]; + // set guardian balance smaller than the critical value + if (!process.env.WALLET_PRIVATE_KEY) throw new Error(NO_PRIVKEY_MESSAGE); + const wallet = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY); + guardianAddress = wallet.address; + }, 360_000); + + afterAll(async () => { + await keysApiContainer.stop(); + await hardhatServer.stop(); + await postgresContainer.stop(); + }, 40_000); + + describe('Unvetting will not happen if guardian balance lower critical threshold', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + await levelDBService.setCachedEvents({ + data: [], + headers: { + startBlock: currentBlock.number, + endBlock: currentBlock.number, + }, + }); + + await signingKeysRegistryService.setCachedEvents({ + data: [], + headers: { + startBlock: currentBlock.number, + endBlock: currentBlock.number, + stakingModulesAddresses, + }, + }); + }); + + test('Add key with broken signature', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + const randomSign = + '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e'; + + await nor.addSigningKey( + firstOperator.index, + 1, + toHexString(frontrunPK), + randomSign, + firstOperator.rewardAddress, + ); + await waitForNewerBlock(currentBlock.number); + }); + + test('Unvetted key will not set module on soft pause', async () => { + await guardianService.handleNewBlock(); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + + // 4 - number of modules + expect(validateKeys).toBeCalledTimes(stakingModulesCount); + expect(sendUnvetMessage).toBeCalledTimes(0); + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); + + test('Increase staking limit', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(firstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for operator before unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Unvetting transaction will not be sent due to law account balance', async () => { + await setBalance(guardianAddress, 0.2); + await guardianService.handleNewBlock(); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + + expect(validateKeys).toBeCalledTimes(2 * stakingModulesCount); + expect(sendUnvetMessage).toBeCalledTimes(1); + expect(unvetSigningKeys).toBeCalledTimes(0); + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount - 1); + + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + console.log('Finished!'); + }, 100_000); + + test('Add key with broken signature to make kapi update state', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + const randomSign = + '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e'; + + await nor.addSigningKey( + firstOperator.index, + 1, + toHexString(frontrunPK), + randomSign, + firstOperator.rewardAddress, + ); + await waitForNewerBlock(currentBlock.number); + }); + + test('After increase account balance, unvetting transaction will be sent', async () => { + // await testSetupProvider.send('evm_mine', []); + const currentBlock = await providerService.provider.getBlock('latest'); + + await setBalance(guardianAddress, 1); + await guardianService.handleNewBlock(); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + + expect(validateKeys).toBeCalledTimes(3 * stakingModulesCount); + expect(sendUnvetMessage).toBeCalledTimes(2); + expect(sendUnvetMessage).toHaveBeenCalledWith( + expect.objectContaining({ + blockNumber: currentBlock.number, + guardianAddress: guardianAddress, + guardianIndex, + stakingModuleId: 1, + operatorIds: packNodeOperatorIds([firstOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', + }), + ); + + expect(unvetSigningKeys).toBeCalledTimes(1); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 1, + packNodeOperatorIds([firstOperator.index]), + '0x00000000000000000000000000000003', + expect.any(Object), + ); + }, 60_000); + + test('No deposits for module', async () => { + expect(sendDepositMessage).toBeCalledTimes(3 * stakingModulesCount - 2); + }); + + test('Check staking limit for operator after unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); + }); + }); }); diff --git a/test/helpers/computeDomain.ts b/test/helpers/computeDomain.ts index f089af6c..40b5d3e3 100644 --- a/test/helpers/computeDomain.ts +++ b/test/helpers/computeDomain.ts @@ -12,7 +12,7 @@ import { SigningData, } from '../../src/bls/bls.containers'; -import { CHAIN_ID } from '../constants'; +import { testSetupProvider } from './provider'; const computeDomain = ( domainType: Uint8Array, @@ -43,11 +43,13 @@ const computeSigningRoot = ( return SigningData.hashTreeRoot({ objectRoot, domain }); }; -export const computeRoot = (depositMessage: { +export const computeRoot = async (depositMessage: { pubkey: Uint8Array; withdrawalCredentials: Uint8Array; amount: number; }) => { + const network = await testSetupProvider.getNetwork(); + const CHAIN_ID = network.chainId; const forkVersion = GENESIS_FORK_VERSION_BY_CHAIN_ID[CHAIN_ID]; const domain = computeDomain(DOMAIN_DEPOSIT, forkVersion, ZERO_HASH); diff --git a/test/helpers/curated.abi.ts b/test/helpers/curated.abi.ts new file mode 100644 index 00000000..f5505e77 --- /dev/null +++ b/test/helpers/curated.abi.ts @@ -0,0 +1,108 @@ +export const curatedAbi = [ + { + constant: false, + inputs: [ + { + name: '_nodeOperatorId', + type: 'uint256', + }, + { + name: '_keysCount', + type: 'uint256', + }, + { + name: '_publicKeys', + type: 'bytes', + }, + { + name: '_signatures', + type: 'bytes', + }, + ], + name: 'addSigningKeys', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'getNodeOperatorsCount', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_nodeOperatorId', + type: 'uint256', + }, + { + name: '_vettedSigningKeysCount', + type: 'uint64', + }, + ], + name: 'setNodeOperatorStakingLimit', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + // Adding getNodeOperator function + { + constant: true, + inputs: [ + { + name: '_nodeOperatorId', + type: 'uint256', + }, + { + name: '_fullInfo', + type: 'bool', + }, + ], + name: 'getNodeOperator', + outputs: [ + { + name: 'active', + type: 'bool', + }, + { + name: 'name', + type: 'string', + }, + { + name: 'rewardAddress', + type: 'address', + }, + { + name: 'totalVettedValidators', + type: 'uint64', + }, + { + name: 'totalExitedValidators', + type: 'uint64', + }, + { + name: 'totalAddedValidators', + type: 'uint64', + }, + { + name: 'totalDepositedValidators', + type: 'uint64', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, +]; diff --git a/test/helpers/deposit.ts b/test/helpers/deposit.ts index 896ddee4..08b38473 100644 --- a/test/helpers/deposit.ts +++ b/test/helpers/deposit.ts @@ -1,24 +1,28 @@ import { fromHexString } from '@chainsafe/ssz'; -import { DEPOSIT_CONTRACT, LIDO_WC, NO_PRIVKEY_MESSAGE } from '../constants'; +import { NO_PRIVKEY_MESSAGE } from '../constants'; import { computeRoot } from './computeDomain'; import { DepositData } from 'bls/bls.containers'; import { ethers } from 'ethers'; import { ProviderService } from 'provider'; import { DepositAbi__factory } from 'generated'; import { SecretKey } from '@chainsafe/blst'; +import { getSecurityContract } from './dsm'; -export function signDeposit( +export async function signDeposit( pk: Uint8Array, sk: SecretKey, - wc = LIDO_WC, + wc: string, amountGwei = 32000000000, -): { depositData: any; signature: Uint8Array } { +): Promise<{ + depositData: any; + signature: Uint8Array; +}> { const depositMessage = { pubkey: pk, withdrawalCredentials: fromHexString(wc), amount: amountGwei, }; - const signingRoot = computeRoot(depositMessage); + const signingRoot = await computeRoot(depositMessage); const sign = sk.sign(signingRoot).toBytes(); const depositData = { @@ -41,7 +45,13 @@ export async function makeDeposit( // Make a deposit const signer = wallet.connect(providerService.provider); - const depositContract = DepositAbi__factory.connect(DEPOSIT_CONTRACT, signer); + const dsm = await getSecurityContract(); + const depositContractAddress = await dsm.DEPOSIT_CONTRACT(); + + const depositContract = DepositAbi__factory.connect( + depositContractAddress, + signer, + ); await depositContract.deposit( depositData.pubkey, diff --git a/test/helpers/docker-containers/utils.ts b/test/helpers/docker-containers/utils.ts new file mode 100644 index 00000000..2e4ee1cd --- /dev/null +++ b/test/helpers/docker-containers/utils.ts @@ -0,0 +1,301 @@ +import * as path from 'path'; +import * as Docker from 'dockerode'; +import * as dotenv from 'dotenv'; + +dotenv.config(); + +const POSTGRES_PORT = process.env.POSTGRES_PORT || '5432'; +const KAPI_IMAGE = 'lidofinance/lido-keys-api:staging'; +const PSQL_IMAGE = 'postgres:14-alpine'; +const PSQL_CONTAINER = 'e2e_pgdb'; +const KAPI_CONTAINER = 'e2e_keys_api'; +const NETWORK_NAME = 'e2e_network'; + +/** + * Pull image if didn't find locally + */ +async function pullImage(docker: Docker, imageName: string, platform?: string) { + // Parse name to find image name and tag + const [fromImage, tag = 'latest'] = imageName.split(':'); + const options: any = { fromImage, tag }; + + // Add platform if specified + if (platform) { + options.platform = platform; + } + + // Initialize docker instance and check if image already exists + const image = docker.getImage(imageName); + + try { + await image.inspect(); + console.log(`Image ${imageName} exists.`); + } catch (error: any) { + if (error.statusCode === 404) { + console.log(`Image ${imageName} does not exist.`); + await createImage(docker, options); + } else { + throw error; // Re-throw other errors for debugging + } + } +} + +async function createImage( + docker: Docker, + options: { platform?: string; tag: string; fromImage: string }, +) { + const imageRef = `${options.fromImage}:${options.tag}`; + try { + const opts = options.platform ? { platform: options.platform } : {}; + const stream = await docker.pull(imageRef, opts); + + return await new Promise((resolve, reject) => { + docker.modem.followProgress(stream, (err, res) => { + if (err) { + console.error(`Failed to pull image ${imageRef}`, err); + reject(err); + } else { + console.log(`Successfully pulled image: ${imageRef}`); + resolve(res); + } + }); + }); + } catch (error) { + console.error(`Error pulling image ${imageRef}:`, error); // Log any initial pull error + throw error; + } +} + +/** + * Check if container exist + */ +export async function getContainer(docker: Docker, name: string) { + const container = await docker.getContainer(name); + + try { + await container.inspect(); + console.log(`Container ${name} already exists`); + return container; + } catch (error: any) { + if (error.statusCode == 404) { + console.log(`Container ${name} does not exist`); + return undefined; + } + + throw error; + } +} + +/** + * Pull and create psql container + */ +async function pullAndCreatePsqlContainer(docker: Docker) { + const platform = process.env.DOCKER_PLATFORM; + const CHAIN_ID = process.env.CHAIN_ID; + const pgdataPath = path.resolve(`./.volumes/pgdata-${CHAIN_ID}/`); + + await pullImage(docker, PSQL_IMAGE, platform); + + const alreadyCreatedContainer = await getContainer(docker, PSQL_CONTAINER); + + if (alreadyCreatedContainer) { + return alreadyCreatedContainer; + } + + const hostConfig = + process.platform === 'linux' + ? { + Binds: [`${pgdataPath}:/var/lib/postgresql/data:rw`], + NetworkMode: 'host', + } + : { + Binds: [`${pgdataPath}:/var/lib/postgresql/data:rw`], + PortBindings: { + '5432/tcp': [{ HostPort: POSTGRES_PORT }], + }, + NetworkMode: NETWORK_NAME, + }; + + // Create and configure the PostgreSQL container + const container = await docker.createContainer({ + Image: PSQL_IMAGE, + name: PSQL_CONTAINER, + Env: [ + 'POSTGRES_DB=node_operator_keys_service_db', + 'POSTGRES_USER=postgres', + 'POSTGRES_PASSWORD=postgres', + ], + HostConfig: hostConfig, + }); + + console.log('Container e2e_pgdb created'); + + return container; +} + +/** + * Pull and create keys api container + */ +async function pullAndCreateKapiContainer(docker: Docker) { + const platform = process.env.DOCKER_PLATFORM; + + await pullImage(docker, KAPI_IMAGE, platform); + + const alreadyCreatedContainer = await getContainer(docker, KAPI_CONTAINER); + + if (alreadyCreatedContainer) { + return alreadyCreatedContainer; + } + + const CHAIN_ID = process.env.CHAIN_ID; + + const hostConfig = + process.platform === 'linux' + ? { + NetworkMode: 'host', + } + : { + PortBindings: { '3000/tcp': [{ HostPort: '3000' }] }, + NetworkMode: NETWORK_NAME, + }; + + const HARDHAT_URL = + process.platform === 'linux' + ? 'http://127.0.0.1:8545' + : 'http://host.docker.internal:8545'; + + const DB_HOST = process.platform === 'linux' ? '127.0.0.1' : PSQL_CONTAINER; + + const exposedHosts = + process.platform === 'linux' ? {} : { ExposedPorts: { '3000/tcp': {} } }; + + console.log({ + Image: KAPI_IMAGE, + name: KAPI_CONTAINER, + Env: [ + 'NODE_ENV=production', + 'DB_NAME=node_operator_keys_service_db', + 'DB_PORT=5432', + `DB_HOST=${DB_HOST}`, + 'DB_USER=postgres', + 'DB_PASSWORD=postgres', + `PROVIDERS_URLS=${HARDHAT_URL}`, + 'VALIDATOR_REGISTRY_ENABLE=false', + `CHAIN_ID=${CHAIN_ID}`, + 'CL_API_URLS=', + ], + ...exposedHosts, + HostConfig: hostConfig, + }); + + // Create and configure the PostgreSQL container + const container = await docker.createContainer({ + Image: KAPI_IMAGE, + name: KAPI_CONTAINER, + Env: [ + 'NODE_ENV=production', + 'DB_NAME=node_operator_keys_service_db', + 'DB_PORT=5432', + `DB_HOST=${DB_HOST}`, + 'DB_USER=postgres', + 'DB_PASSWORD=postgres', + `PROVIDERS_URLS=${HARDHAT_URL}`, + 'VALIDATOR_REGISTRY_ENABLE=false', + `CHAIN_ID=${CHAIN_ID}`, + 'CL_API_URLS=', + ], + ...exposedHosts, + HostConfig: hostConfig, + }); + + console.log('Container e2e_keys_api created'); + + return container; +} + +async function networkExists(docker: Docker, name) { + const network = await docker.getNetwork(name); + + try { + await network.inspect(); + console.log(`Network ${name} already exists`); + return true; + } catch (error: any) { + if (error.statusCode === 404) { + // Create network for containers + console.log(`Network ${name} doesn't exists`); + return false; + } + } +} + +async function createNetwork(docker: Docker, name) { + const exists = await networkExists(docker, name); + + if (exists) { + return; + } + + await docker.createNetwork({ Name: name }); + console.log(`Network ${name} successfully created`); +} + +/** + * Setup containers + */ +export async function setupContainers() { + const docker = new Docker(); + if (process.platform !== 'linux') { + await createNetwork(docker, NETWORK_NAME); + } + + // Create PostgreSQL and KAPI containers on the same network + const psqlContainer = await pullAndCreatePsqlContainer(docker); + const kapiContainer = await pullAndCreateKapiContainer(docker); + + return { + kapi: kapiContainer, + psql: psqlContainer, + }; +} + +export async function startContainerIfNotRunning(container: Docker.Container) { + const containerInfo = await container.inspect(); + const status = containerInfo.State.Status; + + if (status === 'running') { + console.log(`Container ${container.id} is running`); + return; + } + + console.log(`Starting container ${container.id}...`); + await container.start(); + await waitForContainerRunning(container); +} + +async function waitForContainerRunning( + container: Docker.Container, + retries = 5, + interval = 5000, +) { + for (let i = 0; i < retries; i++) { + const containerInfo = await container.inspect(); + const status = containerInfo.State.Status; + + if (status === 'running') { + console.log(`Container ${container.id} is running`); + return; + } + + console.log( + `Waiting for container ${container.id} to be running. Current status: ${status}`, + ); + await new Promise((resolve) => setTimeout(resolve, interval)); + } + + throw new Error( + `Container did not start running after ${ + (retries * interval) / 1000 + } seconds`, + ); +} diff --git a/test/helpers/dsm.ts b/test/helpers/dsm.ts index 05e7dcf5..8136eaed 100644 --- a/test/helpers/dsm.ts +++ b/test/helpers/dsm.ts @@ -1,61 +1,136 @@ import { ethers } from 'ethers'; -import { - SECURITY_MODULE, - SECURITY_MODULE_OWNER, - GANACHE_PORT, - NO_PRIVKEY_MESSAGE, -} from '../constants'; -import { SecurityAbi__factory } from 'generated'; - -function createProvider() { - return new ethers.providers.JsonRpcProvider( - `http://127.0.0.1:${GANACHE_PORT}`, - ); -} +import { NO_PRIVKEY_MESSAGE } from '../constants'; +import { LidoAbi__factory, SecurityAbi__factory } from 'generated'; +import { accountImpersonate, setBalance, testSetupProvider } from './provider'; +import { getLocator } from './sr.contract'; +import { Contract } from '@ethersproject/contracts'; +import { wqAbi } from './wq.abi'; +import { VOTING } from './voting'; function createWallet(provider: ethers.providers.JsonRpcProvider) { if (!process.env.WALLET_PRIVATE_KEY) throw new Error(NO_PRIVKEY_MESSAGE); return new ethers.Wallet(process.env.WALLET_PRIVATE_KEY, provider); } -export async function addGuardians( - params = { - securityModule: SECURITY_MODULE, - securityModuleOwner: SECURITY_MODULE_OWNER, - }, -) { - const provider = createProvider(); - const wallet = createWallet(provider); +// return with owner sign owner +export async function getSecurityContract() { + const locator = await getLocator(); + const dsm = await locator.depositSecurityModule(); - // Convert the ETH amount to wei - const amountInWei = ethers.utils.parseEther('5'); + return SecurityAbi__factory.connect(dsm, testSetupProvider); +} - const tx = await wallet.sendTransaction({ - to: params.securityModuleOwner, - value: amountInWei, - }); +export async function getSecurityOwner() { + const dsm = await getSecurityContract(); - // Wait for the transaction to be mined - await tx.wait(); + return await dsm.getOwner(); +} + +export async function getLidoWC() { + const locator = getLocator(); + const lido = await locator.lido(); + const contract = LidoAbi__factory.connect(lido, testSetupProvider); + return await contract.getWithdrawalCredentials(); +} + +export async function getGuardians() { + const contract = await getSecurityContract(); + return await contract.getGuardians(); +} - const signer = provider.getSigner(params.securityModuleOwner); +export async function isDepositsPaused() { + const contract = await getSecurityContract(); + return await contract.isDepositsPaused(); +} + +export async function addGuardians(params: { + securityModuleOwner: string; + securityModuleAddress: string; +}) { + await accountImpersonate(params.securityModuleOwner); + const wallet = createWallet(testSetupProvider); + + await setBalance(params.securityModuleOwner, 5); + + const signer = testSetupProvider.getSigner(params.securityModuleOwner); const securityContract = SecurityAbi__factory.connect( - params.securityModule, + params.securityModuleAddress, signer, ); await securityContract.functions.addGuardian(wallet.address, 1); } export async function setGuardianBalance(eth: string) { - const provider = createProvider(); - const wallet = createWallet(provider); + const wallet = createWallet(testSetupProvider); + + await setBalance(wallet.address, Number(eth)); +} + +export async function deposit(moduleId: number) { + const locator = getLocator(); + const dsm = await locator.depositSecurityModule(); + const lidoAddress = await locator.lido(); + const withdrawalQueueAddress = await locator.withdrawalQueue(); + const network = await testSetupProvider.getNetwork(); + const CHAIN_ID = network.chainId; + const voting = VOTING[CHAIN_ID]; + + await accountImpersonate(dsm); + await accountImpersonate(voting); + await setBalance(dsm, 100); + await setBalance(voting, 100); + + const signer = testSetupProvider.getSigner(dsm); + + const lido = LidoAbi__factory.connect(lidoAddress, signer); + const withdrawalQueue = new Contract( + withdrawalQueueAddress, + wqAbi, + testSetupProvider, + ); + + const votingSigner = testSetupProvider.getSigner(voting); + + const lidoVotingSigner = LidoAbi__factory.connect(lidoAddress, votingSigner); + + await lidoVotingSigner.setStakingLimit( + ethers.utils.parseEther('120000'), // _maxStakeLimit + ethers.utils.parseEther('120000'), // _stakeLimitIncreasePerBlock + ); + + const unfinalizedStETHWei = await withdrawalQueue.unfinalizedStETH(); + const depositableEtherWei = await lido.getBufferedEther(); + + // If amount negative, this value show how much eth we need to satisfy withdrawals + // If possitive, it is the value we can use for deposits + const amountForDeposits = depositableEtherWei + .sub(unfinalizedStETHWei) + .abs() + .add(ethers.utils.parseEther('100000')); + const amountForDepositsInEth = ethers.utils.formatEther(amountForDeposits); + + transferEther(lidoAddress, amountForDepositsInEth); + + await new Promise((res) => setTimeout(res, 12000)); + + const tx = await lido.deposit(1, moduleId, new Uint8Array()); + + await tx.wait(); +} + +export async function transferEther(recipientAddress: string, amount: string) { + if (!process.env.WALLET_PRIVATE_KEY) throw new Error(NO_PRIVKEY_MESSAGE); + const wallet = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY); + const signer = testSetupProvider.getSigner(wallet.address); + await setBalance(wallet.address, 1000000); + + const tx = { + to: recipientAddress, + value: ethers.utils.parseEther(amount), + }; - // Convert the ETH amount to wei - const amountInWei = ethers.utils.parseEther(eth); + const transactionResponse = await signer.sendTransaction(tx); - await provider.send('evm_setAccountBalance', [ - wallet.address, - ethers.utils.hexlify(amountInWei), - ]); + await transactionResponse.wait(); } diff --git a/test/helpers/easy-tack.ts b/test/helpers/easy-tack.ts new file mode 100644 index 00000000..98ed3641 --- /dev/null +++ b/test/helpers/easy-tack.ts @@ -0,0 +1,7 @@ +import { CHAINS } from 'contracts/repository/locator/locator.constants'; + +// TODO: read from ET +export const EVM_SCRIPT_EXECUTOR = { + [CHAINS.Holesky]: '0x2819B65021E13CEEB9AC33E77DB32c7e64e7520D', + [CHAINS.Mainnet]: '0xFE5986E06210aC1eCC1aDCafc0cc7f8D63B3F977', +}; diff --git a/test/helpers/hardhat-server.ts b/test/helpers/hardhat-server.ts new file mode 100644 index 00000000..6b0bef7d --- /dev/null +++ b/test/helpers/hardhat-server.ts @@ -0,0 +1,100 @@ +import { spawn, ChildProcessWithoutNullStreams } from 'child_process'; +import { exec } from 'child_process'; + +export class HardhatServer { + private hardhatProcess: ChildProcessWithoutNullStreams | null = null; + private ready = false; + + // Method to start Hardhat and wait until it's ready + public async start() { + return new Promise((resolve, reject) => { + this.hardhatProcess = spawn('npx', [ + 'hardhat', + 'node', + '--hostname', + '0.0.0.0', + ]); + + if (!this.hardhatProcess) { + return reject(new Error('Failed to start Hardhat process')); + } + + // Log the PID of the started process + console.log( + `Hardhat process started with PID: ${this.hardhatProcess.pid}`, + ); + + // Listen for stdout to detect when Hardhat is ready + this.hardhatProcess.stdout.on('data', (data) => { + const output = data.toString(); + + // Check for the Hardhat ready message + if (output.includes('Started HTTP and WebSocket JSON-RPC server')) { + this.ready = true; + resolve(); + } + }); + + // Listen for errors + this.hardhatProcess.stderr.on('data', (data) => { + console.error(`Hardhat stderr: ${data}`); + }); + + this.hardhatProcess.on('error', (error) => { + console.error(`Failed to start Hardhat: ${error}`); + reject(error); + }); + + this.hardhatProcess.on('close', (code) => { + if (code !== 0 && !this.ready) { + reject( + new Error(`Hardhat process exited unexpectedly with code ${code}`), + ); + } + }); + }); + } + + public async stop() { + if (this.hardhatProcess) { + try { + await this.forceKillPort(this.hardhatProcess, 8545); + } catch (error) { + console.error( + 'Error occurred while stopping the Hardhat process:', + error, + ); + } + } else { + console.log('No Hardhat process to stop.'); + } + } + + // Additional method to force-kill any process on a specific port (Linux-only) + private async forceKillPort(hardhatProcess, port: number): Promise { + // Attempt to kill the process + hardhatProcess.kill('SIGTERM'); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + if (process.platform !== 'linux') return; + + return new Promise((resolve) => { + exec( + `lsof -i :${port} | awk 'NR!=1 {print $2}' | xargs kill -9`, + (error, stdout, stderr) => { + if (error) { + console.warn( + `Failed to force-kill processes on port ${port}: ${error}`, + ); + } else if (stderr) { + console.warn(`Standard error from force-kill command: ${stderr}`); + } else { + console.log(`Successfully force-killed processes on port ${port}`); + } + resolve(); + }, + ); + }); + } +} diff --git a/test/helpers/index.ts b/test/helpers/index.ts deleted file mode 100644 index 1a90aea5..00000000 --- a/test/helpers/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './computeDomain'; -export * from './mockKeysApi'; diff --git a/test/helpers/kapi.ts b/test/helpers/kapi.ts new file mode 100644 index 00000000..d6c66b2e --- /dev/null +++ b/test/helpers/kapi.ts @@ -0,0 +1,55 @@ +import axios from 'axios'; + +export async function waitForNewerBlock(block: number) { + let isServiceReady = false; + while (!isServiceReady) { + try { + const response = await axios.get('http://127.0.0.1:3000/v1/status'); + if (response.data['elBlockSnapshot']['blockNumber'] > block) { + console.log( + `KAPI is ready! Got Block newer than ${block}, got ${response.data['elBlockSnapshot']['blockNumber']} `, + ); + isServiceReady = true; + } + } catch (err) { + // console.log('Service not ready yet, waiting...'); + await new Promise((resolve) => setTimeout(resolve, 10_000)); + } + } +} + +// TODO: get rid of one of modules waitForNewerOrEqBlock or waitForNewerBlock +export async function waitForNewerOrEqBlock(block: number) { + let isServiceReady = false; + while (!isServiceReady) { + try { + // TODO: write url in the constant + const response = await axios.get('http://127.0.0.1:3000/v1/status'); + if (response.data['elBlockSnapshot']['blockNumber'] >= block) { + console.log( + `KAPI is ready! Got Block newer than ${block}, got ${response.data['elBlockSnapshot']['blockNumber']} `, + ); + isServiceReady = true; + } + } catch (err) { + // console.log('Service not ready yet, waiting...'); + await new Promise((resolve) => setTimeout(resolve, 10_000)); + } + } +} + +export async function waitKAPIUpdateModulesKeys(): Promise { + let isServiceReady = false; + while (!isServiceReady) { + try { + const response = await axios.get('http://127.0.0.1:3000/v1/modules'); + if (response.status === 200) { + console.log('Kapi is ready'); + isServiceReady = true; + } + } catch (err: any) { + console.log('Service not ready yet, waiting...', err.message); + await new Promise((resolve) => setTimeout(resolve, 10_000)); + } + } +} diff --git a/test/helpers/keys-fixtures.ts b/test/helpers/keys-fixtures.ts deleted file mode 100644 index cbaf0754..00000000 --- a/test/helpers/keys-fixtures.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { FORK_BLOCK, NOP_REGISTRY } from '../constants'; - -export const mockKey = { - key: '0xa92daac72ad30458120e2a186400a673a4663768f118806c986ee045667c5599a608da5ea44354df124e6ac8d4ea9570', - depositSignature: - '0x93f492eed0fd6e86e7b50092027a06e186a5edf88250afb82c8c8ebf1febcf28e3a50669a302a4d2d451fab3d0d7d21b174ebf0061c685c2322b06dc6e714aa2a228218884e1fbe033287173c3162796acb4a526eaad031f19bd9dccb7f97a4d', - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, -}; - -export const mockKeyEvent = { - operatorIndex: 0, - key: '0xa92daac72ad30458120e2a186400a673a4663768f118806c986ee045667c5599a608da5ea44354df124e6ac8d4ea9570', - moduleAddress: NOP_REGISTRY, - logIndex: 0, - blockNumber: FORK_BLOCK - 1, - blockHash: '0x1', -}; - -export const mockKey2 = { - key: '0x859eba194d2169faaedef29d7e3c28c954ec4790f050c9a53cb8a825700aa6cb388ffff041c69e8e4974ca716d4528fa', - depositSignature: - '0xb9699abf2672d54d3cab8f438e0d0cb45ad7de762ae1caff09d4bc571c4c16a91b33b11dbe567508d7db3c83a5f97adb11d53ab65ed8ffd1937da78b3942ba82bcc5b646a0c32df1ea61f0773ab5c976f0f6609bd6938f59eb2be0b20bfd14f7', - operatorIndex: 0, - used: true, - moduleAddress: NOP_REGISTRY, - index: 1, - vetted: true, -}; diff --git a/test/helpers/mockKeysApi.ts b/test/helpers/mockKeysApi.ts deleted file mode 100644 index 7d2c0ec8..00000000 --- a/test/helpers/mockKeysApi.ts +++ /dev/null @@ -1,90 +0,0 @@ -import ethers from 'ethers'; - -import { KeysApiService } from '../../src/keys-api/keys-api.service'; -import { SIMPLE_DVT, NOP_REGISTRY } from './../constants'; -import { SRModule } from 'keys-api/interfaces'; -import { ELBlockSnapshot } from 'keys-api/interfaces/ELBlockSnapshot'; -import { RegistryKey } from 'keys-api/interfaces/RegistryKey'; - -export const mockedModuleCurated: SRModule = { - type: 'curated-onchain-v1', - id: 1, - stakingModuleAddress: NOP_REGISTRY, - moduleFee: 10, - treasuryFee: 10, - targetShare: 10, - status: 1, - name: 'NodeOperatorRegistry', - lastDepositAt: 1234345657, - lastDepositBlock: 12345, - lastChangedBlockHash: '', - nonce: 6046, - exitedValidatorsCount: 0, - active: true, -}; - -export const mockedModuleDvt: SRModule = { - type: 'curated-onchain-v1', - id: 2, - stakingModuleAddress: SIMPLE_DVT, - moduleFee: 10, - treasuryFee: 10, - targetShare: 10, - status: 1, - name: 'NodeOperatorRegistrySimpleDvt', - lastDepositAt: 1234345657, - lastDepositBlock: 12345, - lastChangedBlockHash: '', - nonce: 6046, - exitedValidatorsCount: 0, - active: true, -}; - -export const mockMeta = ( - block: ethers.providers.Block, - lastChangedBlockHash: string, -) => ({ - blockNumber: block.number, - blockHash: block.hash, - timestamp: block.timestamp, - lastChangedBlockHash, -}); - -export const keysApiMockGetModules = ( - keysApiService: KeysApiService, - modules: SRModule[], - meta: ELBlockSnapshot, -) => { - jest.spyOn(keysApiService, 'getModules').mockImplementation(async () => ({ - data: modules, - elBlockSnapshot: meta, - })); -}; - -export const keysApiMockGetAllKeys = ( - keysApiService: KeysApiService, - keys: RegistryKey[], - meta: ELBlockSnapshot, -) => { - jest.spyOn(keysApiService, 'getKeys').mockImplementation(async () => ({ - data: keys, - meta: { - elBlockSnapshot: meta, - }, - })); -}; - -export const mockedKeysApiFind = ( - keysApiService: KeysApiService, - keys: RegistryKey[], - meta: ELBlockSnapshot, -) => { - jest - .spyOn(keysApiService, 'getKeysByPubkeys') - .mockImplementation(async () => ({ - data: keys, - meta: { - elBlockSnapshot: meta, - }, - })); -}; diff --git a/test/helpers/nor.contract.ts b/test/helpers/nor.contract.ts new file mode 100644 index 00000000..ecf3bac8 --- /dev/null +++ b/test/helpers/nor.contract.ts @@ -0,0 +1,104 @@ +import { Contract } from '@ethersproject/contracts'; +import { curatedAbi } from './curated.abi'; +import { EVM_SCRIPT_EXECUTOR } from './easy-tack'; +import { accountImpersonate, setBalance, testSetupProvider } from './provider'; + +export class CuratedOnchainV1 { + // short version of contract abi + + address: string; + contract: Contract; + + constructor(address: string) { + // initialize contract + this.address = address; + + this.contract = new Contract(address, curatedAbi, testSetupProvider); + } + + async getOperatorsCount(block: number): Promise { + return Number( + await this.contract.getNodeOperatorsCount({ blockTag: block }), + ); + } + + async addSigningKey( + _nodeOperatorId: number, + _keysCount: number, + _publicKeys: string, + _signatures: string, + signer_account: string, + ): Promise { + //impersonate account that can add node operator + await accountImpersonate(signer_account); + await setBalance(signer_account, 100); + + const impersonatedSigner = await testSetupProvider.getSigner( + signer_account, + ); + + this.contract = new Contract(this.address, curatedAbi, impersonatedSigner); + + const tx = await this.contract.addSigningKeys( + _nodeOperatorId, + _keysCount, + _publicKeys, + _signatures, + ); + + // Wait for the transaction to be mined + await tx.wait(); + } + + async setStakingLimit(_nodeOperatorId: number, _stakingLimit: number) { + const network = await testSetupProvider.getNetwork(); + const CHAIN_ID = network.chainId; + + const signer_account = EVM_SCRIPT_EXECUTOR[CHAIN_ID]; + + await accountImpersonate(signer_account); + await setBalance(signer_account, 5); + + const impersonatedSigner = await testSetupProvider.getSigner( + signer_account, + ); + + this.contract = new Contract(this.address, curatedAbi, impersonatedSigner); + + const tx = await this.contract.setNodeOperatorStakingLimit( + _nodeOperatorId, + _stakingLimit, + ); + + // Wait for the transaction to be mined + await tx.wait(); + } + + async getOperator(nodeOperatorId: number, fullInfo: boolean) { + this.contract = new Contract(this.address, curatedAbi, testSetupProvider); + + const operator = await this.contract.getNodeOperator( + nodeOperatorId, + fullInfo, + ); + + // Wait for the transaction to be mined + return operator; + } + + async getActiveOperators() { + this.contract = new Contract(this.address, curatedAbi, testSetupProvider); + + const count = Number(await this.contract.getNodeOperatorsCount()); + const activeOperators: any[] = []; + + for (let i = 0; i < count; i++) { + const operator = await this.getOperator(i, false); + if (operator.active) { + activeOperators.push({ ...operator, index: i }); + } + } + + return activeOperators; + } +} diff --git a/test/helpers/pg.ts b/test/helpers/pg.ts new file mode 100644 index 00000000..5b65b1a8 --- /dev/null +++ b/test/helpers/pg.ts @@ -0,0 +1,29 @@ +import { Client } from 'pg'; +import * as dotenv from 'dotenv'; + +dotenv.config(); + +const POSTGRES_PORT = process.env.POSTGRES_PORT || 5432; + +export async function truncateTables() { + const client = new Client({ + host: 'localhost', + port: POSTGRES_PORT, + user: 'postgres', + password: 'postgres', + database: 'node_operator_keys_service_db', + }); + + try { + await client.connect(); + await client.query( + `TRUNCATE registry_key, registry_operator, el_meta_entity, sr_module_entity`, + ); + console.log('All tables truncated successfully'); + } catch (error) { + console.error('Error truncating tables:', error); + } finally { + await client.end(); + console.log('Database connection closed'); + } +} diff --git a/test/helpers/provider.ts b/test/helpers/provider.ts new file mode 100644 index 00000000..88c317bf --- /dev/null +++ b/test/helpers/provider.ts @@ -0,0 +1,23 @@ +import { JsonRpcProvider } from '@ethersproject/providers'; +import { ethers } from 'ethers'; +import { TEST_SERVER_URL } from '../constants'; + +export const testSetupProvider = new JsonRpcProvider(TEST_SERVER_URL); + +export const accountImpersonate = async (account: string): Promise => { + testSetupProvider.send('hardhat_impersonateAccount', [account]); +}; + +export const setBalance = async (account: string, eth: number) => { + const amountInWei = ethers.utils.parseEther(eth.toString()); + + await testSetupProvider.send('hardhat_setBalance', [ + account, + ethers.utils.hexlify(amountInWei), + ]); +}; + +export const getChainId = async () => { + const network = await testSetupProvider.getNetwork(); + return network.chainId; +}; diff --git a/test/helpers/reduce-keys.ts b/test/helpers/reduce-keys.ts new file mode 100644 index 00000000..2e4e0eee --- /dev/null +++ b/test/helpers/reduce-keys.ts @@ -0,0 +1,139 @@ +import { solidityKeccak256, hexlify, hexZeroPad } from 'ethers/lib/utils'; +import { BigNumber } from 'ethers'; +import { getStakingModules, getType } from './sr.contract'; +import { testSetupProvider } from './provider'; + +export const CURATED_ONCHAIN_V1_TYPE = 'curated-onchain-v1'; +export const COMMUNITY_ONCHAIN_V1_TYPE = 'community-onchain-v1'; +const OPERATORS_COUNT = 3; +const KEYS_COUNT = 3; + +// curated-onchain-v1 operator and keys reducing methods + +const TOTAL_OPERATORS_COUNT_POSITION = + '0xe2a589ae0816b289a9d29b7c085f8eba4b5525accca9fa8ff4dba3f5a41287e8'; +const ACTIVE_OPERATORS_COUNT_POSITION = + '0x6f5220989faafdc182d508d697678366f4e831f5f56166ad69bfc253fc548fb1'; + +// Helper function to convert decimal number to 16-character hexadecimal string +const to16 = (decimalNumber: number) => { + // Convert the number to hex and pad it to 8 bytes (16 characters) + return hexZeroPad(hexlify(decimalNumber), 8).replace('0x', ''); +}; + +// SigningKeysStats bit replacement +// |--------- 64 bit ----------|--------- 64 bit ---------|--------- 64 bit ---------|--------- 64 bit ---------| +// | TOTAL_DEPOSITED_KEYS_COUNT| TOTAL_KEYS_COUNT | TOTAL_EXITED_KEYS_COUNT | TOTAL_VETTED_KEYS_COUNT | +// | 192 - 255 | 128 - 191 | 64 - 127 | 0 - 63 | +// +const signingKeysStatsReplacer = (keysCount: number) => { + return `0x${to16(keysCount)}${to16(keysCount)}0000000000000000${to16( + keysCount, + )}`; +}; + +export const cutOperators = async ( + contractAddress: string, + opCount: number, +) => { + // cut node operators count + + const opCountInHex = hexZeroPad(hexlify(opCount), 32); + + // Set TOTAL_OPERATORS_COUNT to 3 + await testSetupProvider.send('hardhat_setStorageAt', [ + contractAddress, + TOTAL_OPERATORS_COUNT_POSITION, + opCountInHex, + ]); + + // Set ACTIVE_OPERATORS_COUNT to 3 + await testSetupProvider.send('hardhat_setStorageAt', [ + contractAddress, + ACTIVE_OPERATORS_COUNT_POSITION, + opCountInHex, + ]); +}; + +// Function to update the keys count in storage (cut keys) +export const cutKeys = async ( + contractAddress: string, + noId: number, + keysCount = 10, +) => { + const [, , nodeOperatorsSlot2] = [ + // slot where operator with is nodId stored + // active and rewardAddress fields will be stored in this slot + solidityKeccak256(['uint256', 'uint256'], [noId, 0]), + // string is dynamical, reference on name will be stored at 1 slot + BigNumber.from(solidityKeccak256(['uint256', 'uint256'], [noId, 0])) + .add(1) + .toHexString(), + // signingKeysStats will be stored at the next slot + BigNumber.from(solidityKeccak256(['uint256', 'uint256'], [noId, 0])) + .add(2) + .toHexString(), + // stuckPenaltyStats, targetValidatorsStats next two slots + ]; + + // Build replacement values for the keys and validators count + const keys = signingKeysStatsReplacer(keysCount); + + await testSetupProvider.send('hardhat_setStorageAt', [ + contractAddress, + nodeOperatorsSlot2, + keys, + ]); +}; + +export const cutCuratedTypeModuleState = async ( + contractAddress: string, + opCount: number, + keysCount: number, +) => { + await cutOperators(contractAddress, opCount); + + for (let opId = 0; opId < opCount; opId++) { + await cutKeys(contractAddress, opId, keysCount); + } +}; + +export const cutCommunityTypeModuleNodeOperators = async ( + contractAddress: string, + newCount: number, +) => { + const slotValue = await testSetupProvider.getStorageAt(contractAddress, 9); + const nodeOperatorsCountSlotIndex = 9; + const newOperatorsCount = hexZeroPad(hexlify(newCount), 8); + const unchangedPart = slotValue.slice(18); // 0x + 8 byte + const newStorageValue = newOperatorsCount + unchangedPart; + await testSetupProvider.send('hardhat_setStorageAt', [ + contractAddress, + hexZeroPad(hexlify(nodeOperatorsCountSlotIndex), 32), + newStorageValue, + ]); +}; + +export const cutModulesKeys = async () => { + // get sr modules + const stakingModules = await getStakingModules(); + + for (const stakingModule of stakingModules) { + const type = await getType(stakingModule.stakingModuleAddress); + if (type === CURATED_ONCHAIN_V1_TYPE) { + await cutCuratedTypeModuleState( + stakingModule.stakingModuleAddress, + OPERATORS_COUNT, + KEYS_COUNT, + ); + continue; + } + + if (type === COMMUNITY_ONCHAIN_V1_TYPE) { + await cutCommunityTypeModuleNodeOperators( + stakingModule.stakingModuleAddress, + OPERATORS_COUNT, + ); + } + } +}; diff --git a/test/helpers/sr.contract.ts b/test/helpers/sr.contract.ts new file mode 100644 index 00000000..fb48d55d --- /dev/null +++ b/test/helpers/sr.contract.ts @@ -0,0 +1,93 @@ +import { ethers, BigNumber } from 'ethers'; +import { testSetupProvider } from './provider'; +import * as dotenv from 'dotenv'; +import { + IStakingModuleAbi__factory, + LocatorAbi__factory, + StakingRouterAbi__factory, +} from 'generated'; + +export const CURATED_ONCHAIN_V1_TYPE = 'curated-onchain-v1'; +export const COMMUNITY_ONCHAIN_V1_TYPE = 'community-onchain-v1'; + +dotenv.config(); + +export function getLocator() { + const locatorAddress = process.env.LOCATOR_DEVNET_ADDRESS; + if (!locatorAddress) { + throw new Error('Locator address was not set'); + } + + return LocatorAbi__factory.connect(locatorAddress, testSetupProvider); +} + +export async function getStakingModules(): Promise< + ([ + number, + string, + number, + number, + number, + number, + string, + BigNumber, + BigNumber, + BigNumber, + ] & { + id: number; + stakingModuleAddress: string; + stakingModuleFee: number; + treasuryFee: number; + targetShare: number; + status: number; + name: string; + lastDepositAt: BigNumber; + lastDepositBlock: BigNumber; + exitedValidatorsCount: BigNumber; + })[] +> { + const locator = getLocator(); + const stakingRouterAddress = await locator.stakingRouter(); + + const contract = StakingRouterAbi__factory.connect( + stakingRouterAddress, + testSetupProvider, + ); + return await contract.getStakingModules(); +} + +export async function getStakingModulesInfo() { + const srModules = await getStakingModules(); + const stakingModulesAddresses = srModules.map( + (stakingModule) => stakingModule.stakingModuleAddress, + ); + + const curatedModule = srModules.find((srModule) => srModule.id === 1); + if (!curatedModule) { + throw new Error('Curated module with id = 1 was not found in list'); + } + const curatedModuleAddress = curatedModule.stakingModuleAddress; + + const sdvtModule = srModules.find((srModule) => srModule.id === 2); + if (!sdvtModule) { + throw new Error('SDVT module with id = 2 was not found in list'); + } + const sdvtModuleAddress = sdvtModule.stakingModuleAddress; + + return { + stakingModulesAddresses, + curatedModuleAddress, + sdvtModuleAddress, + srModules, + }; +} + +export async function getType(contractAddress: string) { + const contract = IStakingModuleAbi__factory.connect( + contractAddress, + testSetupProvider, + ); + + const type = await contract.getType(); + return ethers.utils.parseBytes32String(type); +} diff --git a/test/helpers/test-setup.ts b/test/helpers/test-setup.ts index 3dee69ba..0e50cd34 100644 --- a/test/helpers/test-setup.ts +++ b/test/helpers/test-setup.ts @@ -7,16 +7,16 @@ import { RepositoryModule } from 'contracts/repository'; import { SecurityModule } from 'contracts/security'; import { GuardianModule } from 'guardian'; import { KeysApiModule } from 'keys-api/keys-api.module'; -import { GanacheProviderModule } from 'provider'; import { WalletModule } from 'wallet'; import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston'; +import { TestProviderModule } from 'provider'; export const setupTestingModule = async () => { const moduleRef = await Test.createTestingModule({ imports: [ - GanacheProviderModule.forRoot(), + TestProviderModule.forRoot(), ConfigModule.forRoot(), PrometheusModule, LoggerModule, @@ -46,25 +46,3 @@ export const initLevelDB = async ( await levelDBService.initialize(); await signKeyLevelDBService.initialize(); }; - -export const closeServer = async ( - server, - levelDBService: DepositsRegistryStoreService, - signKeyLevelDBService: SignKeyLevelDBService, -) => { - await server.close(); - await levelDBService.deleteCache(); - await signKeyLevelDBService.deleteCache(); - await levelDBService.close(); - await signKeyLevelDBService.close(); -}; - -export const closeLevelDB = async ( - levelDBService: DepositsRegistryStoreService, - signKeyLevelDBService: SignKeyLevelDBService, -) => { - await levelDBService.deleteCache(); - await signKeyLevelDBService.deleteCache(); - await levelDBService.close(); - await signKeyLevelDBService.close(); -}; diff --git a/test/helpers/voting.ts b/test/helpers/voting.ts new file mode 100644 index 00000000..0c549069 --- /dev/null +++ b/test/helpers/voting.ts @@ -0,0 +1,7 @@ +import { CHAINS } from 'contracts/repository/locator/locator.constants'; + +// TODO: read from ET +export const VOTING = { + [CHAINS.Holesky]: '0xdA7d2573Df555002503F29aA4003e398d28cc00f', + [CHAINS.Mainnet]: '0x2e59A20f205bB85a89C53f1936454680651E618e', +}; diff --git a/test/helpers/wq.abi.ts b/test/helpers/wq.abi.ts new file mode 100644 index 00000000..c27d1e4e --- /dev/null +++ b/test/helpers/wq.abi.ts @@ -0,0 +1,1131 @@ +export const wqAbi = [ + { + inputs: [ + { internalType: 'address', name: '_wstETH', type: 'address' }, + { internalType: 'string', name: '_name', type: 'string' }, + { internalType: 'string', name: '_symbol', type: 'string' }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { inputs: [], name: 'AdminZeroAddress', type: 'error' }, + { inputs: [], name: 'ApprovalToOwner', type: 'error' }, + { inputs: [], name: 'ApproveToCaller', type: 'error' }, + { + inputs: [ + { internalType: 'uint256', name: '_firstArrayLength', type: 'uint256' }, + { internalType: 'uint256', name: '_secondArrayLength', type: 'uint256' }, + ], + name: 'ArraysLengthMismatch', + type: 'error', + }, + { inputs: [], name: 'BatchesAreNotSorted', type: 'error' }, + { inputs: [], name: 'CantSendValueRecipientMayHaveReverted', type: 'error' }, + { inputs: [], name: 'EmptyBatches', type: 'error' }, + { inputs: [], name: 'InvalidContractVersionIncrement', type: 'error' }, + { + inputs: [{ internalType: 'uint256', name: '_hint', type: 'uint256' }], + name: 'InvalidHint', + type: 'error', + }, + { + inputs: [{ internalType: 'address', name: '', type: 'address' }], + name: 'InvalidOwnerAddress', + type: 'error', + }, + { inputs: [], name: 'InvalidReportTimestamp', type: 'error' }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'InvalidRequestId', + type: 'error', + }, + { + inputs: [ + { internalType: 'uint256', name: 'startId', type: 'uint256' }, + { internalType: 'uint256', name: 'endId', type: 'uint256' }, + ], + name: 'InvalidRequestIdRange', + type: 'error', + }, + { inputs: [], name: 'InvalidState', type: 'error' }, + { inputs: [], name: 'NonZeroContractVersionOnInit', type: 'error' }, + { inputs: [], name: 'NotEnoughEther', type: 'error' }, + { + inputs: [ + { internalType: 'address', name: '_sender', type: 'address' }, + { internalType: 'address', name: '_owner', type: 'address' }, + ], + name: 'NotOwner', + type: 'error', + }, + { + inputs: [{ internalType: 'address', name: 'sender', type: 'address' }], + name: 'NotOwnerOrApproved', + type: 'error', + }, + { + inputs: [{ internalType: 'address', name: 'sender', type: 'address' }], + name: 'NotOwnerOrApprovedForAll', + type: 'error', + }, + { inputs: [], name: 'PauseUntilMustBeInFuture', type: 'error' }, + { inputs: [], name: 'PausedExpected', type: 'error' }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'RequestAlreadyClaimed', + type: 'error', + }, + { + inputs: [ + { internalType: 'uint256', name: '_amountOfStETH', type: 'uint256' }, + ], + name: 'RequestAmountTooLarge', + type: 'error', + }, + { + inputs: [ + { internalType: 'uint256', name: '_amountOfStETH', type: 'uint256' }, + ], + name: 'RequestAmountTooSmall', + type: 'error', + }, + { inputs: [], name: 'RequestIdsNotSorted', type: 'error' }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'RequestNotFoundOrNotFinalized', + type: 'error', + }, + { inputs: [], name: 'ResumedExpected', type: 'error' }, + { + inputs: [{ internalType: 'string', name: 'str', type: 'string' }], + name: 'StringTooLong', + type: 'error', + }, + { + inputs: [ + { internalType: 'uint256', name: 'sent', type: 'uint256' }, + { internalType: 'uint256', name: 'maxExpected', type: 'uint256' }, + ], + name: 'TooMuchEtherToFinalize', + type: 'error', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'realOwner', type: 'address' }, + ], + name: 'TransferFromIncorrectOwner', + type: 'error', + }, + { inputs: [], name: 'TransferFromZeroAddress', type: 'error' }, + { + inputs: [{ internalType: 'address', name: '', type: 'address' }], + name: 'TransferToNonIERC721Receiver', + type: 'error', + }, + { inputs: [], name: 'TransferToThemselves', type: 'error' }, + { inputs: [], name: 'TransferToZeroAddress', type: 'error' }, + { + inputs: [ + { internalType: 'uint256', name: 'expected', type: 'uint256' }, + { internalType: 'uint256', name: 'received', type: 'uint256' }, + ], + name: 'UnexpectedContractVersion', + type: 'error', + }, + { inputs: [], name: 'ZeroAmountOfETH', type: 'error' }, + { inputs: [], name: 'ZeroMetadata', type: 'error' }, + { inputs: [], name: 'ZeroPauseDuration', type: 'error' }, + { inputs: [], name: 'ZeroRecipient', type: 'error' }, + { inputs: [], name: 'ZeroShareRate', type: 'error' }, + { inputs: [], name: 'ZeroTimestamp', type: 'error' }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'approved', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'operator', + type: 'address', + }, + { indexed: false, internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'string', + name: 'baseURI', + type: 'string', + }, + ], + name: 'BaseURISet', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_fromTokenId', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: '_toTokenId', + type: 'uint256', + }, + ], + name: 'BatchMetadataUpdate', + type: 'event', + }, + { anonymous: false, inputs: [], name: 'BunkerModeDisabled', type: 'event' }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_sinceTimestamp', + type: 'uint256', + }, + ], + name: 'BunkerModeEnabled', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'version', + type: 'uint256', + }, + ], + name: 'ContractVersionSet', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_admin', + type: 'address', + }, + ], + name: 'InitializedV1', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'MetadataUpdate', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'nftDescriptorAddress', + type: 'address', + }, + ], + name: 'NftDescriptorAddressSet', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'duration', + type: 'uint256', + }, + ], + name: 'Paused', + type: 'event', + }, + { anonymous: false, inputs: [], name: 'Resumed', type: 'event' }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { + indexed: true, + internalType: 'bytes32', + name: 'previousAdminRole', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'newAdminRole', + type: 'bytes32', + }, + ], + name: 'RoleAdminChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleGranted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { + indexed: true, + internalType: 'address', + name: 'account', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'sender', + type: 'address', + }, + ], + name: 'RoleRevoked', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { + indexed: true, + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'uint256', + name: 'requestId', + type: 'uint256', + }, + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'receiver', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amountOfETH', + type: 'uint256', + }, + ], + name: 'WithdrawalClaimed', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'uint256', + name: 'requestId', + type: 'uint256', + }, + { + indexed: true, + internalType: 'address', + name: 'requestor', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amountOfStETH', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'amountOfShares', + type: 'uint256', + }, + ], + name: 'WithdrawalRequested', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'uint256', name: 'from', type: 'uint256' }, + { indexed: true, internalType: 'uint256', name: 'to', type: 'uint256' }, + { + indexed: false, + internalType: 'uint256', + name: 'amountOfETHLocked', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'sharesToBurn', + type: 'uint256', + }, + { + indexed: false, + internalType: 'uint256', + name: 'timestamp', + type: 'uint256', + }, + ], + name: 'WithdrawalsFinalized', + type: 'event', + }, + { + inputs: [], + name: 'BUNKER_MODE_DISABLED_TIMESTAMP', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'DEFAULT_ADMIN_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'FINALIZE_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MANAGE_TOKEN_URI_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MAX_BATCHES_LENGTH', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MAX_STETH_WITHDRAWAL_AMOUNT', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'MIN_STETH_WITHDRAWAL_AMOUNT', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'ORACLE_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'PAUSE_INFINITELY', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'PAUSE_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'RESUME_ROLE', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'STETH', + outputs: [{ internalType: 'contract IStETH', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'WSTETH', + outputs: [{ internalType: 'contract IWstETH', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_requestId', type: 'uint256' }, + ], + name: 'approve', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: '_owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'bunkerModeSinceTimestamp', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256', name: '_maxShareRate', type: 'uint256' }, + { internalType: 'uint256', name: '_maxTimestamp', type: 'uint256' }, + { internalType: 'uint256', name: '_maxRequestsPerCall', type: 'uint256' }, + { + components: [ + { + internalType: 'uint256', + name: 'remainingEthBudget', + type: 'uint256', + }, + { internalType: 'bool', name: 'finished', type: 'bool' }, + { internalType: 'uint256[36]', name: 'batches', type: 'uint256[36]' }, + { internalType: 'uint256', name: 'batchesLength', type: 'uint256' }, + ], + internalType: 'struct WithdrawalQueueBase.BatchesCalculationState', + name: '_state', + type: 'tuple', + }, + ], + name: 'calculateFinalizationBatches', + outputs: [ + { + components: [ + { + internalType: 'uint256', + name: 'remainingEthBudget', + type: 'uint256', + }, + { internalType: 'bool', name: 'finished', type: 'bool' }, + { internalType: 'uint256[36]', name: 'batches', type: 'uint256[36]' }, + { internalType: 'uint256', name: 'batchesLength', type: 'uint256' }, + ], + internalType: 'struct WithdrawalQueueBase.BatchesCalculationState', + name: '', + type: 'tuple', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'claimWithdrawal', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_requestIds', type: 'uint256[]' }, + { internalType: 'uint256[]', name: '_hints', type: 'uint256[]' }, + ], + name: 'claimWithdrawals', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_requestIds', type: 'uint256[]' }, + { internalType: 'uint256[]', name: '_hints', type: 'uint256[]' }, + { internalType: 'address', name: '_recipient', type: 'address' }, + ], + name: 'claimWithdrawalsTo', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_lastRequestIdToBeFinalized', + type: 'uint256', + }, + { internalType: 'uint256', name: '_maxShareRate', type: 'uint256' }, + ], + name: 'finalize', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_requestIds', type: 'uint256[]' }, + { internalType: 'uint256', name: '_firstIndex', type: 'uint256' }, + { internalType: 'uint256', name: '_lastIndex', type: 'uint256' }, + ], + name: 'findCheckpointHints', + outputs: [ + { internalType: 'uint256[]', name: 'hintIds', type: 'uint256[]' }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'getApproved', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getBaseURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_requestIds', type: 'uint256[]' }, + { internalType: 'uint256[]', name: '_hints', type: 'uint256[]' }, + ], + name: 'getClaimableEther', + outputs: [ + { + internalType: 'uint256[]', + name: 'claimableEthValues', + type: 'uint256[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getContractVersion', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLastCheckpointIndex', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLastFinalizedRequestId', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLastRequestId', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getLockedEtherAmount', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getNFTDescriptorAddress', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getResumeSinceTimestamp', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes32', name: 'role', type: 'bytes32' }], + name: 'getRoleAdmin', + outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'uint256', name: 'index', type: 'uint256' }, + ], + name: 'getRoleMember', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes32', name: 'role', type: 'bytes32' }], + name: 'getRoleMemberCount', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: '_owner', type: 'address' }], + name: 'getWithdrawalRequests', + outputs: [ + { internalType: 'uint256[]', name: 'requestsIds', type: 'uint256[]' }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_requestIds', type: 'uint256[]' }, + ], + name: 'getWithdrawalStatus', + outputs: [ + { + components: [ + { internalType: 'uint256', name: 'amountOfStETH', type: 'uint256' }, + { internalType: 'uint256', name: 'amountOfShares', type: 'uint256' }, + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'uint256', name: 'timestamp', type: 'uint256' }, + { internalType: 'bool', name: 'isFinalized', type: 'bool' }, + { internalType: 'bool', name: 'isClaimed', type: 'bool' }, + ], + internalType: 'struct WithdrawalQueueBase.WithdrawalRequestStatus[]', + name: 'statuses', + type: 'tuple[]', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'grantRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'hasRole', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: '_admin', type: 'address' }], + name: 'initialize', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_owner', type: 'address' }, + { internalType: 'address', name: '_operator', type: 'address' }, + ], + name: 'isApprovedForAll', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'isBunkerModeActive', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'isPaused', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'bool', name: '_isBunkerModeNow', type: 'bool' }, + { + internalType: 'uint256', + name: '_bunkerStartTimestamp', + type: 'uint256', + }, + { + internalType: 'uint256', + name: '_currentReportTimestamp', + type: 'uint256', + }, + ], + name: 'onOracleReport', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'ownerOf', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_duration', type: 'uint256' }], + name: 'pauseFor', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_pauseUntilInclusive', + type: 'uint256', + }, + ], + name: 'pauseUntil', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_batches', type: 'uint256[]' }, + { internalType: 'uint256', name: '_maxShareRate', type: 'uint256' }, + ], + name: 'prefinalize', + outputs: [ + { internalType: 'uint256', name: 'ethToLock', type: 'uint256' }, + { internalType: 'uint256', name: 'sharesToBurn', type: 'uint256' }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'renounceRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_amounts', type: 'uint256[]' }, + { internalType: 'address', name: '_owner', type: 'address' }, + ], + name: 'requestWithdrawals', + outputs: [ + { internalType: 'uint256[]', name: 'requestIds', type: 'uint256[]' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_amounts', type: 'uint256[]' }, + { internalType: 'address', name: '_owner', type: 'address' }, + { + components: [ + { internalType: 'uint256', name: 'value', type: 'uint256' }, + { internalType: 'uint256', name: 'deadline', type: 'uint256' }, + { internalType: 'uint8', name: 'v', type: 'uint8' }, + { internalType: 'bytes32', name: 'r', type: 'bytes32' }, + { internalType: 'bytes32', name: 's', type: 'bytes32' }, + ], + internalType: 'struct WithdrawalQueue.PermitInput', + name: '_permit', + type: 'tuple', + }, + ], + name: 'requestWithdrawalsWithPermit', + outputs: [ + { internalType: 'uint256[]', name: 'requestIds', type: 'uint256[]' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_amounts', type: 'uint256[]' }, + { internalType: 'address', name: '_owner', type: 'address' }, + ], + name: 'requestWithdrawalsWstETH', + outputs: [ + { internalType: 'uint256[]', name: 'requestIds', type: 'uint256[]' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'uint256[]', name: '_amounts', type: 'uint256[]' }, + { internalType: 'address', name: '_owner', type: 'address' }, + { + components: [ + { internalType: 'uint256', name: 'value', type: 'uint256' }, + { internalType: 'uint256', name: 'deadline', type: 'uint256' }, + { internalType: 'uint8', name: 'v', type: 'uint8' }, + { internalType: 'bytes32', name: 'r', type: 'bytes32' }, + { internalType: 'bytes32', name: 's', type: 'bytes32' }, + ], + internalType: 'struct WithdrawalQueue.PermitInput', + name: '_permit', + type: 'tuple', + }, + ], + name: 'requestWithdrawalsWstETHWithPermit', + outputs: [ + { internalType: 'uint256[]', name: 'requestIds', type: 'uint256[]' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'resume', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'role', type: 'bytes32' }, + { internalType: 'address', name: 'account', type: 'address' }, + ], + name: 'revokeRole', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_from', type: 'address' }, + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_requestId', type: 'uint256' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_from', type: 'address' }, + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_requestId', type: 'uint256' }, + { internalType: 'bytes', name: '_data', type: 'bytes' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_operator', type: 'address' }, + { internalType: 'bool', name: '_approved', type: 'bool' }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'string', name: '_baseURI', type: 'string' }], + name: 'setBaseURI', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_nftDescriptorAddress', + type: 'address', + }, + ], + name: 'setNFTDescriptorAddress', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }], + name: 'supportsInterface', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_requestId', type: 'uint256' }], + name: 'tokenURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: '_from', type: 'address' }, + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_requestId', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'unfinalizedRequestNumber', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'unfinalizedStETH', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, +]; diff --git a/test/invalid-keys-v3.e2e-spec.ts b/test/invalid-keys-v3.e2e-spec.ts index 37ae4251..f10df75f 100644 --- a/test/invalid-keys-v3.e2e-spec.ts +++ b/test/invalid-keys-v3.e2e-spec.ts @@ -1,62 +1,49 @@ // Global Helpers import { toHexString } from '@chainsafe/ssz'; -// Helpers -import { - keysApiMockGetAllKeys, - keysApiMockGetModules, - mockedModuleCurated, - mockedModuleDvt, - mockMeta, -} from './helpers'; - // Constants -import { - TESTS_TIMEOUT, - SLEEP_FOR_RESULT, - CHAIN_ID, - GANACHE_PORT, - sk, - pk, - NOP_REGISTRY, - SIMPLE_DVT, - LIDO_WC, - UNLOCKED_ACCOUNTS, - FORK_BLOCK, -} from './constants'; +import { SLEEP_FOR_RESULT, pk } from './constants'; // Mock rabbit straight away jest.mock('../src/transport/stomp/stomp.client.ts'); -jest.setTimeout(10_000); - -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; +import { setupTestingModule, initLevelDB } from './helpers/test-setup'; import { SecurityService } from 'contracts/security'; import { GuardianService } from 'guardian'; -import { KeysApiService } from 'keys-api/keys-api.service'; import { ProviderService } from 'provider'; -import { Server } from 'ganache'; import { GuardianMessageService } from 'guardian/guardian-message'; import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; import { KeyValidatorInterface } from '@lido-nestjs/key-validation'; -import { getWalletAddress, signDeposit } from './helpers/deposit'; +import { getWalletAddress } from './helpers/deposit'; import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; -import { addGuardians } from './helpers/dsm'; +import { + addGuardians, + getGuardians, + getLidoWC, + getSecurityContract, + getSecurityOwner, +} from './helpers/dsm'; import { BlsService } from 'bls'; import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; -import { makeServer } from './server'; -import { mockKey } from './helpers/keys-fixtures'; +import { accountImpersonate, testSetupProvider } from './helpers/provider'; +import { waitForNewerBlock, waitKAPIUpdateModulesKeys } from './helpers/kapi'; +import { CuratedOnchainV1 } from './helpers/nor.contract'; +import { truncateTables } from './helpers/pg'; +import { packNodeOperatorIds } from 'guardian/unvetting/bytes'; +import { getStakingModulesInfo } from './helpers/sr.contract'; +import { HardhatServer } from './helpers/hardhat-server'; +import { + setupContainers, + startContainerIfNotRunning, +} from './helpers/docker-containers/utils'; +import { cutModulesKeys } from './helpers/reduce-keys'; + +jest.setTimeout(100_000); -describe('ganache e2e tests', () => { - let server: Server<'ethereum'>; +describe('Signature validation e2e test', () => { let providerService: ProviderService; - let keysApiService: KeysApiService; let guardianService: GuardianService; let keyValidator: KeyValidatorInterface; let levelDBService: DepositsRegistryStoreService; @@ -68,20 +55,10 @@ describe('ganache e2e tests', () => { // mocks let sendDepositMessage: jest.SpyInstance; - let sendPauseMessage: jest.SpyInstance; let validateKeys: jest.SpyInstance; let sendUnvetMessage: jest.SpyInstance; let unvetSigningKeys: jest.SpyInstance; - const setupServer = async () => { - server = makeServer(FORK_BLOCK, CHAIN_ID, UNLOCKED_ACCOUNTS); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians(); - }; - const setupTestingServices = async (moduleRef) => { // leveldb service levelDBService = moduleRef.get(DepositsRegistryStoreService); @@ -105,9 +82,6 @@ describe('ganache e2e tests', () => { // dsm methods and council sign services securityService = moduleRef.get(SecurityService); - // keys api servies - keysApiService = moduleRef.get(KeysApiService); - // rabbitmq message sending methods guardianMessageService = moduleRef.get(GuardianMessageService); @@ -126,9 +100,6 @@ describe('ganache e2e tests', () => { jest .spyOn(guardianMessageService, 'pingMessageBroker') .mockImplementation(() => Promise.resolve()); - sendPauseMessage = jest - .spyOn(guardianMessageService, 'sendPauseMessageV2') - .mockImplementation(() => Promise.resolve()); sendUnvetMessage = jest .spyOn(guardianMessageService, 'sendUnvetMessage') .mockImplementation(() => Promise.resolve()); @@ -147,29 +118,95 @@ describe('ganache e2e tests', () => { // sign validation validateKeys = jest.spyOn(keyValidator, 'validateKeys'); - // mock unvetting method of contract - // as we dont use real keys api and work with fixtures of operators and keys - // we cant make real unvetting - unvetSigningKeys = jest - .spyOn(securityService, 'unvetSigningKeys') - .mockImplementation(() => Promise.resolve(null as any)); + unvetSigningKeys = jest.spyOn(securityService, 'unvetSigningKeys'); }; - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); + let stakingModulesAddresses: string[]; + let curatedModuleAddress: string; + let stakingModulesCount: number; + let firstOperator: any; + let nor: CuratedOnchainV1; + const frontrunPK: Uint8Array = pk; + let guardianIndex: number; + let postgresContainer; + let keysApiContainer; + let hardhatServer: HardhatServer; + + beforeAll(async () => { + const { kapi, psql } = await setupContainers(); + keysApiContainer = kapi; + postgresContainer = psql; + + await startContainerIfNotRunning(postgresContainer); + hardhatServer = new HardhatServer(); + await hardhatServer.start(); + + console.log('Hardhat node is ready. Starting key cutting process...'); + await cutModulesKeys(); + + await startContainerIfNotRunning(keysApiContainer); + + await waitKAPIUpdateModulesKeys(); + + const securityModule = await getSecurityContract(); + const securityModuleOwner = await getSecurityOwner(); + + // can remove + await accountImpersonate(securityModuleOwner); + const oldGuardians = await getGuardians(); + const securityModuleAddress = securityModule.address; + await addGuardians({ + securityModuleAddress, + securityModuleOwner, + }); - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); + const newGuardians = await getGuardians(); + // TODO: read from contract + guardianIndex = newGuardians.length - 1; + expect(newGuardians.length).toEqual(oldGuardians.length + 1); + + ({ stakingModulesAddresses, curatedModuleAddress } = + await getStakingModulesInfo()); + stakingModulesCount = stakingModulesAddresses.length; + + // get two different active operators + nor = new CuratedOnchainV1(curatedModuleAddress); + const activeOperators = await nor.getActiveOperators(); + firstOperator = activeOperators[0]; + // create duplicate + await getLidoWC(); + }, 120_000); + + afterAll(async () => { + await keysApiContainer.stop(); + await hardhatServer.stop(); + await postgresContainer.stop(); }); - test( - 'should not validate again if depositData was not changed', - async () => { + describe('Signature validation', () => { + let snapshotId: number; + + beforeAll(async () => { + snapshotId = await testSetupProvider.send('evm_snapshot', []); + await waitKAPIUpdateModulesKeys(); + + const moduleRef = await setupTestingModule(); + await setupTestingServices(moduleRef); + setupMocks(); + }, 50_000); + + afterAll(async () => { + jest.clearAllMocks(); + await testSetupProvider.send('evm_revert', [snapshotId]); + await truncateTables(); + + await levelDBService.deleteCache(); + await signKeyLevelDBService.deleteCache(); + await levelDBService.close(); + await signKeyLevelDBService.close(); + }); + + test('Set cache to current block', async () => { const currentBlock = await providerService.provider.getBlock('latest'); await levelDBService.setCachedEvents({ @@ -185,358 +222,91 @@ describe('ganache e2e tests', () => { headers: { startBlock: currentBlock.number, endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], + stakingModulesAddresses, }, }); + }); - const keyWithWrongSign = { - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }; - - const invalidKeys = [keyWithWrongSign]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, invalidKeys, meta); - const walletAddress = await getWalletAddress(); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); + test('Add key with broken signature', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + const randomSign = + '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e'; - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith( + await nor.addSigningKey( + firstOperator.index, 1, - expect.arrayContaining([ - expect.objectContaining({ - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - }), - ]), - ); - expect(validateKeys).toHaveBeenNthCalledWith(2, []); - expect(sendUnvetMessage).toBeCalledTimes(1); - expect(sendUnvetMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000000', - }), + toHexString(frontrunPK), + randomSign, + firstOperator.rewardAddress, ); - expect(unvetSigningKeys).toBeCalledTimes(1); + await waitForNewerBlock(currentBlock.number); + }); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); + test('Unvetted key will not set module on soft pause', async () => { + await guardianService.handleNewBlock(); - await providerService.provider.send('evm_mine', []); + await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - // if depositData was not changed it will not validate again - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, invalidKeys, newMeta); + // 4 - number of modules + expect(validateKeys).toBeCalledTimes(stakingModulesCount); + expect(sendUnvetMessage).toBeCalledTimes(0); + expect(sendDepositMessage).toBeCalledTimes(stakingModulesCount); + }); - validateKeys.mockClear(); - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); - unvetSigningKeys.mockClear(); + test('Increase staking limit', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); + // keys total amount was 3, added key with wrong sign, now it is 4 keys + // increase limit to 4 + await nor.setStakingLimit(firstOperator.index, 4); + await waitForNewerBlock(currentBlock.number); + }); + + test('Check staking limit for operator before unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(4); + }); + + test('Unvetting', async () => { + const currentBlock = await providerService.provider.getBlock('latest'); await guardianService.handleNewBlock(); await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - expect(validateKeys).toBeCalledTimes(2); - // don't validate again - expect(validateKeys).toHaveBeenNthCalledWith(1, []); - expect(validateKeys).toHaveBeenNthCalledWith(2, []); + const walletAddress = await getWalletAddress(); + + // 4 - number of modules + expect(validateKeys).toBeCalledTimes(2 * stakingModulesCount); expect(sendUnvetMessage).toBeCalledTimes(1); expect(sendUnvetMessage).toHaveBeenCalledWith( expect.objectContaining({ - blockNumber: newBlock.number, + blockNumber: currentBlock.number, guardianAddress: walletAddress, - guardianIndex: 7, + guardianIndex, stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000000', + operatorIds: packNodeOperatorIds([firstOperator.index]), + vettedKeysByOperator: '0x00000000000000000000000000000003', }), ); - expect(unvetSigningKeys).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), + expect(unvetSigningKeys).toBeCalledTimes(1); + expect(unvetSigningKeys).toHaveBeenCalledWith( + expect.anything(), + currentBlock.number, + expect.anything(), + 1, + packNodeOperatorIds([firstOperator.index]), + '0x00000000000000000000000000000003', + expect.any(Object), ); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test('should validate again if deposit data was changed', async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, }); - const keyWithWrongSign = { - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }; - - const dvtKey = { - ...mockKey, - moduleAddress: SIMPLE_DVT, - }; - - const invalidKeys = [keyWithWrongSign, dvtKey]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, invalidKeys, meta); - - const walletAddress = await getWalletAddress(); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - const { signature: lidoSign } = signDeposit(pk, sk, LIDO_WC); - - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith( - 1, - expect.arrayContaining([ - expect.objectContaining({ - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - }), - ]), - ); - expect(validateKeys).toHaveBeenNthCalledWith( - 2, - expect.arrayContaining([ - expect.objectContaining({ - key: mockKey.key, - depositSignature: mockKey.depositSignature, - }), - ]), - ); - expect(sendUnvetMessage).toBeCalledTimes(1); - expect(sendUnvetMessage).toHaveBeenCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - operatorIds: '0x0000000000000000', - vettedKeysByOperator: '0x00000000000000000000000000000000', - }), - ); - expect(unvetSigningKeys).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - - const fixedKey = { - ...keyWithWrongSign, - depositSignature: toHexString(lidoSign), - }; - - const fixedKeys = [fixedKey, dvtKey]; - - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, fixedKeys, newMeta); - - validateKeys.mockClear(); - sendDepositMessage.mockClear(); - sendUnvetMessage.mockClear(); - unvetSigningKeys.mockClear(); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith( - 1, - expect.arrayContaining([ - expect.objectContaining({ - key: toHexString(pk), - depositSignature: toHexString(lidoSign), - }), - ]), - ); - expect(validateKeys).toHaveBeenNthCalledWith(2, []); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - - expect(sendPauseMessage).toBeCalledTimes(0); - }); - - test('adding not vetted invalid key will not set on soft pause module', async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, + test('No deposits for module', async () => { + expect(sendDepositMessage).toBeCalledTimes(2 * stakingModulesCount - 1); }); - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, + test('Check staking limit for operator after unvetting', async () => { + const op = await nor.getOperator(firstOperator.index, false); + expect(Number(op.totalVettedValidators)).toEqual(3); }); - - const keyWithWrongSign = { - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: false, - }; - - const dvtKey = { - ...mockKey, - moduleAddress: SIMPLE_DVT, - }; - - const keys = [keyWithWrongSign, dvtKey]; - - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - const walletAddress = await getWalletAddress(); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith(1, []); - expect(validateKeys).toHaveBeenNthCalledWith( - 2, - expect.arrayContaining([ - expect.objectContaining({ - key: mockKey.key, - depositSignature: mockKey.depositSignature, - }), - ]), - ); - expect(sendUnvetMessage).toBeCalledTimes(0); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); }); }); diff --git a/test/invalid-keys.e2e-spec.ts b/test/invalid-keys.e2e-spec.ts deleted file mode 100644 index 791c2b1f..00000000 --- a/test/invalid-keys.e2e-spec.ts +++ /dev/null @@ -1,402 +0,0 @@ -// Global Helpers -import { toHexString } from '@chainsafe/ssz'; - -// Helpers -import { - keysApiMockGetAllKeys, - keysApiMockGetModules, - mockedModuleCurated, - mockedModuleDvt, - mockMeta, -} from './helpers'; - -// Constants -import { - TESTS_TIMEOUT, - SLEEP_FOR_RESULT, - CHAIN_ID, - GANACHE_PORT, - sk, - pk, - NOP_REGISTRY, - SIMPLE_DVT, - LIDO_WC, - FORK_BLOCK_V2, - UNLOCKED_ACCOUNTS_V2, - SECURITY_MODULE_V2, - SECURITY_MODULE_OWNER_V2, -} from './constants'; - -// Mock rabbit straight away -jest.mock('../src/transport/stomp/stomp.client.ts'); - -jest.setTimeout(10_000); - -import { - setupTestingModule, - closeServer, - initLevelDB, -} from './helpers/test-setup'; -import { GuardianService } from 'guardian'; -import { KeysApiService } from 'keys-api/keys-api.service'; -import { ProviderService } from 'provider'; -import { Server } from 'ganache'; -import { GuardianMessageService } from 'guardian/guardian-message'; -import { DepositsRegistryStoreService } from 'contracts/deposits-registry/store'; -import { SigningKeysStoreService as SignKeyLevelDBService } from 'contracts/signing-keys-registry/store'; -import { KeyValidatorInterface } from '@lido-nestjs/key-validation'; -import { getWalletAddress, signDeposit } from './helpers/deposit'; -import { SigningKeysRegistryService } from 'contracts/signing-keys-registry'; -import { addGuardians } from './helpers/dsm'; -import { BlsService } from 'bls'; -import { DepositIntegrityCheckerService } from 'contracts/deposits-registry/sanity-checker'; -import { makeServer } from './server'; -import { mockKey } from './helpers/keys-fixtures'; - -describe('ganache e2e tests', () => { - let server: Server<'ethereum'>; - let providerService: ProviderService; - let keysApiService: KeysApiService; - let guardianService: GuardianService; - let keyValidator: KeyValidatorInterface; - let sendDepositMessage: jest.SpyInstance; - let sendPauseMessage: jest.SpyInstance; - let validateKeys: jest.SpyInstance; - let levelDBService: DepositsRegistryStoreService; - let signKeyLevelDBService: SignKeyLevelDBService; - let guardianMessageService: GuardianMessageService; - let signingKeysRegistryService: SigningKeysRegistryService; - let depositIntegrityCheckerService: DepositIntegrityCheckerService; - - const setupServer = async () => { - server = makeServer(FORK_BLOCK_V2, CHAIN_ID, UNLOCKED_ACCOUNTS_V2); - await server.listen(GANACHE_PORT); - }; - - const setupGuardians = async () => { - await addGuardians({ - securityModule: SECURITY_MODULE_V2, - securityModuleOwner: SECURITY_MODULE_OWNER_V2, - }); - }; - - const setupTestingServices = async (moduleRef) => { - // leveldb service - levelDBService = moduleRef.get(DepositsRegistryStoreService); - signKeyLevelDBService = moduleRef.get(SignKeyLevelDBService); - - await initLevelDB(levelDBService, signKeyLevelDBService); - - // deposit events related services - depositIntegrityCheckerService = moduleRef.get( - DepositIntegrityCheckerService, - ); - - const blsService = moduleRef.get(BlsService); - await blsService.onModuleInit(); - - // keys events service - signingKeysRegistryService = moduleRef.get(SigningKeysRegistryService); - - providerService = moduleRef.get(ProviderService); - - // keys api servies - keysApiService = moduleRef.get(KeysApiService); - - // rabbitmq message sending methods - guardianMessageService = moduleRef.get(GuardianMessageService); - - // main service that check keys and make decision - guardianService = moduleRef.get(GuardianService); - - // sign validation - keyValidator = moduleRef.get(KeyValidatorInterface); - }; - - const setupMocks = () => { - // broker messages - sendDepositMessage = jest - .spyOn(guardianMessageService, 'sendDepositMessage') - .mockImplementation(() => Promise.resolve()); - jest - .spyOn(guardianMessageService, 'pingMessageBroker') - .mockImplementation(() => Promise.resolve()); - sendPauseMessage = jest - .spyOn(guardianMessageService, 'sendPauseMessageV2') - .mockImplementation(() => Promise.resolve()); - - // deposit cache mocks - jest - .spyOn(depositIntegrityCheckerService, 'putEventsToTree') - .mockImplementation(() => Promise.resolve()); - jest - .spyOn(depositIntegrityCheckerService, 'checkLatestRoot') - .mockImplementation(() => Promise.resolve(true)); - jest - .spyOn(depositIntegrityCheckerService, 'checkFinalizedRoot') - .mockImplementation(() => Promise.resolve(true)); - - // sign validation - validateKeys = jest.spyOn(keyValidator, 'validateKeys'); - }; - - beforeEach(async () => { - await setupServer(); - await setupGuardians(); - const moduleRef = await setupTestingModule(); - await setupTestingServices(moduleRef); - setupMocks(); - }, 20000); - - afterEach(async () => { - await closeServer(server, levelDBService, signKeyLevelDBService); - }); - - test( - 'should not validate again if depositData was not changed', - async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const walletAddress = await getWalletAddress(); - - const keyWithWrongSign = { - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }; - - const keys = [keyWithWrongSign]; - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith( - 1, - expect.arrayContaining([ - expect.objectContaining({ - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - }), - ]), - ); - expect(validateKeys).toHaveBeenNthCalledWith(2, []); - - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - - // if depositData was not changed it will not validate again - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, newMeta); - - validateKeys.mockClear(); - sendDepositMessage.mockClear(); - sendPauseMessage.mockClear(); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(validateKeys).toBeCalledTimes(2); - // dont validate again - expect(validateKeys).toHaveBeenNthCalledWith(1, []); - expect(validateKeys).toHaveBeenNthCalledWith(2, []); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - }, - TESTS_TIMEOUT, - ); - - test('should validate again if deposit data was changed', async () => { - const currentBlock = await providerService.provider.getBlock('latest'); - - await levelDBService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - }, - }); - - await signingKeysRegistryService.setCachedEvents({ - data: [], - headers: { - startBlock: currentBlock.number, - endBlock: currentBlock.number, - stakingModulesAddresses: [NOP_REGISTRY, SIMPLE_DVT], - }, - }); - - const keyWithWrongSign = { - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - operatorIndex: 0, - used: false, - index: 0, - moduleAddress: NOP_REGISTRY, - vetted: true, - }; - - const dvtKey = { - ...mockKey, - moduleAddress: SIMPLE_DVT, - vetted: true, - }; - - const keys = [keyWithWrongSign, dvtKey]; - const meta = mockMeta(currentBlock, currentBlock.hash); - // setup /v1/modules - const stakingModules = [mockedModuleCurated, mockedModuleDvt]; - keysApiMockGetModules(keysApiService, stakingModules, meta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, keys, meta); - - await guardianService.handleNewBlock(); - - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - const { signature: lidoSign } = signDeposit(pk, sk, LIDO_WC); - const walletAddress = await getWalletAddress(); - - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith( - 1, - expect.arrayContaining([ - expect.objectContaining({ - key: toHexString(pk), - // just some random sign - depositSignature: - '0x8bf4401a354de243a3716ee2efc0bde1ded56a40e2943ac7c50290bec37e935d6170b21e7c0872f203199386143ef12612a1488a8e9f1cdf1229c382f29c326bcbf6ed6a87d8fbfe0df87dacec6632fc4709d9d338f4cf81e861d942c23bba1e', - }), - ]), - ); - expect(validateKeys).toHaveBeenNthCalledWith( - 2, - expect.arrayContaining([ - expect.objectContaining({ - key: dvtKey.key, - depositSignature: dvtKey.depositSignature, - }), - ]), - ); - expect(sendDepositMessage).toBeCalledTimes(1); - expect(sendDepositMessage).toBeCalledWith( - expect.objectContaining({ - blockNumber: currentBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - expect(sendPauseMessage).toBeCalledTimes(0); - - const fixedKey = { - ...keyWithWrongSign, - depositSignature: toHexString(lidoSign), - }; - - const fixedKeys = [fixedKey, dvtKey]; - await providerService.provider.send('evm_mine', []); - const newBlock = await providerService.provider.getBlock('latest'); - - const newMeta = mockMeta(newBlock, newBlock.hash); - // setup /v1/modules - keysApiMockGetModules(keysApiService, stakingModules, newMeta); - // setup /v1/keys - keysApiMockGetAllKeys(keysApiService, fixedKeys, newMeta); - - validateKeys.mockClear(); - sendDepositMessage.mockClear(); - sendPauseMessage.mockClear(); - - await guardianService.handleNewBlock(); - await new Promise((res) => setTimeout(res, SLEEP_FOR_RESULT)); - - expect(validateKeys).toBeCalledTimes(2); - expect(validateKeys).toHaveBeenNthCalledWith( - 1, - expect.arrayContaining([ - expect.objectContaining({ - key: toHexString(pk), - depositSignature: toHexString(lidoSign), - }), - ]), - ); - expect(validateKeys).toHaveBeenNthCalledWith(2, []); - expect(sendDepositMessage).toBeCalledTimes(2); - expect(sendDepositMessage).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 1, - }), - ); - expect(sendDepositMessage).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - blockNumber: newBlock.number, - guardianAddress: walletAddress, - guardianIndex: 7, - stakingModuleId: 2, - }), - ); - - expect(sendPauseMessage).toBeCalledTimes(0); - }); -}); diff --git a/test/node-checks-v2.e2e-spec.ts b/test/node-checks-v2.e2e-spec.ts deleted file mode 100644 index 20df09f5..00000000 --- a/test/node-checks-v2.e2e-spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -// Constants -import { WeiPerEther } from '@ethersproject/constants'; -import { - STAKING_ROUTER, - CHAIN_ID, - GANACHE_PORT, - UNLOCKED_ACCOUNTS_V2, - FORK_BLOCK_V2, -} from './constants'; - -// Contract Factories -import { StakingRouterAbi__factory } from '../src/generated'; - -// App modules and services -import { setupTestingModule } from './helpers/test-setup'; -import { WalletService } from 'wallet'; -import { ProviderService } from 'provider'; -import { Server } from 'ganache'; -import { makeServer } from './server'; - -// Mock rabbit straight away -jest.mock('../src/transport/stomp/stomp.client.ts'); - -jest.setTimeout(10_000); - -describe('ganache e2e tests', () => { - let server: Server<'ethereum'>; - let providerService: ProviderService; - let walletService: WalletService; - - const setupServer = async () => { - server = makeServer(FORK_BLOCK_V2, CHAIN_ID, UNLOCKED_ACCOUNTS_V2); - await server.listen(GANACHE_PORT); - }; - - beforeEach(async () => { - await setupServer(); - const moduleRef = await setupTestingModule(); - providerService = moduleRef.get(ProviderService); - walletService = moduleRef.get(WalletService); - }, 20000); - - afterEach(async () => { - await server.close(); - }); - - describe('node checks', () => { - test('correctness network', async () => { - const chainId = await providerService.getChainId(); - expect(chainId).toBe(CHAIN_ID); - }); - - test('ability to create new blocks', async () => { - const isMining = await providerService.provider.send('eth_mining', []); - expect(isMining).toBe(true); - }); - - test('correctness block number', async () => { - const provider = providerService.provider; - const block = await provider.getBlock('latest'); - expect(block.number).toBe(FORK_BLOCK_V2 + 1); - }); - - test('testing address has some eth', async () => { - const provider = providerService.provider; - const balance = await provider.getBalance(walletService.address); - expect(balance.gte(WeiPerEther.mul(34))).toBe(true); - }); - - test('curated module is not on pause', async () => { - const routerContract = StakingRouterAbi__factory.connect( - STAKING_ROUTER, - providerService.provider, - ); - const isOnPause = await routerContract.getStakingModuleIsDepositsPaused( - 1, - ); - expect(isOnPause).toBe(false); - }); - }); -}); diff --git a/test/server.ts b/test/server.ts deleted file mode 100644 index 1cbc3918..00000000 --- a/test/server.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { server } from 'ganache'; - -export const makeServer = ( - startBlock: number, - chainId: number, - unlockedAccounts: string[], - forkDisabled?: boolean, -) => { - const rpcUrl = process.env.RPC_URL; - const secretKey = process.env.WALLET_PRIVATE_KEY; - - let opts = { - logging: { - verbose: false, - debug: false, - quiet: true, - }, - chain: { - chainId, - }, - wallet: { - unlockedAccounts, - accounts: [{ secretKey, balance: BigInt(1e18) * BigInt(100) }], - }, - } as any; - - if (!forkDisabled) { - opts = { - ...opts, - fork: { url: rpcUrl, blockNumber: startBlock }, - }; - } - - return server(opts); -}; diff --git a/tsconfig.json b/tsconfig.json index 72122cce..5edae78e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,5 +18,5 @@ "noFallthroughCasesInSwitch": false, "resolveJsonModule": true }, - "include": ["src/**/*", "test/**/*"] + "include": ["src/**/*", "test/**/*", "./hardhat.config.ts"], } diff --git a/yarn.lock b/yarn.lock index 7bb5cd70..59e154b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@angular-devkit/core@12.0.5": version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.0.5.tgz#3d02abd97684434f6e1ffee470b7a9c63987ae51" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz" integrity sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA== dependencies: ajv "8.2.0" @@ -16,7 +16,7 @@ "@angular-devkit/core@13.3.2": version "13.3.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-13.3.2.tgz#b2e7a9a6457d587a59d5f6df799bebb6930a5ddc" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.2.tgz" integrity sha512-wav5plcnlxQAfZ+0EUt3dvVTJnJ1au2TlKVQ0jSQJdR1LA6N7QUI49N2Ua6ZnDMwruQaQkoynitMW2l1it3qYQ== dependencies: ajv "8.9.0" @@ -28,7 +28,7 @@ "@angular-devkit/schematics-cli@13.3.2": version "13.3.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics-cli/-/schematics-cli-13.3.2.tgz#50607314ee19828d9bd3fb7cb1e3ab2b480ae934" + resolved "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-13.3.2.tgz" integrity sha512-cUHZFNq2kaCaReJAU28MSu2D+WDFTqt2v03U79TryOutYdF8BV4FyfvKqCSW6WXna219GXSXPepVqDYcjvn7/w== dependencies: "@angular-devkit/core" "13.3.2" @@ -40,7 +40,7 @@ "@angular-devkit/schematics@12.0.5": version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.0.5.tgz#db099b6cba1cadf064b87fd675857f6eba167b2a" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.0.5.tgz" integrity sha512-iW3XuDHScr3TXuunlEjF5O01zBpwpLgfr1oEny8PvseFGDlHK4Nj8zNIoIn3Yg936aiFO4GJAC/UXsT8g5vKxQ== dependencies: "@angular-devkit/core" "12.0.5" @@ -49,7 +49,7 @@ "@angular-devkit/schematics@13.3.2": version "13.3.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-13.3.2.tgz#ae5f4f68af852d56b9ceda4e878cceb1b4558dec" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.2.tgz" integrity sha512-XCLb23jmqHN0gJg9ZlICaFgfpfnCufIQp5SOsRKMKRkhjKycvDmKnfBTKDlkzb1IaUl6wQwP5k7Z69b9EX+CQw== dependencies: "@angular-devkit/core" "13.3.2" @@ -60,38 +60,38 @@ "@assemblyscript/loader@^0.10.1": version "0.10.1" - resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" + resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: "@babel/highlight" "^7.14.5" "@babel/code-frame@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" "@babel/compat-data@^7.15.0": version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== "@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": version "7.15.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz" integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== dependencies: "@babel/code-frame" "^7.14.5" @@ -112,7 +112,7 @@ "@babel/generator@^7.15.4", "@babel/generator@^7.7.2": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz" integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== dependencies: "@babel/types" "^7.15.4" @@ -121,7 +121,7 @@ "@babel/helper-compilation-targets@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz" integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: "@babel/compat-data" "^7.15.0" @@ -131,7 +131,7 @@ "@babel/helper-function-name@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz" integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: "@babel/helper-get-function-arity" "^7.15.4" @@ -140,35 +140,35 @@ "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz" integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-hoist-variables@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz" integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-member-expression-to-functions@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz" integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-module-imports@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz" integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-module-transforms@^7.15.4": version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz" integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw== dependencies: "@babel/helper-module-imports" "^7.15.4" @@ -182,19 +182,19 @@ "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== dependencies: "@babel/types" "^7.15.4" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== "@babel/helper-replace-supers@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz" integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== dependencies: "@babel/helper-member-expression-to-functions" "^7.15.4" @@ -204,36 +204,36 @@ "@babel/helper-simple-access@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz" integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== dependencies: "@babel/types" "^7.15.4" "@babel/helper-split-export-declaration@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz" integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: "@babel/types" "^7.15.4" "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/helper-validator-option@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== "@babel/helpers@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz" integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== dependencies: "@babel/template" "^7.15.4" @@ -242,7 +242,7 @@ "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== dependencies: "@babel/helper-validator-identifier" "^7.14.5" @@ -251,7 +251,7 @@ "@babel/highlight@^7.16.7": version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz" integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" @@ -260,103 +260,103 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.2": version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz" integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz" integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/template@^7.15.4", "@babel/template@^7.3.3": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== dependencies: "@babel/code-frame" "^7.14.5" @@ -365,7 +365,7 @@ "@babel/traverse@^7.1.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz" integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== dependencies: "@babel/code-frame" "^7.14.5" @@ -380,25 +380,30 @@ "@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz" integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@balena/dockerignore@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" + integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@chainsafe/as-sha256@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + resolved "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== "@chainsafe/blst@0.2.4", "@chainsafe/blst@^0.2.4": version "0.2.4" - resolved "https://registry.yarnpkg.com/@chainsafe/blst/-/blst-0.2.4.tgz#ed0737dcf52a8775bd163c9a892424fa365d2c8b" + resolved "https://registry.npmjs.org/@chainsafe/blst/-/blst-0.2.4.tgz" integrity sha512-jjhB4dALUvLdTc2flHE6BEI7KCvXVGevIP8si4OdtERu+Ed+cc6zBsrpLvOySX9pgAMAmAuTnB349AlmRfmR2Q== dependencies: node-fetch "^2.6.1" @@ -406,14 +411,14 @@ "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz" integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/ssz@0.9.2", "@chainsafe/ssz@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.2.tgz#6f2552db312217b911e34bcdef9057f8a3a108f2" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.2.tgz" integrity sha512-r3bKiGMF7EZlsgXTyyzQbS+GJTj6MvTlY3Ms1byFZLL1H9Maht8muE2LkF3pS1zU9KY4tiJeQd+KABdhyfB9Ag== dependencies: "@chainsafe/as-sha256" "^0.3.1" @@ -422,24 +427,24 @@ "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz" integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== "@cspotcode/source-map-support@0.6.1": version "0.6.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz" integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== dependencies: "@cspotcode/source-map-consumer" "0.8.0" "@dabh/diagnostics@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== dependencies: colorspace "1.1.x" @@ -448,7 +453,7 @@ "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -461,9 +466,9 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -478,7 +483,7 @@ "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -491,7 +496,7 @@ "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -502,7 +507,7 @@ "@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -513,14 +518,14 @@ "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -528,7 +533,7 @@ "@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -537,21 +542,21 @@ "@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -567,7 +572,7 @@ "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -582,7 +587,7 @@ "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -600,7 +605,7 @@ "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -619,7 +624,7 @@ "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -627,19 +632,19 @@ "@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== "@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -647,14 +652,14 @@ "@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.5.3": version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -680,7 +685,7 @@ "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -688,7 +693,7 @@ "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -696,7 +701,7 @@ "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -705,7 +710,7 @@ "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -717,7 +722,7 @@ "@ethersproject/solidity@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -729,7 +734,7 @@ "@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -738,7 +743,7 @@ "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -753,7 +758,7 @@ "@ethersproject/units@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -762,7 +767,7 @@ "@ethersproject/wallet@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -783,7 +788,7 @@ "@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -794,7 +799,7 @@ "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -803,14 +808,19 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + "@gar/promisify@^1.0.1": version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -819,12 +829,12 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz" integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -835,12 +845,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.2.4.tgz#2f1a4bf82b9940065d4818fac271def99ec55e5e" + resolved "https://registry.npmjs.org/@jest/console/-/console-27.2.4.tgz" integrity sha512-94znCKynPZpDpYHQ6esRJSc11AmONrVkBOBZiD7S+bSubHhrUfbS95EY5HIOxhm4PQO7cnvZkL3oJcY0oMA+Wg== dependencies: "@jest/types" "^27.2.4" @@ -852,7 +862,7 @@ "@jest/core@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.2.4.tgz#0b932da787d64848eab720dbb88e5b7a3f86e539" + resolved "https://registry.npmjs.org/@jest/core/-/core-27.2.4.tgz" integrity sha512-UNQLyy+rXoojNm2MGlapgzWhZD1CT1zcHZQYeiD0xE7MtJfC19Q6J5D/Lm2l7i4V97T30usKDoEtjI8vKwWcLg== dependencies: "@jest/console" "^27.2.4" @@ -886,7 +896,7 @@ "@jest/environment@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.2.4.tgz#db3e60f7dd30ab950f6ce2d6d7293ed9a6b7cbcd" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.2.4.tgz" integrity sha512-wkuui5yr3SSQW0XD0Qm3TATUbL/WE3LDEM3ulC+RCQhMf2yxhci8x7svGkZ4ivJ6Pc94oOzpZ6cdHBAMSYd1ew== dependencies: "@jest/fake-timers" "^27.2.4" @@ -896,7 +906,7 @@ "@jest/fake-timers@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.2.4.tgz#00df08bd60332bd59503cb5b6db21e4903785f86" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.4.tgz" integrity sha512-cs/TzvwWUM7kAA6Qm/890SK6JJ2pD5RfDNM3SSEom6BmdyV6OiWP1qf/pqo6ts6xwpcM36oN0wSEzcZWc6/B6w== dependencies: "@jest/types" "^27.2.4" @@ -908,7 +918,7 @@ "@jest/globals@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.2.4.tgz#0aeb22b011f8c8c4b8ff3b4dbd1ee0392fe0dd8a" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.2.4.tgz" integrity sha512-DRsRs5dh0i+fA9mGHylTU19+8fhzNJoEzrgsu+zgJoZth3x8/0juCQ8nVVdW1er4Cqifb/ET7/hACYVPD0dBEA== dependencies: "@jest/environment" "^27.2.4" @@ -917,7 +927,7 @@ "@jest/reporters@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.2.4.tgz#1482ff007f2e919d85c54b1563abb8b2ea2d5198" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.4.tgz" integrity sha512-LHeSdDnDZkDnJ8kvnjcqV8P1Yv/32yL4d4XfR5gBiy3xGO0onwll1QEbvtW96fIwhx2nejug0GTaEdNDoyr3fQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -947,7 +957,7 @@ "@jest/source-map@^27.0.6": version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz" integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== dependencies: callsites "^3.0.0" @@ -956,7 +966,7 @@ "@jest/test-result@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.2.4.tgz#d1ca8298d168f1b0be834bfb543b1ac0294c05d7" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.4.tgz" integrity sha512-eU+PRo0+lIS01b0dTmMdVZ0TtcRSxEaYquZTRFMQz6CvsehGhx9bRzi9Zdw6VROviJyv7rstU+qAMX5pNBmnfQ== dependencies: "@jest/console" "^27.2.4" @@ -966,7 +976,7 @@ "@jest/test-sequencer@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.2.4.tgz#df66422a3e9e7440ce8b7498e255fa6b52c0bc03" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.4.tgz" integrity sha512-fpk5eknU3/DXE2QCCG1wv/a468+cfPo3Asu6d6yUtM9LOPh709ubZqrhuUOYfM8hXMrIpIdrv1CdCrWWabX0rQ== dependencies: "@jest/test-result" "^27.2.4" @@ -976,7 +986,7 @@ "@jest/transform@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.2.4.tgz#2fe5b6836895f7a1b8bdec442c51e83943c62733" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.2.4.tgz" integrity sha512-n5FlX2TH0oQGwyVDKPxdJ5nI2sO7TJBFe3u3KaAtt7TOiV4yL+Y+rSFDl+Ic5MpbiA/eqXmLAQxjnBmWgS2rEA== dependencies: "@babel/core" "^7.1.0" @@ -997,7 +1007,7 @@ "@jest/types@^27.2.4": version "27.2.4" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.4.tgz#2430042a66e00dc5b140c3636f4474d464c21ee8" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.2.4.tgz" integrity sha512-IDO2ezTxeMvQAHxzG/ZvEyA47q0aVfzT95rGFl7bZs/Go0aIucvfDbS2rmnoEdXxlLQhcolmoG/wvL/uKx4tKA== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -1008,7 +1018,7 @@ "@jridgewell/gen-mapping@^0.3.0": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -1017,17 +1027,17 @@ "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -1035,12 +1045,12 @@ "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" @@ -1048,12 +1058,12 @@ "@lido-nestjs/constants@5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@lido-nestjs/constants/-/constants-5.2.0.tgz#93b3c35ca8e194f12c0d8f2de60d43182fffaab3" + resolved "https://registry.npmjs.org/@lido-nestjs/constants/-/constants-5.2.0.tgz" integrity sha512-TM0V2gStu2IdPa5ceGGaxmyKhuM7C1EzIF3sUnAfPxrB2yLgQj91voJ0Qf00NF+Fp94rCLRBoShDyUsLMcBl2g== "@lido-nestjs/contracts@9.4.0": version "9.4.0" - resolved "https://registry.yarnpkg.com/@lido-nestjs/contracts/-/contracts-9.4.0.tgz#5d4c41fd42733c108a538d641b5429a8487712d0" + resolved "https://registry.npmjs.org/@lido-nestjs/contracts/-/contracts-9.4.0.tgz" integrity sha512-pGpQQXD4CPLYGH2MmNqaIIGV2nmwmblg4NlVIFEpOrhZAad8apR9+//zvukcPsjskH/HTwnW4XNUey21e6ZxzA== dependencies: "@ethersproject/abi" "^5.5.0" @@ -1063,12 +1073,12 @@ "@lido-nestjs/di@1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@lido-nestjs/di/-/di-1.0.1.tgz#cb1b1f06ca0b8ed93eefa3f9974691658456910e" + resolved "https://registry.npmjs.org/@lido-nestjs/di/-/di-1.0.1.tgz" integrity sha512-n/oPivizv6PffyLjtxf8wxm1IteG/YvelHFiz4X6jb4WhrCPpK8J46L/LHTLUmFfcCBXquVcUJqG5Nwy3b2pIg== "@lido-nestjs/fetch@^1.3.1": version "1.3.1" - resolved "https://registry.npmjs.org/@lido-nestjs/fetch/-/fetch-1.3.1.tgz#475bb7c04bfcaa970e35b424cc55cf5637280d03" + resolved "https://registry.npmjs.org/@lido-nestjs/fetch/-/fetch-1.3.1.tgz" integrity sha512-Iy45mpleIcQNg5Ih8xx4I0xQ5+TeYeHs/QLmjzPfiHduilXj6Z9ox1d4m0tzXwfnn3FoyLyvy98M23M/AcY7lw== dependencies: "@lido-nestjs/middleware" "1.1.1" @@ -1077,7 +1087,7 @@ "@lido-nestjs/key-validation@^7.4.0": version "7.5.0" - resolved "https://registry.yarnpkg.com/@lido-nestjs/key-validation/-/key-validation-7.5.0.tgz#32aee5cdd4bb18f6e1b32b230be7c1d5918d0bb3" + resolved "https://registry.npmjs.org/@lido-nestjs/key-validation/-/key-validation-7.5.0.tgz" integrity sha512-utzi6pERZXp84Ygnpibx3z8k+hu+8CcgSSdpr6MIIIPlYhjFh7tSBNM6tV35KnC8r5laXnx2cQwUlT7A7Ho7hw== dependencies: "@chainsafe/blst" "0.2.4" @@ -1090,24 +1100,35 @@ "@lido-nestjs/middleware@1.1.1", "@lido-nestjs/middleware@^1.1.1": version "1.1.1" - resolved "https://registry.npmjs.org/@lido-nestjs/middleware/-/middleware-1.1.1.tgz#ffe6cb343f5e81282b70f8746879f3cf506ac3d5" + resolved "https://registry.npmjs.org/@lido-nestjs/middleware/-/middleware-1.1.1.tgz" integrity sha512-0y9e7ydM3NkAhoiiv/tSsBu8KLbvPJ19QPRiAYBy33y8Fv5PPjypA3qAG03ImBQ3qFXAp29ZUrSs18vkACf8Ng== "@lido-nestjs/utils@1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@lido-nestjs/utils/-/utils-1.3.0.tgz#8bdc69c3fd18bc57752b1799516096d284f1112b" + resolved "https://registry.npmjs.org/@lido-nestjs/utils/-/utils-1.3.0.tgz" integrity sha512-/5I30Dos9TC18YfZq8O9ele28DpUQQCySB9X9GXPeSmY1AV4w2kIGQrws1wu2gtw7x5mZnW8PtWthJmH1f6vJQ== "@lido-sdk/constants@^3.2.1": version "3.2.1" - resolved "https://registry.yarnpkg.com/@lido-sdk/constants/-/constants-3.2.1.tgz#0c4582d7e76e4f8bc42e8f3c0d14dc0fbe481d77" + resolved "https://registry.npmjs.org/@lido-sdk/constants/-/constants-3.2.1.tgz" integrity sha512-zes0Mw0r1nEQYBNHV5fxK2H9Byowejy4haFy9LYDh1nL72aNJzzdh5S5iM+pKlEuLHQJHV5lVO/k9tunNJIKqQ== dependencies: tiny-invariant "^1.1.0" +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + "@nestjs/cli@^8.2.5": version "8.2.5" - resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-8.2.5.tgz#02094177f4eac576d1a559b259d541393e49e0bb" + resolved "https://registry.npmjs.org/@nestjs/cli/-/cli-8.2.5.tgz" integrity sha512-b5DzZ08q/6iWvLz+n2DhEyZ3rsOurN1ec1jYQaWC5DCVQoZCwyOew48bVf01kevTK4eZyQxPwuErf7HnFAc0oQ== dependencies: "@angular-devkit/core" "13.3.2" @@ -1135,7 +1156,7 @@ "@nestjs/common@^8.0.0": version "8.3.1" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-8.3.1.tgz#4d5fcc879865acf012733cc5c0f804a46de89fe3" + resolved "https://registry.npmjs.org/@nestjs/common/-/common-8.3.1.tgz" integrity sha512-3kKeaRXn1c2jf0ihVu6bvQ9Ok+7CkqkU0Ggi5NjWXA2oVRs3vPzr2d5DEvqUqY9JZpT5qGvzRDyKzaPlekxD2A== dependencies: axios "0.26.0" @@ -1145,7 +1166,7 @@ "@nestjs/config@^1.0.1": version "1.2.0" - resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-1.2.0.tgz#a4eb58390dd8145b761ee0c8e98e78c8471cabb1" + resolved "https://registry.npmjs.org/@nestjs/config/-/config-1.2.0.tgz" integrity sha512-GGZOj2g6EMZ23orsQqeD2Vs5E2ZrmAiB0qCGvERv+5nQmZjY4nKkisG4awQsym1uotmmzgtsd9lOiKqTIFONhA== dependencies: dotenv "16.0.0" @@ -1155,7 +1176,7 @@ "@nestjs/core@^8.0.0": version "8.3.1" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-8.3.1.tgz#737c2aef5529da7946de82414e7065ab01c27bad" + resolved "https://registry.npmjs.org/@nestjs/core/-/core-8.3.1.tgz" integrity sha512-tdZkhqopd5xSVjogezpP4tPZWntyUNzwOGrVJCQ3RMVH12oxyDMpaMtDnCNvV7cSyoSyHzepMh5nCgLsZ/c88w== dependencies: "@nuxtjs/opencollective" "0.3.2" @@ -1168,7 +1189,7 @@ "@nestjs/platform-express@^8.1.1": version "8.3.1" - resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-8.3.1.tgz#fbf129cbdc56f2fbb17758df4971162de79e2265" + resolved "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.3.1.tgz" integrity sha512-mdmcokcs2Krd4lXYfSHOhx88Zs+MZRpddGtww/jvZuB0rhtnRpTb9SBhLlgVZmFbboEAgxyrKP+rF9Y9Y7F/Qg== dependencies: body-parser "1.19.1" @@ -1179,7 +1200,7 @@ "@nestjs/schedule@^2.1.0": version "2.1.0" - resolved "https://registry.npmjs.org/@nestjs/schedule/-/schedule-2.1.0.tgz#a2e21b2078a0c3d56552d40cc97336aa5bbfecdf" + resolved "https://registry.npmjs.org/@nestjs/schedule/-/schedule-2.1.0.tgz" integrity sha512-4Xaw56WiW3VsxEPPnj/iDtfjcO+sUZyYAeRxD0gnF5havncxjAnv52Iw7UH3DuzzUA784xPGgGje3Fq0Gu925g== dependencies: cron "2.0.0" @@ -1187,7 +1208,7 @@ "@nestjs/schematics@^8.0.0", "@nestjs/schematics@^8.0.3": version "8.0.3" - resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-8.0.3.tgz#b2247e6f5e8dd38e67969a662437f61b48841456" + resolved "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.3.tgz" integrity sha512-A5qyS9yv6v2RIBqbsyYG57NfYA8Jm/aypRV1nc7JXjhdfDHwWKqCsgQ/7/82vVjhlvVAfr5x/dpCWqcF3XYd7w== dependencies: "@angular-devkit/core" "12.0.5" @@ -1198,22 +1219,32 @@ "@nestjs/terminus@^8.0.1": version "8.0.4" - resolved "https://registry.yarnpkg.com/@nestjs/terminus/-/terminus-8.0.4.tgz#6b4f74a904c7ded8d6a335e2900ddcd497e5efee" + resolved "https://registry.npmjs.org/@nestjs/terminus/-/terminus-8.0.4.tgz" integrity sha512-KjeY7VLt0Az6pA2wO67nkL1QbE68yBb+FLZ7+aa+C/g/IKoDR668nqSuFzJarBrnFBTGEwDD09BwsgqkmymrbQ== dependencies: check-disk-space "3.1.0" "@nestjs/testing@^8.0.11": version "8.0.11" - resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-8.0.11.tgz#d41fc20a149dd919c9dfacb668f1c9cbc131f57c" + resolved "https://registry.npmjs.org/@nestjs/testing/-/testing-8.0.11.tgz" integrity sha512-BYQFsCktbrT/kFNl2uNoUgmNshKxPJLJG2/J+os/+stfX7yeV573I1uo1m4DEPod71cRxVFvxc3Ehc72rOyPmw== dependencies: optional "0.1.4" tslib "2.3.1" +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1221,20 +1252,154 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/edr-darwin-arm64@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.4.tgz#6eaa64a6ea5201e4c92b121f2b7fd197b26e450a" + integrity sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ== + +"@nomicfoundation/edr-darwin-x64@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.4.tgz#d15ca89e9deef7d0a710cf90e79f3cc270a5a999" + integrity sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg== + +"@nomicfoundation/edr-linux-arm64-gnu@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.4.tgz#e73c41ca015dfddb5f4cb6cd3d9b2cbe5cc28989" + integrity sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA== + +"@nomicfoundation/edr-linux-arm64-musl@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.4.tgz#90906f733e4ad26657baeb22d28855d934ab7541" + integrity sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q== + +"@nomicfoundation/edr-linux-x64-gnu@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.4.tgz#11b8bd73df145a192e5a08199e5e81995fcde502" + integrity sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA== + +"@nomicfoundation/edr-linux-x64-musl@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.4.tgz#a34b9a2c9e34853207824dc81622668a069ca642" + integrity sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw== + +"@nomicfoundation/edr-win32-x64-msvc@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.4.tgz#ca035c6f66ae9f88fa3ef123a1f3a2099cce7a5a" + integrity sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw== + +"@nomicfoundation/edr@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.4.tgz#1cd336c46a60f5af774e6cf0f1943f49f63dded6" + integrity sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.4" + "@nomicfoundation/edr-darwin-x64" "0.6.4" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.4" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.4" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.4" + "@nomicfoundation/edr-linux-x64-musl" "0.6.4" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.4" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/hardhat-ethers@^3.0.6": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" + integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + "@npmcli/fs@^1.0.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== dependencies: "@gar/promisify" "^1.0.1" @@ -1242,7 +1407,7 @@ "@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" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" @@ -1250,42 +1415,132 @@ "@nuxtjs/opencollective@0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" + resolved "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz" integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== dependencies: chalk "^4.1.0" consola "^2.15.0" node-fetch "^2.6.1" +"@scure/base@~1.1.0": + version "1.1.9" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + "@sinonjs/commons@^1.7.0": version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^8.0.1": version "8.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz#1c1c9a91419f804e59ae8df316a07dd1c3a76b94" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz" integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew== dependencies: "@sinonjs/commons" "^1.7.0" "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz" integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== dependencies: node-gyp-build "4.4.0" "@trufflesuite/uws-js-unofficial@20.10.0-unofficial.2": version "20.10.0-unofficial.2" - resolved "https://registry.yarnpkg.com/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.10.0-unofficial.2.tgz#7ed613ce3260cd5d1773a4d5787a2a106acd1a91" + resolved "https://registry.npmjs.org/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.10.0-unofficial.2.tgz" integrity sha512-oQQlnS3oNeGsgS4K3KCSSavJgSb0W9D5ktZs4FacX9VbM7b+NlhjH96d6/G4fMrz+bc5MXRyco419on0X0dvRA== dependencies: ws "8.2.3" @@ -1295,40 +1550,47 @@ "@tsconfig/node10@^1.0.7": version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz" integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== "@tsconfig/node12@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz" integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== "@tsconfig/node14@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz" integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== "@tsconfig/node16@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== "@typechain/ethers-v5@^7.1.2": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-7.2.0.tgz#d559cffe0efe6bdbc20e644b817f6fa8add5e8f8" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-7.2.0.tgz" integrity sha512-jfcmlTvaaJjng63QsT49MT6R1HFhtO/TBMWbyzPFSzMmVIqb2tL6prnKBs4ZJrSvmgIXWy+ttSjpaxCTq8D/Tw== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" +"@typechain/hardhat@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== + dependencies: + fs-extra "^9.1.0" + "@types/app-root-path@^1.2.4": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/app-root-path/-/app-root-path-1.2.4.tgz#a78b703282b32ac54de768f5512ecc3569919dc7" + resolved "https://registry.npmjs.org/@types/app-root-path/-/app-root-path-1.2.4.tgz" integrity sha1-p4twMoKzKsVN52j1US7MNWmRncc= "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz" integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== dependencies: "@babel/parser" "^7.1.0" @@ -1339,14 +1601,14 @@ "@types/babel__generator@*": version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz" integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" @@ -1354,31 +1616,38 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz" integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + "@types/bn.js@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" "@types/cache-manager@^3.4.3": version "3.4.3" - resolved "https://registry.yarnpkg.com/@types/cache-manager/-/cache-manager-3.4.3.tgz#eba99bf795b997ad0c309658101398c34d7faecb" + resolved "https://registry.npmjs.org/@types/cache-manager/-/cache-manager-3.4.3.tgz" integrity sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw== "@types/cookiejar@*": version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" + resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== "@types/eslint-scope@^3.7.3": version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== dependencies: "@types/eslint" "*" @@ -1386,7 +1655,7 @@ "@types/eslint@*": version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz" integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== dependencies: "@types/estree" "*" @@ -1394,17 +1663,17 @@ "@types/estree@*": version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/estree@^0.0.51": version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/glob@^8.1.0": version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + resolved "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz" integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== dependencies: "@types/minimatch" "^5.1.2" @@ -1412,33 +1681,33 @@ "@types/graceful-fs@^4.1.2": version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz" integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^27.0.1": version "27.0.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.2.tgz#ac383c4d4aaddd29bbf2b916d8d105c304a5fcd7" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz" integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== dependencies: jest-diff "^27.0.0" @@ -1446,34 +1715,34 @@ "@types/json-schema@*", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/kafkajs@^1.9.0": version "1.9.0" - resolved "https://registry.yarnpkg.com/@types/kafkajs/-/kafkajs-1.9.0.tgz#758d82e4a3caad101f7bb5c7be296fd0c9326ee7" + resolved "https://registry.npmjs.org/@types/kafkajs/-/kafkajs-1.9.0.tgz" integrity sha512-R9VDNbiw+vNfxWjjFHUrLMF/Dfc7asGXzKtYUwI4FaT24Chf5ZNkfvce54p4dkLMxPcsrEsVazAK0Jp2ib4Zxw== dependencies: kafkajs "*" -"@types/lru-cache@5.1.1": +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@^5.1.2": version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/node-fetch@^2.5.12": version "2.6.2" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz" integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" @@ -1481,37 +1750,51 @@ "@types/node@*", "@types/node@^16.0.0": version "16.10.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.2.tgz#5764ca9aa94470adb4e1185fe2e9f19458992b2e" + resolved "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz" integrity sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ== "@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" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + "@types/prettier@^2.1.1": version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prettier@^2.1.5": version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.1.tgz" integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + "@types/seedrandom@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + resolved "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== "@types/stack-utils@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/superagent@*": version "4.1.13" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.13.tgz#0aaa3f4ff9404b94932d1dcdfb7f3d39d23997a0" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz" integrity sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww== dependencies: "@types/cookiejar" "*" @@ -1519,38 +1802,38 @@ "@types/supertest@^2.0.11": version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.11.tgz#2e70f69f220bc77b4f660d72c2e1a4231f44a77d" + resolved "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz" integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q== dependencies: "@types/superagent" "*" "@types/validator@^13.7.10": version "13.7.12" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.12.tgz#a285379b432cc8d103b69d223cbb159a253cf2f7" + resolved "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz" integrity sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA== "@types/ws@^8.5.3": version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^16.0.0": version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz" integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^4.28.2": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.32.0.tgz#46d2370ae9311092f2a6f7246d28357daf2d4e89" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.32.0.tgz" integrity sha512-+OWTuWRSbWI1KDK8iEyG/6uK2rTm3kpS38wuVifGUTDB6kjEuNrzBI1MUtxnkneuWG/23QehABe2zHHrj+4yuA== dependencies: "@typescript-eslint/experimental-utils" "4.32.0" @@ -1564,7 +1847,7 @@ "@typescript-eslint/experimental-utils@4.32.0": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.32.0.tgz#53a8267d16ca5a79134739129871966c56a59dc4" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.32.0.tgz" integrity sha512-WLoXcc+cQufxRYjTWr4kFt0DyEv6hDgSaFqYhIzQZ05cF+kXfqXdUh+//kgquPJVUBbL3oQGKQxwPbLxHRqm6A== dependencies: "@types/json-schema" "^7.0.7" @@ -1576,7 +1859,7 @@ "@typescript-eslint/parser@^4.28.2": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.32.0.tgz#751ecca0e2fecd3d44484a9b3049ffc1871616e5" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.32.0.tgz" integrity sha512-lhtYqQ2iEPV5JqV7K+uOVlPePjClj4dOw7K4/Z1F2yvjIUvyr13yJnDzkK6uon4BjHYuHy3EG0c2Z9jEhFk56w== dependencies: "@typescript-eslint/scope-manager" "4.32.0" @@ -1586,7 +1869,7 @@ "@typescript-eslint/scope-manager@4.32.0": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz#e03c8668f8b954072b3f944d5b799c0c9225a7d5" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz" integrity sha512-DK+fMSHdM216C0OM/KR1lHXjP1CNtVIhJ54kQxfOE6x8UGFAjha8cXgDMBEIYS2XCYjjCtvTkjQYwL3uvGOo0w== dependencies: "@typescript-eslint/types" "4.32.0" @@ -1594,12 +1877,12 @@ "@typescript-eslint/types@4.32.0": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.32.0.tgz#52c633c18da47aee09449144bf59565ab36df00d" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.32.0.tgz" integrity sha512-LE7Z7BAv0E2UvqzogssGf1x7GPpUalgG07nGCBYb1oK4mFsOiFC/VrSMKbZQzFJdN2JL5XYmsx7C7FX9p9ns0w== "@typescript-eslint/typescript-estree@4.32.0": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.32.0.tgz#db00ccc41ccedc8d7367ea3f50c6994b8efa9f3b" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.32.0.tgz" integrity sha512-tRYCgJ3g1UjMw1cGG8Yn1KzOzNlQ6u1h9AmEtPhb5V5a1TmiHWcRyF/Ic+91M4f43QeChyYlVTcf3DvDTZR9vw== dependencies: "@typescript-eslint/types" "4.32.0" @@ -1612,7 +1895,7 @@ "@typescript-eslint/visitor-keys@4.32.0": version "4.32.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.32.0.tgz#455ba8b51242f2722a497ffae29313f33b14cb7f" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.32.0.tgz" integrity sha512-e7NE0qz8W+atzv3Cy9qaQ7BTLwWsm084Z0c4nIO2l3Bp6u9WIgdqCgyPyV5oSPDMIW3b20H59OOCmVk3jw3Ptw== dependencies: "@typescript-eslint/types" "4.32.0" @@ -1620,7 +1903,7 @@ "@webassemblyjs/ast@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: "@webassemblyjs/helper-numbers" "1.11.1" @@ -1628,22 +1911,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.1" @@ -1652,12 +1935,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1667,26 +1950,26 @@ "@webassemblyjs/ieee754@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1700,7 +1983,7 @@ "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1711,7 +1994,7 @@ "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1721,7 +2004,7 @@ "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1733,7 +2016,7 @@ "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1741,32 +2024,32 @@ "@willsoto/nestjs-prometheus@^4.0.1": version "4.4.0" - resolved "https://registry.yarnpkg.com/@willsoto/nestjs-prometheus/-/nestjs-prometheus-4.4.0.tgz#6472170c5b364ff8d292166855337ac68d11f7dc" + resolved "https://registry.npmjs.org/@willsoto/nestjs-prometheus/-/nestjs-prometheus-4.4.0.tgz" integrity sha512-Q2zrm4hXgelC1j5C/JYmKATGc5BFj6NHW6tx0NNU+YSpAknQtSRkVkDfxoeB+TRwzE0KLI+loT+oRt0/Rle3gA== "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3, abab@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abstract-level@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: buffer "^6.0.3" @@ -1779,7 +2062,7 @@ abstract-level@1.0.3: abstract-level@^1.0.2, abstract-level@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" + resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz" integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== dependencies: buffer "^6.0.3" @@ -1792,7 +2075,7 @@ abstract-level@^1.0.2, abstract-level@^1.0.4: abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz" integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== dependencies: buffer "^6.0.3" @@ -1804,7 +2087,7 @@ abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: accepts@~1.3.7: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -1812,7 +2095,7 @@ accepts@~1.3.7: acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -1820,49 +2103,54 @@ acorn-globals@^6.0.0: acorn-import-assertions@^1.7.6: version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.1.1: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0: version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6, agent-base@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" agentkeepalive@^4.1.3: version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz" integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== dependencies: debug "^4.1.0" @@ -1871,7 +2159,7 @@ agentkeepalive@^4.1.3: aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1879,26 +2167,26 @@ aggregate-error@^3.0.0: ajv-formats@2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.0.2.tgz#69875cb99d76c74be46e9c7a4444bc232354eba0" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz" integrity sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw== dependencies: ajv "^8.0.0" ajv-formats@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz" integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== dependencies: fast-deep-equal "^3.1.1" @@ -1908,7 +2196,7 @@ ajv@8.2.0: ajv@8.9.0: version "8.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz" integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== dependencies: fast-deep-equal "^3.1.1" @@ -1918,7 +2206,7 @@ ajv@8.9.0: ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1928,7 +2216,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: ajv@^8.0.0, ajv@^8.0.1: version "8.6.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== dependencies: fast-deep-equal "^3.1.1" @@ -1936,45 +2224,57 @@ ajv@^8.0.0, ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1: +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +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" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" @@ -1982,22 +2282,22 @@ anymatch@^3.0.3, anymatch@~3.1.2: app-root-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + resolved "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz" integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== append-field@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= "aproba@^1.0.3 || ^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== are-we-there-yet@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz" integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw== dependencies: delegates "^1.0.0" @@ -2005,79 +2305,96 @@ are-we-there-yet@^3.0.0: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" + resolved "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz" integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== dependencies: typical "^2.6.0" array-back@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" + resolved "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz" integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== dependencies: typical "^2.6.1" array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +asn1@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-eventemitter@0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" async@3.2.3, async@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + resolved "https://registry.npmjs.org/async/-/async-3.2.3.tgz" integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== async@^2.4.0: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + axios@0.26.0: version "0.26.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" + resolved "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz" integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== dependencies: follow-redirects "^1.14.8" babel-jest@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.2.4.tgz#21ed6729d51bdd75470bbbf3c8b08d86209fb0dc" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.4.tgz" integrity sha512-f24OmxyWymk5jfgLdlCMu4fTs4ldxFBIdn5sJdhvGC1m08rSkJ5hYbWkNmfBSvE/DjhCVNSHXepxsI6THGfGsg== dependencies: "@jest/transform" "^27.2.4" @@ -2091,7 +2408,7 @@ babel-jest@^27.2.4: babel-plugin-istanbul@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz" integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -2102,7 +2419,7 @@ babel-plugin-istanbul@^6.0.0: babel-plugin-jest-hoist@^27.2.0: version "27.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz" integrity sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw== dependencies: "@babel/template" "^7.3.3" @@ -2112,7 +2429,7 @@ babel-plugin-jest-hoist@^27.2.0: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -2130,7 +2447,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^27.2.0: version "27.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz" integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg== dependencies: babel-plugin-jest-hoist "^27.2.0" @@ -2138,51 +2455,70 @@ babel-preset-jest@^27.2.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.2.0, base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bcrypt-pbkdf@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bintrees@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" + resolved "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz" integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= -bl@^4.1.0: +bl@^4.0.3, bl@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.11.9: +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.2.1: +bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== body-parser@1.19.1: version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz" integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: bytes "3.1.1" @@ -2196,29 +2532,50 @@ body-parser@1.19.1: raw-body "2.4.2" type-is "~1.6.18" +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-level@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== dependencies: abstract-level "^1.0.2" @@ -2228,12 +2585,29 @@ browser-level@^1.0.1: browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + browserslist@^4.14.5, browserslist@^4.16.6: version "4.17.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.2.tgz#aa15dbd2fab399a399fe4df601bb09363c5458a6" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.17.2.tgz" integrity sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ== dependencies: caniuse-lite "^1.0.30001261" @@ -2244,26 +2618,47 @@ browserslist@^4.14.5, browserslist@^4.16.6: bs-logger@0.x: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -2271,7 +2666,7 @@ buffer@^5.5.0: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -2279,14 +2674,19 @@ buffer@^6.0.3: bufferutil@4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz" integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== dependencies: node-gyp-build "^4.3.0" +buildcheck@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.6.tgz#89aa6e417cfd1e2196e3f8fe915eb709d2fe4238" + integrity sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A== + busboy@^0.2.11: version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + resolved "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz" integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= dependencies: dicer "0.2.5" @@ -2294,12 +2694,12 @@ busboy@^0.2.11: bytes@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz" integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== cacache@^15.2.0: version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: "@npmcli/fs" "^1.0.0" @@ -2323,7 +2723,7 @@ cacache@^15.2.0: cache-manager@^3.6.3: version "3.6.3" - resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-3.6.3.tgz#48052f3cf9ee4bac1cbb6adeedd69faf9da4ec04" + resolved "https://registry.npmjs.org/cache-manager/-/cache-manager-3.6.3.tgz" integrity sha512-dS4DnV6c6cQcVH5OxzIU1XZaACXwvVIiUPkFytnRmLOACuBGv3GQgRQ1RJGRRw4/9DF14ZK2RFlZu1TUgDniMg== dependencies: async "3.2.3" @@ -2332,7 +2732,7 @@ cache-manager@^3.6.3: call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2340,45 +2740,45 @@ call-bind@^1.0.0: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== caniuse-lite@^1.0.30001261: version "1.0.30001263" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001263.tgz#7ce7a6fb482a137585cbc908aaf38e90c53a16a4" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001263.tgz" integrity sha512-doiV5dft6yzWO1WwU19kt8Qz8R0/8DgEziz6/9n2FxUasteZNwNNYSmJO3GLBH8lCVE73AB1RPDPAeYbcO5Cvw== case@^1.6.3: version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + resolved "https://registry.npmjs.org/case/-/case-1.6.3.tgz" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== chalk@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2387,7 +2787,7 @@ chalk@^2.0.0: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2395,22 +2795,22 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== check-disk-space@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/check-disk-space/-/check-disk-space-3.1.0.tgz#3a90e0b27533e06ddcfafd93b749f2514fc12d90" + resolved "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.1.0.tgz" integrity sha512-4L3WVw4uPaBJocwnxTCWTTHc8mNu080pjCVBhZeWFdnaQBAremLHpJ1H90G+uEA0rJcW43fghYMsLBXID9X4Zg== chokidar@3.5.3, chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -2423,34 +2823,59 @@ chokidar@3.5.3, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz" integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + cjs-module-lexer@^1.0.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== class-transformer@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" + resolved "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== class-validator@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.0.tgz#40ed0ecf3c83b2a8a6a320f4edb607be0f0df159" + resolved "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz" integrity sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A== dependencies: "@types/validator" "^13.7.10" @@ -2459,7 +2884,7 @@ class-validator@^0.14.0: classic-level@^1.2.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" + resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz" integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== dependencies: abstract-level "^1.0.2" @@ -2470,12 +2895,17 @@ classic-level@^1.2.0: clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-color@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.1.tgz#93e3491308691f1e46beb78b63d0fb2585e42ba6" + resolved "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz" integrity sha512-eBbxZF6fqPUNnf7CLAFOersUnyYzv83tHFLSlts+OAHsNendaqv2tHCq+/MO+b3Y+9JeoUlIvobyxG/Z8GNeOg== dependencies: d "^1.0.1" @@ -2486,19 +2916,19 @@ cli-color@^2.0.1: cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-spinners@^2.5.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz" integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== cli-table3@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz" integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== dependencies: string-width "^4.2.0" @@ -2507,12 +2937,12 @@ cli-table3@0.6.1: cli-width@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -2521,46 +2951,46 @@ cliui@^7.0.2: clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= collect-v8-coverage@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz" integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== dependencies: color-name "^1.0.0" @@ -2568,12 +2998,12 @@ color-string@^1.6.0: color-support@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== color@^3.1.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -2581,12 +3011,12 @@ color@^3.1.3: colors@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== colorspace@1.1.x: version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== dependencies: color "^3.1.3" @@ -2594,14 +3024,19 @@ colorspace@1.1.x: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + command-line-args@^4.0.7: version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz" integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== dependencies: array-back "^2.0.0" @@ -2610,32 +3045,37 @@ command-line-args@^4.0.7: commander@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + compare-versions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz" integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== component-emitter@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -2645,56 +3085,56 @@ concat-stream@^1.5.2: consola@^2.15.0: version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.1: +cookie@0.4.1, cookie@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookiejar@^2.1.2: version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -2702,7 +3142,7 @@ cors@2.8.5: cosmiconfig@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" @@ -2711,21 +3151,52 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cpu-features@~0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.10.tgz#9aae536db2710c7254d7ed67cb3cbc7d29ad79c5" + integrity sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA== + dependencies: + buildcheck "~0.0.6" + nan "^2.19.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cron@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/cron/-/cron-2.0.0.tgz#15c6bf37c1cebf6da1d7a688b9ba1c68338bfe6b" + resolved "https://registry.npmjs.org/cron/-/cron-2.0.0.tgz" integrity sha512-RPeRunBCFr/WEo7WLp8Jnm45F/ziGJiHVvVQEBSDTSGu6uHW49b2FOP2O14DcXlGJRLhwE7TIoDzHHK4KmlL6g== dependencies: luxon "^1.23.x" 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" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -2734,24 +3205,24 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: cssom@^0.4.4: version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" d@1, d@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" @@ -2759,7 +3230,7 @@ d@1, d@^1.0.1: data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" @@ -2768,87 +3239,78 @@ data-urls@^2.0.0: debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^4.1.1: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" -debug@^4.3.3: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js@^10.2.1: version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== dedent@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== defaults@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depd@^1.1.2, depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== dicer@0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + resolved "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz" integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= dependencies: readable-stream "1.1.x" @@ -2856,58 +3318,82 @@ dicer@0.2.5: diff-sequences@^27.0.6: version "27.0.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" +docker-modem@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-5.0.3.tgz#50c06f11285289f58112b5c4c4d89824541c41d0" + integrity sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg== + dependencies: + debug "^4.1.1" + readable-stream "^3.5.0" + split-ca "^1.0.1" + ssh2 "^1.15.0" + +dockerode@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-4.0.2.tgz#dedc8529a1db3ac46d186f5912389899bc309f7d" + integrity sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w== + dependencies: + "@balena/dockerignore" "^1.0.2" + docker-modem "^5.0.3" + tar-fs "~2.0.1" + doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" domexception@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: webidl-conversions "^5.0.0" dotenv-expand@8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-8.0.1.tgz#332aa17c14b12e28e2e230f8d183eecc1c014fdc" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.1.tgz" integrity sha512-j/Ih7bIERDR5PzI89Zu8ayd3tXZ6E3dbY0ljQ9Db0K87qBO8zdLsi2dIvDHMWtjC3Yxb8XixOTHAtia0fDHRpg== dotenv@16.0.0: version "16.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz" integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.854: version "1.3.856" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.856.tgz#75dee0eef9702bffabbf4c1293c989cd3cacb7ba" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.856.tgz" integrity sha512-lSezYIe1/p5qkEswAfaQUseOBiwGwuCvRl/MKzOEVe++DcmQ92+43dznDl4rFJ4Zpu+kevhwyIf7KjJevyDA/A== -elliptic@6.5.4, elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2920,46 +3406,46 @@ elliptic@6.5.4, elliptic@^6.5.4: emittery@0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz" integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== emittery@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enabled@2.0.x: version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.12: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0: version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz" integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== dependencies: graceful-fs "^4.2.4" @@ -2967,44 +3453,44 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0: enhanced-resolve@^5.9.2: version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz" integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5: +enquirer@^2.3.0, enquirer@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== err-code@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-module-lexer@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== dependencies: es6-iterator "~2.0.3" @@ -3013,7 +3499,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@ es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" @@ -3022,7 +3508,7 @@ es6-iterator@^2.0.3, es6-iterator@~2.0.3: es6-symbol@^3.1.1, es6-symbol@~3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" @@ -3030,7 +3516,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: es6-weak-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + resolved "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz" integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== dependencies: d "1" @@ -3040,32 +3526,32 @@ es6-weak-map@^2.0.3: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: esprima "^4.0.1" @@ -3077,19 +3563,19 @@ escodegen@^2.0.0: eslint-config-prettier@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz" integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== eslint-plugin-prettier@^3.4.0: version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -3097,31 +3583,31 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.30.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -3167,7 +3653,7 @@ eslint@^7.30.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -3176,46 +3662,98 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + ethers@5.7.2, ethers@^5.5.4: version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -3249,9 +3787,17 @@ ethers@5.7.2, ethers@^5.5.4: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + event-emitter@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= dependencies: d "1" @@ -3259,17 +3805,25 @@ event-emitter@^0.3.5: eventemitter-asyncresource@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" + resolved "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz" integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + execa@^4.0.2: version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" @@ -3284,7 +3838,7 @@ execa@^4.0.2: execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -3299,12 +3853,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expect@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.2.4.tgz#4debf546050bcdad8914a8c95fec7662e02bf67c" + resolved "https://registry.npmjs.org/expect/-/expect-27.2.4.tgz" integrity sha512-gOtuonQ8TCnbNNCSw2fhVzRf8EFYDII4nB5NmG4IEV0rbUnW1I5zXvoTntU4iicB/Uh0oZr20NGlOLdJiwsOZA== dependencies: "@jest/types" "^27.2.4" @@ -3316,7 +3870,7 @@ expect@^27.2.4: express@4.17.2: version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + resolved "https://registry.npmjs.org/express/-/express-4.17.2.tgz" integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: accepts "~1.3.7" @@ -3352,14 +3906,14 @@ express@4.17.2: ext@^1.1.2: version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + resolved "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz" integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== dependencies: type "^2.5.0" external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -3368,17 +3922,17 @@ external-editor@^3.0.3: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.1.1: version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -3389,62 +3943,62 @@ fast-glob@^3.1.1: fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-safe-stringify@2.1.1, fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: bser "2.1.1" fecha@^4.2.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz" integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q== figures@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -3457,46 +4011,66 @@ finalhandler@~1.1.2: find-replace@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz" integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== dependencies: array-back "^1.0.4" test-value "^2.1.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz" integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== fn.name@1.x.x: version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.14.8: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== +follow-redirects@^1.12.1, follow-redirects@^1.14.8: + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== fork-ts-checker-webpack-plugin@7.2.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.3.tgz#978dbc0b601556552a5a274a8984ec5dd8de56a3" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.3.tgz" integrity sha512-9v308zIFTIFkWJBN/4N1A5oqm/ed9hWG6GH+KYTCBjYCEJOmHoVtDIWpfrJ0eD6cPB7V53HEVoJ6bL2In8QRaw== dependencies: "@babel/code-frame" "^7.16.7" @@ -3513,7 +4087,7 @@ fork-ts-checker-webpack-plugin@7.2.3: form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -3522,22 +4096,32 @@ form-data@^3.0.0: formidable@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz" integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fp-ts@1.19.3, fp-ts@^1.0.0: + version "1.19.3" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz" integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: graceful-fs "^4.2.0" @@ -3546,57 +4130,67 @@ fs-extra@10.0.0: fs-extra@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz" integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^7.0.0: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs-monkey@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= ganache@7.9.0: version "7.9.0" - resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.9.0.tgz#561deceb376b1c4e8998ac8e5a842574507d3295" + resolved "https://registry.npmjs.org/ganache/-/ganache-7.9.0.tgz" integrity sha512-KdsTZaAKqDXTNDMKnLzg0ngX8wnZKyVGm7HD03GIyUMVRuXI83s0CUEaGIDWRUWTQP7BE8sDh7QtbW+NoX4zrQ== dependencies: "@trufflesuite/bigint-buffer" "1.1.10" @@ -3617,7 +4211,7 @@ ganache@7.9.0: gauge@^4.0.3: version "4.0.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== dependencies: aproba "^1.0.3 || ^2.0.0" @@ -3631,17 +4225,17 @@ gauge@^4.0.3: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2: version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" @@ -3650,36 +4244,36 @@ get-intrinsic@^1.0.2: get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@7.2.0, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -3691,7 +4285,7 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: glob@^7.1.6: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -3701,21 +4295,32 @@ glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + resolved "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz" integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== dependencies: type-fest "^0.20.2" globby@^11.0.3: version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" @@ -3725,56 +4330,110 @@ globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== graceful-fs@^4.2.6: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== graceful-fs@^4.2.9: version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +hardhat@^2.22.14: + version "2.22.14" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.14.tgz#389bb3789a52adc0b1a3b4bfc9b891239d5a2b42" + integrity sha512-sD8vHtS9l5QQVHzyPPe3auwZDJyZ0fG3Z9YENVa4oOqVEefCuHcPzdU736rei3zUKTqkX0zPIHkSMHpu02Fq1A== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.6.4" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chalk "^2.4.2" + chokidar "^4.0.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -3782,7 +4441,7 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: hdr-histogram-js@^2.0.1: version "2.0.3" - resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz#0b860534655722b6e3f3e7dca7b78867cf43dcb5" + resolved "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz" integrity sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g== dependencies: "@assemblyscript/loader" "^0.10.1" @@ -3791,12 +4450,17 @@ hdr-histogram-js@^2.0.1: hdr-histogram-percentiles-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" + resolved "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz" integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -3805,24 +4469,24 @@ hmac-drbg@^1.0.1: html-encoding-sniffer@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: whatwg-encoding "^1.0.5" html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-errors@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" @@ -3833,7 +4497,7 @@ http-errors@1.8.1: 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" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -3842,7 +4506,7 @@ http-proxy-agent@^4.0.1: https-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: agent-base "6" @@ -3850,53 +4514,58 @@ https-proxy-agent@^5.0.0: human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" 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" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" 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" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -3904,7 +4573,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-local@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz" integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: pkg-dir "^4.2.0" @@ -3912,35 +4581,35 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" 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" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" 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" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inquirer@7.3.3: version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" @@ -3959,7 +4628,7 @@ inquirer@7.3.3: inquirer@8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz" integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== dependencies: ansi-escapes "^4.2.1" @@ -3979,140 +4648,157 @@ inquirer@8.2.0: interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + ip@^1.1.5: version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-ci@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz" integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== dependencies: ci-info "^3.1.1" is-core-module@^2.2.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz" integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-interactive@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-lambda@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-promise@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isarray@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= istanbul-lib-coverage@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz#e8900b3ed6069759229cf30f7067388d148aeb5e" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz" integrity sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ== istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -4122,7 +4808,7 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -4131,7 +4817,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz" integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== dependencies: debug "^4.1.1" @@ -4140,7 +4826,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz" integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== dependencies: html-escaper "^2.0.0" @@ -4148,12 +4834,12 @@ istanbul-reports@^3.0.2: iterare@1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + resolved "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz" integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== jest-changed-files@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.2.4.tgz#d7de46e90e5a599c47e260760f5ab53516e835e6" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.2.4.tgz" integrity sha512-eeO1C1u4ex7pdTroYXezr+rbr957myyVoKGjcY4R1TJi3A+9v+4fu1Iv9J4eLq1bgFyT3O3iRWU9lZsEE7J72Q== dependencies: "@jest/types" "^27.2.4" @@ -4162,7 +4848,7 @@ jest-changed-files@^27.2.4: jest-circus@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.2.4.tgz#3bd898a29dcaf6a506f3f1b780dff5f67ca83c23" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.4.tgz" integrity sha512-TtheheTElrGjlsY9VxkzUU1qwIx05ItIusMVKnvNkMt4o/PeegLRcjq3Db2Jz0GGdBalJdbzLZBgeulZAJxJWA== dependencies: "@jest/environment" "^27.2.4" @@ -4187,7 +4873,7 @@ jest-circus@^27.2.4: jest-cli@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.2.4.tgz#acda7f367aa6e674723fc1a7334e0ae1799448d2" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.4.tgz" integrity sha512-4kpQQkg74HYLaXo3nzwtg4PYxSLgL7puz1LXHj5Tu85KmlIpxQFjRkXlx4V47CYFFIDoyl3rHA/cXOxUWyMpNg== dependencies: "@jest/core" "^27.2.4" @@ -4205,7 +4891,7 @@ jest-cli@^27.2.4: jest-config@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.2.4.tgz#0204969f5ae2e5190d47be2c14c04d631b7836e2" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.2.4.tgz" integrity sha512-tWy0UxhdzqiKyp4l5Vq4HxLyD+gH5td+GCF3c22/DJ0bYAOsMo+qi2XtbJI6oYMH5JOJQs9nLW/r34nvFCehjA== dependencies: "@babel/core" "^7.1.0" @@ -4232,7 +4918,7 @@ jest-config@^27.2.4: jest-diff@^27.0.0, jest-diff@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.2.4.tgz#171c51d3d2c105c457100fee6e7bf7cee51c8d8c" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.4.tgz" integrity sha512-bLAVlDSCR3gqUPGv+4nzVpEXGsHh98HjUL7Vb2hVyyuBDoQmja8eJb0imUABsuxBeUVmf47taJSAd9nDrwWKEg== dependencies: chalk "^4.0.0" @@ -4242,14 +4928,14 @@ jest-diff@^27.0.0, jest-diff@^27.2.4: jest-docblock@^27.0.6: version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz" integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== dependencies: detect-newline "^3.0.0" jest-each@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.2.4.tgz#b4f280aafd63129ba82e345f0e74c5a10200aeef" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.2.4.tgz" integrity sha512-w9XVc+0EDBUTJS4xBNJ7N2JCcWItFd006lFjz77OarAQcQ10eFDBMrfDv2GBJMKlXe9aq0HrIIF51AXcZrRJyg== dependencies: "@jest/types" "^27.2.4" @@ -4260,7 +4946,7 @@ jest-each@^27.2.4: jest-environment-jsdom@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.2.4.tgz#39ae80bbb8675306bfaf0440be1e5f877554539a" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.4.tgz" integrity sha512-X70pTXFSypD7AIzKT1mLnDi5hP9w9mdTRcOGOmoDoBrNyNEg4rYm6d4LQWFLc9ps1VnMuDOkFSG0wjSNYGjkng== dependencies: "@jest/environment" "^27.2.4" @@ -4273,7 +4959,7 @@ jest-environment-jsdom@^27.2.4: jest-environment-node@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.2.4.tgz#b79f98cb36e0c9111aac859c9c99f04eb2f74ff6" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.4.tgz" integrity sha512-ZbVbFSnbzTvhLOIkqh5lcLuGCCFvtG4xTXIRPK99rV2KzQT3kNg16KZwfTnLNlIiWCE8do960eToeDfcqmpSAw== dependencies: "@jest/environment" "^27.2.4" @@ -4285,12 +4971,12 @@ jest-environment-node@^27.2.4: jest-get-type@^27.0.6: version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz" integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== jest-haste-map@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.2.4.tgz#f8974807bedf07348ca9fd24e5861ab7c8e61aba" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.4.tgz" integrity sha512-bkJ4bT00T2K+1NZXbRcyKnbJ42I6QBvoDNMTAQQDBhaGNnZreiQKUNqax0e6hLTx7E75pKDeltVu3V1HAdu+YA== dependencies: "@jest/types" "^27.2.4" @@ -4310,7 +4996,7 @@ jest-haste-map@^27.2.4: jest-jasmine2@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.2.4.tgz#4a1608133dbdb4d68b5929bfd785503ed9c9ba51" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.4.tgz" integrity sha512-fcffjO/xLWLVnW2ct3No4EksxM5RyPwHDYu9QU+90cC+/eSMLkFAxS55vkqsxexOO5zSsZ3foVpMQcg/amSeIQ== dependencies: "@babel/traverse" "^7.1.0" @@ -4334,7 +5020,7 @@ jest-jasmine2@^27.2.4: jest-leak-detector@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.2.4.tgz#9bb7eab26a73bb280e9298be8d80f389288ec8f1" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.4.tgz" integrity sha512-SrcHWbe0EHg/bw2uBjVoHacTo5xosl068x2Q0aWsjr2yYuW2XwqrSkZV4lurUop0jhv1709ymG4or+8E4sH27Q== dependencies: jest-get-type "^27.0.6" @@ -4342,7 +5028,7 @@ jest-leak-detector@^27.2.4: jest-matcher-utils@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.4.tgz#008fff018151415ad1b6cfc083fd70fe1e012525" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.4.tgz" integrity sha512-nQeLfFAIPPkyhkDfifAPfP/U5wm1x0fLtAzqXZSSKckXDNuk2aaOfQiDYv1Mgf5GY6yOsxfUnvNm3dDjXM+BXw== dependencies: chalk "^4.0.0" @@ -4352,7 +5038,7 @@ jest-matcher-utils@^27.2.4: jest-message-util@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.2.4.tgz#667e8c0f2b973156d1bac7398a7f677705cafaca" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.4.tgz" integrity sha512-wbKT/BNGnBVB9nzi+IoaLkXt6fbSvqUxx+IYY66YFh96J3goY33BAaNG3uPqaw/Sh/FR9YpXGVDfd5DJdbh4nA== dependencies: "@babel/code-frame" "^7.12.13" @@ -4367,7 +5053,7 @@ jest-message-util@^27.2.4: jest-mock@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.2.4.tgz#c8f0ef33f73d8ff53e3f60b16d59f1128f4072ae" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.2.4.tgz" integrity sha512-iVRU905rutaAoUcrt5Tm1JoHHWi24YabqEGXjPJI4tAyA6wZ7mzDi3GrZ+M7ebgWBqUkZE93GAx1STk7yCMIQA== dependencies: "@jest/types" "^27.2.4" @@ -4375,17 +5061,17 @@ jest-mock@^27.2.4: jest-pnp-resolver@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^27.0.6: version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz" integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== jest-resolve-dependencies@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.4.tgz#20c41cc02b66aa45169b282356ec73b133013089" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.4.tgz" integrity sha512-i5s7Uh9B3Q6uwxLpMhNKlgBf6pcemvWaORxsW1zNF/YCY3jd5EftvnGBI+fxVwJ1CBxkVfxqCvm1lpZkbaoGmg== dependencies: "@jest/types" "^27.2.4" @@ -4394,7 +5080,7 @@ jest-resolve-dependencies@^27.2.4: jest-resolve@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.2.4.tgz#d3b999f073ff84a8ae109ce99ff7f3223048701a" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.4.tgz" integrity sha512-IsAO/3+3BZnKjI2I4f3835TBK/90dxR7Otgufn3mnrDFTByOSXclDi3G2XJsawGV4/18IMLARJ+V7Wm7t+J89Q== dependencies: "@jest/types" "^27.2.4" @@ -4410,7 +5096,7 @@ jest-resolve@^27.2.4: jest-runner@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.2.4.tgz#d816f4cb4af04f3cba703afcf5a35a335b77cad4" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.4.tgz" integrity sha512-hIo5PPuNUyVDidZS8EetntuuJbQ+4IHWxmHgYZz9FIDbG2wcZjrP6b52uMDjAEQiHAn8yn8ynNe+TL8UuGFYKg== dependencies: "@jest/console" "^27.2.4" @@ -4438,7 +5124,7 @@ jest-runner@^27.2.4: jest-runtime@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.2.4.tgz#170044041e5d30625ab8d753516bbe503f213a5c" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.4.tgz" integrity sha512-ICKzzYdjIi70P17MZsLLIgIQFCQmIjMFf+xYww3aUySiUA/QBPUTdUqo5B2eg4HOn9/KkUsV0z6GVgaqAPBJvg== dependencies: "@jest/console" "^27.2.4" @@ -4471,7 +5157,7 @@ jest-runtime@^27.2.4: jest-serializer@^27.0.6: version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz" integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== dependencies: "@types/node" "*" @@ -4479,7 +5165,7 @@ jest-serializer@^27.0.6: jest-snapshot@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.2.4.tgz#277b2269437e3ffcb91d95a73b24becf33c5a871" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.4.tgz" integrity sha512-5DFxK31rYS8X8C6WXsFx8XxrxW3PGa6+9IrUcZdTLg1aEyXDGIeiBh4jbwvh655bg/9vTETbEj/njfZicHTZZw== dependencies: "@babel/core" "^7.7.2" @@ -4509,7 +5195,7 @@ jest-snapshot@^27.2.4: jest-util@^27.0.0, jest-util@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.2.4.tgz#3d7ce081b2e7f4cfe0156452ac01f3cb456cc656" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.2.4.tgz" integrity sha512-mW++4u+fSvAt3YBWm5IpbmRAceUqa2B++JlUZTiuEt2AmNYn0Yw5oay4cP17TGsMINRNPSGiJ2zNnX60g+VbFg== dependencies: "@jest/types" "^27.2.4" @@ -4521,7 +5207,7 @@ jest-util@^27.0.0, jest-util@^27.2.4: jest-validate@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.2.4.tgz#b66d462b2fb93d7e16a47d1aa8763d5600bf2cfa" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.4.tgz" integrity sha512-VMtbxbkd7LHnIH7PChdDtrluCFRJ4b1YV2YJzNwwsASMWftq/HgqiqjvptBOWyWOtevgO3f14wPxkPcLlVBRog== dependencies: "@jest/types" "^27.2.4" @@ -4533,7 +5219,7 @@ jest-validate@^27.2.4: jest-watcher@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.2.4.tgz#b1d5c39ab94f59f4f35f66cc96f7761a10e0cfc4" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.4.tgz" integrity sha512-LXC/0+dKxhK7cfF7reflRYlzDIaQE+fL4ynhKhzg8IMILNMuI4xcjXXfUJady7OR4/TZeMg7X8eHx8uan9vqaQ== dependencies: "@jest/test-result" "^27.2.4" @@ -4546,7 +5232,7 @@ jest-watcher@^27.2.4: jest-worker@^27.0.6, jest-worker@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.4.tgz#881455df75e22e7726a53f43703ab74d6b36f82d" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.4.tgz" integrity sha512-Zq9A2Pw59KkVjBBKD1i3iE2e22oSjXhUKKuAK1HGX8flGwkm6NMozyEYzKd41hXc64dbd/0eWFeEEuxqXyhM+g== dependencies: "@types/node" "*" @@ -4555,7 +5241,7 @@ jest-worker@^27.0.6, jest-worker@^27.2.4: jest@^27.0.6: version "27.2.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.2.4.tgz#70e27bef873138afc123aa4769f7124c50ad3efb" + resolved "https://registry.npmjs.org/jest/-/jest-27.2.4.tgz" integrity sha512-h4uqb1EQLfPulWyUFFWv9e9Nn8sCqsJ/j3wk/KCY0p4s4s0ICCfP3iMf6hRf5hEhsDyvyrCgKiZXma63gMz16A== dependencies: "@jest/core" "^27.2.4" @@ -4564,25 +5250,32 @@ jest@^27.0.6: js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsdom@^16.6.0: version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" @@ -4615,63 +5308,68 @@ jsdom@^16.6.0: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-parse-better-errors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" 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" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + json5@2.x, json5@^2.1.2: version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" json5@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" jsonc-parser@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -4680,17 +5378,17 @@ jsonfile@^6.0.1: kafkajs@*: version "1.15.0" - resolved "https://registry.yarnpkg.com/kafkajs/-/kafkajs-1.15.0.tgz#a5ada0d933edca2149177393562be6fb0875ec3a" + resolved "https://registry.npmjs.org/kafkajs/-/kafkajs-1.15.0.tgz" integrity sha512-yjPyEnQCkPxAuQLIJnY5dI+xnmmgXmhuOQ1GVxClG5KTOV/rJcW1qA3UfvyEJKTp/RTSqQnUR3HJsKFvHyTpNg== kafkajs@^1.15.0: version "1.16.0" - resolved "https://registry.yarnpkg.com/kafkajs/-/kafkajs-1.16.0.tgz#bfcc3ae2b69265ca8435b53a01ee9e8787b9fee5" + resolved "https://registry.npmjs.org/kafkajs/-/kafkajs-1.16.0.tgz" integrity sha512-+Rcfu2hyQ/jv5skqRY8xA7Ra+mmRkDAzCaLDYbkGtgsNKpzxPWiLbk8ub0dgr4EbWrN1Zb4BCXHUkD6+zYfdWg== -keccak@3.0.2: +keccak@3.0.2, keccak@^3.0.0, keccak@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" @@ -4699,34 +5397,34 @@ keccak@3.0.2: kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kuler@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== level-concat-iterator@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz" integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== dependencies: catering "^2.1.0" level-supports@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz" integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== level-supports@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: buffer "^6.0.3" @@ -4734,7 +5432,7 @@ level-transcoder@^1.0.1: level@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" + resolved "https://registry.npmjs.org/level/-/level-8.0.1.tgz" integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== dependencies: abstract-level "^1.0.4" @@ -4743,7 +5441,7 @@ level@^8.0.1: leveldown@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + resolved "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz" integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== dependencies: abstract-leveldown "^7.2.0" @@ -4752,12 +5450,12 @@ leveldown@6.1.0: leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -4765,7 +5463,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" @@ -4773,49 +5471,69 @@ levn@~0.3.0: libphonenumber-js@^1.10.14: version "1.10.19" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz#e18970c8d566fbfb1f88e688345f0512e126712e" + resolved "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.19.tgz" integrity sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg== lines-and-columns@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= loader-runner@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz" integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@4.17.21, lodash@4.x, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: +lodash@4.17.21, lodash@4.x, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -4823,7 +5541,7 @@ log-symbols@^4.1.0: logform@^2.3.2, logform@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.4.0.tgz#131651715a17d50f09c2a2c1a524ff1a4164bcfe" + resolved "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz" integrity sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw== dependencies: "@colors/colors" "1.5.0" @@ -4834,55 +5552,60 @@ logform@^2.3.2, logform@^2.4.0: lru-cache@6.0.0, lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru-cache@^9.1.1: version "9.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz" integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== lru-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + resolved "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz" integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= dependencies: es5-ext "~0.10.2" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + luxon@^1.23.x: version "1.28.1" - resolved "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz#528cdf3624a54506d710290a2341aa8e6e6c61b0" + resolved "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz" integrity sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw== macos-release@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2" + resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz" integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== magic-string@0.25.7: version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== dependencies: sourcemap-codec "^1.4.4" make-dir@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@1.x, make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-fetch-happen@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== dependencies: agentkeepalive "^4.1.3" @@ -4904,26 +5627,35 @@ make-fetch-happen@^9.1.0: makeerror@1.0.x: version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz" integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memfs@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz" integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== dependencies: fs-monkey "1.0.3" memoizee@^0.4.15: version "0.4.15" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz" integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== dependencies: d "^1.0.1" @@ -4935,29 +5667,34 @@ memoizee@^0.4.15: next-tick "^1.1.0" timers-ext "^0.1.7" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@^1.1.2, methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.0, micromatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" @@ -4965,80 +5702,87 @@ micromatch@^4.0.0, micromatch@^4.0.4: mime-db@1.49.0: version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== mime-db@1.51.0: version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@^2.1.27: version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: mime-db "1.49.0" mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.6: version "2.5.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + resolved "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz" integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 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" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: minipass "^3.0.0" minipass-fetch@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== dependencies: minipass "^3.1.0" @@ -5049,75 +5793,108 @@ minipass-fetch@^1.3.2: minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: 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" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" 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" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.3.tgz#fd1f0e6c06449c10dadda72618b59c00f3d6378d" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.3.tgz" integrity sha512-N0BOsdFAlNRfmwMhjAsLVWOk7Ljmeb39iqFlsV1At+jqRhSUP9yeof8FyJu4imaJiSUp8vQebWD/guZwGQC8iA== dependencies: yallist "^4.0.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" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" yallist "^4.0.0" +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.4: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.7.3" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multer@1.4.4: version "1.4.4" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" + resolved "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz" integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw== dependencies: append-field "^1.0.0" @@ -5131,42 +5908,47 @@ multer@1.4.4: mute-stream@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nan@^2.19.0, nan@^2.20.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + nanocolors@^0.2.12: version "0.2.12" - resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.2.12.tgz#4d05932e70116078673ea4cc6699a1c56cc77777" + resolved "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz" integrity sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug== napi-macros@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== napi-macros@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.3, negotiator@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nest-winston@^1.6.1: version "1.6.2" - resolved "https://registry.yarnpkg.com/nest-winston/-/nest-winston-1.6.2.tgz#e4f24096b7e5cd9c8649b3d15203e576114d07e0" + resolved "https://registry.npmjs.org/nest-winston/-/nest-winston-1.6.2.tgz" integrity sha512-pM3o4zttpkKdnpNXyvMKKBD2u7OWROmVglyWZpH7O7QOLAegbMPvyqWgPNfvw2kkla+T/H4HFgGqcZGqiTzI5Q== dependencies: cli-color "^2.0.1" @@ -5174,17 +5956,17 @@ nest-winston@^1.6.1: next-tick@1, next-tick@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== next-tick@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= nice-napi@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" + resolved "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz" integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== dependencies: node-addon-api "^3.0.0" @@ -5192,58 +5974,58 @@ nice-napi@^1.0.2: node-abort-controller@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" + resolved "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz" integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-addon-api@^3.0.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-emoji@1.11.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: lodash "^4.17.21" node-fetch@^2.6.1: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" node-fetch@^2.6.7: version "2.6.8" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz" integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg== dependencies: whatwg-url "^5.0.0" node-gyp-build@4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-gyp-build@^4.2.2: version "4.7.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.7.1.tgz#cd7d2eb48e594874053150a9418ac85af83ca8f7" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz" integrity sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg== node-gyp@^8.4.0: version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz" integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== dependencies: env-paths "^2.2.0" @@ -5259,41 +6041,41 @@ node-gyp@^8.4.0: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-modules-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + resolved "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-releases@^1.1.76: version "1.1.76" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz" integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA== nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 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" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== dependencies: are-we-there-yet "^3.0.0" @@ -5303,60 +6085,65 @@ npmlog@^6.0.0: nwsapi@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== object-assign@^4, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-hash@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== object-inspect@^1.9.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" one-time@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: fn.name "1.x.x" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optional@0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" + resolved "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz" integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -5368,7 +6155,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -5380,7 +6167,7 @@ optionator@^0.9.1: ora@5.4.0: version "5.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.0.tgz#42eda4855835b9cd14d33864c97a3c95a3f56bf4" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz" integrity sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg== dependencies: bl "^4.1.0" @@ -5395,7 +6182,7 @@ ora@5.4.0: ora@5.4.1, ora@^5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: bl "^4.1.0" @@ -5410,7 +6197,7 @@ ora@5.4.1, ora@^5.4.1: os-name@4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-4.0.1.tgz#32cee7823de85a8897647ba4d76db46bf845e555" + resolved "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz" integrity sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw== dependencies: macos-release "^2.5.0" @@ -5418,57 +6205,83 @@ os-name@4.0.1: os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-limit@^3.1.0: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^1.0.3: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -5478,64 +6291,136 @@ parse-json@^5.0.0: parse5@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-to-regexp@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz" integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37" + integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" + integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== + +pg-protocol@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" + integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.0.tgz#e3d245342eb0158112553fcc1890a60720ae2a3d" + integrity sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw== + dependencies: + pg-connection-string "^2.7.0" + pg-pool "^3.7.0" + pg-protocol "^1.7.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pirates@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: node-modules-regexp "^1.0.0" piscina@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.2.0.tgz#f5a1dde0c05567775690cccefe59d9223924d154" + resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== dependencies: eventemitter-asyncresource "^1.0.0" @@ -5546,46 +6431,68 @@ piscina@3.2.0: pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pluralize@8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier@^2.1.2: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== prettier@^2.3.2: version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz" integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== pretty-format@^27.0.0, pretty-format@^27.2.4: version "27.2.4" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.2.4.tgz#08ea39c5eab41b082852d7093059a091f6ddc748" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.4.tgz" integrity sha512-NUjw22WJHldzxyps2YjLZkUj6q1HvjqFezkB9Y2cklN8NtVZN/kZEXGZdFw4uny3oENzV5EEMESrkI0YDUH8vg== dependencies: "@jest/types" "^27.2.4" @@ -5595,29 +6502,29 @@ pretty-format@^27.0.0, pretty-format@^27.2.4: process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prom-client@^14.0.0: version "14.0.1" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-14.0.1.tgz#bdd9583e02ec95429677c0e013712d42ef1f86a8" + resolved "https://registry.npmjs.org/prom-client/-/prom-client-14.0.1.tgz" integrity sha512-HxTArb6fkOntQHoRGvv4qd/BkorjliiuO2uSWC2KC17MUTKYttWdDoXX/vxOhQdkoECEM9BBH0pj2l8G8kev6w== dependencies: tdigest "^0.1.1" promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" @@ -5625,7 +6532,7 @@ promise-retry@^2.0.1: prompts@^2.0.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz" integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== dependencies: kleur "^3.0.3" @@ -5633,7 +6540,7 @@ prompts@^2.0.1: proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -5641,12 +6548,12 @@ proxy-addr@~2.0.7: psl@^1.1.33: version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -5654,41 +6561,41 @@ pump@^3.0.0: punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.9.6: version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz" integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@^6.9.4: version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== dependencies: side-channel "^1.0.4" queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.2: +raw-body@2.4.2, raw-body@^2.4.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz" integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: bytes "3.1.1" @@ -5698,12 +6605,12 @@ raw-body@2.4.2: react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== readable-stream@1.1.x: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" @@ -5713,7 +6620,7 @@ readable-stream@1.1.x: readable-stream@^2.2.2: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -5724,69 +6631,90 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1, readable-stream@^3.5.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.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" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" reflect-metadata@^0.1.13: version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + resolve@^1.1.6, resolve@^1.20.0: version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: is-core-module "^2.2.0" @@ -5794,7 +6722,7 @@ resolve@^1.1.6, resolve@^1.20.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -5802,98 +6730,113 @@ restore-cursor@^3.1.0: retry@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + run-async@^2.4.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel-limit@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== dependencies: queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rxjs@6.6.7, rxjs@^6.6.0: version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" rxjs@^7.2.0: - version "7.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d" - integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ== + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-stable-stringify@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz" integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== saxes@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" -scrypt-js@3.0.1: +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@4.0.3: +secp256k1@4.0.3, secp256k1@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -5902,19 +6845,24 @@ secp256k1@4.0.3: semver@7.x, 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" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.0.0, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== send@0.17.2: version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" @@ -5931,16 +6879,16 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" serve-static@1.14.2: version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" @@ -5950,29 +6898,42 @@ serve-static@1.14.2: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@0.8.5: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -5981,7 +6942,7 @@ shelljs@0.8.5: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -5990,34 +6951,34 @@ side-channel@^1.0.4: signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= dependencies: is-arrayish "^0.3.1" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -6026,12 +6987,12 @@ slice-ansi@^4.0.0: smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== dependencies: agent-base "^6.0.2" @@ -6040,15 +7001,28 @@ socks-proxy-agent@^6.0.0: socks@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" + resolved "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz" integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== dependencies: ip "^1.1.5" smart-buffer "^4.2.0" -source-map-support@0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20: +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +source-map-support@0.5.21, source-map-support@^0.5.13, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -6056,69 +7030,97 @@ source-map-support@0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20 source-map@0.7.3, source-map@^0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sourcemap-codec@^1.4.4: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +split-ca@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" + integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== + +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssh2@^1.15.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.16.0.tgz#79221d40cbf4d03d07fe881149de0a9de928c9f0" + integrity sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg== + dependencies: + asn1 "^0.2.6" + bcrypt-pbkdf "^1.0.2" + optionalDependencies: + cpu-features "~0.0.10" + nan "^2.20.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" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= stack-utils@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= streamsearch@0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -6127,53 +7129,60 @@ string-length@^4.0.1: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~0.10.x: version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== superagent@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6" + resolved "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz" integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== dependencies: component-emitter "^1.3.0" @@ -6190,7 +7199,7 @@ superagent@^6.1.0: supertest@^6.1.3: version "6.1.6" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.1.6.tgz#6151c518f4c5ced2ac2aadb9f96f1bf8198174c8" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.1.6.tgz" integrity sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg== dependencies: methods "^1.1.2" @@ -6198,28 +7207,28 @@ supertest@^6.1.3: supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" @@ -6227,17 +7236,17 @@ supports-hyperlinks@^2.0.0: symbol-observable@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^6.0.9: version "6.7.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" + resolved "https://registry.npmjs.org/table/-/table-6.7.2.tgz" integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== dependencies: ajv "^8.0.1" @@ -6249,12 +7258,33 @@ table@^6.0.9: tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2" + integrity sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.0.2, tar@^6.1.2: version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" @@ -6266,14 +7296,14 @@ tar@^6.0.2, tar@^6.1.2: tdigest@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" + resolved "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz" integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= dependencies: bintrees "1.0.1" terminal-link@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: ansi-escapes "^4.2.1" @@ -6281,7 +7311,7 @@ terminal-link@^2.0.0: terser-webpack-plugin@^5.1.3: version "5.2.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz" integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA== dependencies: jest-worker "^27.0.6" @@ -6293,7 +7323,7 @@ terser-webpack-plugin@^5.1.3: terser@^5.7.2: version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz" integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: "@jridgewell/source-map" "^0.3.2" @@ -6303,7 +7333,7 @@ terser@^5.7.2: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -6312,7 +7342,7 @@ test-exclude@^6.0.0: test-value@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" + resolved "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz" integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== dependencies: array-back "^1.0.3" @@ -6320,27 +7350,27 @@ test-value@^2.1.0: text-hex@1.0.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= throat@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== through@^2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-ext@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + resolved "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz" integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== dependencies: es5-ext "~0.10.46" @@ -6348,41 +7378,41 @@ timers-ext@^0.1.7: tiny-invariant@^1.1.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== -tmp@^0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: psl "^1.1.33" @@ -6391,34 +7421,34 @@ tough-cookie@^4.0.0: tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= tree-kill@1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== triple-beam@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz" integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-jest@^27.0.3: version "27.0.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.5.tgz#0b0604e2271167ec43c12a69770f0bb65ad1b750" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.5.tgz" integrity sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w== dependencies: bs-logger "0.x" @@ -6432,7 +7462,7 @@ ts-jest@^27.0.3: ts-loader@^9.2.3: version "9.2.6" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.6.tgz#9937c4dd0a1e3dbbb5e433f8102a6601c6615d74" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz" integrity sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw== dependencies: chalk "^4.1.0" @@ -6442,7 +7472,7 @@ ts-loader@^9.2.3: ts-node@^10.0.0: version "10.2.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz" integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== dependencies: "@cspotcode/source-map-support" "0.6.1" @@ -6460,7 +7490,7 @@ ts-node@^10.0.0: tsconfig-paths-webpack-plugin@3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz#01aafff59130c04a8c4ebc96a3045c43c376449a" + resolved "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz" integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== dependencies: chalk "^4.1.0" @@ -6469,7 +7499,7 @@ tsconfig-paths-webpack-plugin@3.5.2: tsconfig-paths@3.14.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" @@ -6479,7 +7509,7 @@ tsconfig-paths@3.14.1: tsconfig-paths@^3.10.1, tsconfig-paths@^3.9.0: version "3.11.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz" integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== dependencies: "@types/json5" "^0.0.29" @@ -6489,53 +7519,78 @@ tsconfig-paths@^3.10.1, tsconfig-paths@^3.9.0: tslib@2.3.1, tslib@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^0.14.3: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -6543,17 +7598,17 @@ type-is@^1.6.4, type-is@~1.6.18: type@^1.0.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.5.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" + resolved "https://registry.npmjs.org/type/-/type-2.6.0.tgz" integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== typechain@^5.1.2: version "5.2.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-5.2.0.tgz#10525a44773a34547eb2eed8978cb72c0a39a0f4" + resolved "https://registry.npmjs.org/typechain/-/typechain-5.2.0.tgz" integrity sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw== dependencies: "@types/prettier" "^2.1.1" @@ -6569,97 +7624,104 @@ typechain@^5.1.2: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz" integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== typescript@^4.3.5: version "4.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz" integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== typical@^2.6.0, typical@^2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" + resolved "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz" integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + unique-filename@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" 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" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" utf-8-validate@5.0.7: version "5.0.7" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz" integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== dependencies: node-gyp-build "^4.3.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@8.3.2: +uuid@8.3.2, uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz" integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" @@ -6668,38 +7730,38 @@ v8-to-istanbul@^8.1.0: validator@^13.7.0: version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: xml-name-validator "^3.0.0" walker@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz" integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" watchpack@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz" integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== dependencies: glob-to-regexp "^0.4.1" @@ -6707,39 +7769,39 @@ watchpack@^2.3.1: wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: defaults "^1.0.3" webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-node-externals@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" + resolved "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz" integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@5.71.0: version "5.71.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.71.0.tgz#b01fcf379570b8c5ee06ca06c829ca168c951884" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz" integrity sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A== dependencies: "@types/eslint-scope" "^3.7.3" @@ -6769,19 +7831,19 @@ webpack@5.71.0: whatwg-encoding@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: tr46 "~0.0.3" @@ -6789,7 +7851,7 @@ whatwg-url@^5.0.0: whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" @@ -6798,28 +7860,35 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + windows-release@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-4.0.0.tgz#4725ec70217d1bf6e02c7772413b29cdde9ec377" + resolved "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz" integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== dependencies: execa "^4.0.2" winston-transport@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz" integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== dependencies: logform "^2.3.2" @@ -6828,7 +7897,7 @@ winston-transport@^4.5.0: winston@^3.3.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.6.0.tgz#be32587a099a292b88c49fac6fa529d478d93fb6" + resolved "https://registry.npmjs.org/winston/-/winston-3.6.0.tgz" integrity sha512-9j8T75p+bcN6D00sF/zjFVmPp+t8KMPB1MzbbzYjeN9VWxdsYnTB40TkbNUEXAmILEfChMvAMgidlX64OG3p6w== dependencies: "@dabh/diagnostics" "^2.0.2" @@ -6844,12 +7913,17 @@ winston@^3.3.3: word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -6858,12 +7932,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -6873,62 +7947,72 @@ write-file-atomic@^3.0.0: ws@7.4.6: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== ws@8.2.3: version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + resolved "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz" integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== + version "7.5.10" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.10.0: version "8.10.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.10.0.tgz#00a28c09dfb76eae4eb45c3b565f771d6951aa51" + resolved "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz" integrity sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw== xml-name-validator@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xtend@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.x, yargs-parser@^20.2.2: +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -6941,12 +8025,12 @@ yargs@^16.2.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zod@^3.23.8: