From 3dbbfdfe68804ae42fe3da6c3e9f3458561f176a Mon Sep 17 00:00:00 2001 From: Sergey White Date: Fri, 12 Apr 2024 13:59:08 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20l2-bridge-mantle=20moved=20=F0=9F=9A=A8?= =?UTF-8?q?=F0=9F=9A=A8=F0=9F=9A=A8=20Mantle=20bridge=20balance=20mismatch?= =?UTF-8?q?=20=F0=9F=9A=A8=F0=9F=9A=A8=F0=9F=9A=A8from=20l2-bridge-balance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test-l2-bridge-mantle.yml | 15 + l2-bridge-balance/src/agent-balance.ts | 5 - l2-bridge-balance/src/config/bot-config.json | 6 - l2-bridge-balance/src/constants.ts | 7 - l2-bridge-mantle/README.md | 27 +- l2-bridge-mantle/package.json | 8 +- l2-bridge-mantle/src/abi/ERC20Short.json | 34 + l2-bridge-mantle/src/agent.spec.ts | 64 ++ l2-bridge-mantle/src/agent.ts | 74 +- l2-bridge-mantle/src/app.ts | 81 +- .../src/clients/eth_provider.spec.ts | 19 + .../src/clients/eth_provider_client.ts | 39 + .../src/clients/forta_guard_client.ts | 54 - .../src/clients/mantle_block_client.ts | 28 +- .../src/clients/mantle_provider.spec.ts | 28 + .../src/clients/mantle_provider.ts | 38 +- l2-bridge-mantle/src/entity/blockDto.ts | 2 +- .../src/services/bridge_balance.ts | 98 ++ .../src/services/event_watcher.ts | 12 +- .../src/services/monitor_withdrawals.ts | 66 +- .../src/services/proxy_watcher.ts | 231 ++--- l2-bridge-mantle/src/utils/constants.ts | 52 +- .../src/utils/events/proxy_admin_events.ts | 38 +- .../tests/e2e/mantle_provider.spec.ts | 13 - l2-bridge-mantle/tsconfig.json | 3 +- l2-bridge-mantle/yarn.lock | 959 ++++++++---------- 26 files changed, 1097 insertions(+), 904 deletions(-) create mode 100644 .github/workflows/test-l2-bridge-mantle.yml create mode 100644 l2-bridge-mantle/src/abi/ERC20Short.json create mode 100644 l2-bridge-mantle/src/agent.spec.ts create mode 100644 l2-bridge-mantle/src/clients/eth_provider.spec.ts create mode 100644 l2-bridge-mantle/src/clients/eth_provider_client.ts delete mode 100644 l2-bridge-mantle/src/clients/forta_guard_client.ts create mode 100644 l2-bridge-mantle/src/clients/mantle_provider.spec.ts create mode 100644 l2-bridge-mantle/src/services/bridge_balance.ts delete mode 100644 l2-bridge-mantle/tests/e2e/mantle_provider.spec.ts diff --git a/.github/workflows/test-l2-bridge-mantle.yml b/.github/workflows/test-l2-bridge-mantle.yml new file mode 100644 index 00000000..e1af66a8 --- /dev/null +++ b/.github/workflows/test-l2-bridge-mantle.yml @@ -0,0 +1,15 @@ +--- +name: Tests @ l2-bridge-mantle + +on: + workflow_dispatch: + pull_request: + paths: + - "l2-bridge-mantle/**" + +jobs: + tests: + uses: ./.github/workflows/_tests.yml + with: + path: ./l2-bridge-mantle + secrets: inherit diff --git a/l2-bridge-balance/src/agent-balance.ts b/l2-bridge-balance/src/agent-balance.ts index c9dcda06..eae9b890 100644 --- a/l2-bridge-balance/src/agent-balance.ts +++ b/l2-bridge-balance/src/agent-balance.ts @@ -46,11 +46,6 @@ export async function handleBlock(blockEvent: BlockEvent) { findings, BRIDGE_PARAMS_WSTETH.ZkSync, ), - handleBridgeBalanceWstETH( - blockEvent, - findings, - BRIDGE_PARAMS_WSTETH.Mantle, - ), handleBridgeBalanceLDO(blockEvent, findings, BRIDGE_PARAMS_LDO.Arbitrum), handleBridgeBalanceLDO(blockEvent, findings, BRIDGE_PARAMS_LDO.Optimism), diff --git a/l2-bridge-balance/src/config/bot-config.json b/l2-bridge-balance/src/config/bot-config.json index d1f67470..0046fb29 100644 --- a/l2-bridge-balance/src/config/bot-config.json +++ b/l2-bridge-balance/src/config/bot-config.json @@ -5,13 +5,7 @@ "Optimism": { "RpcUrl": "https://mainnet.optimism.io" }, - "Base": { - "RpcUrl": "https://mainnet.base.org" - }, "ZkSync": { "RpcUrl": "https://mainnet.era.zksync.io" - }, - "Mantle": { - "RpcUrl": "https://mantle.publicnode.com" } } diff --git a/l2-bridge-balance/src/constants.ts b/l2-bridge-balance/src/constants.ts index b2d2e6ac..99886eb9 100644 --- a/l2-bridge-balance/src/constants.ts +++ b/l2-bridge-balance/src/constants.ts @@ -21,7 +21,6 @@ export interface BridgeParamsWstETH { Arbitrum: BridgeParamWstETH; Optimism: BridgeParamWstETH; ZkSync: BridgeParamWstETH; - Mantle: BridgeParamWstETH; } export const BRIDGE_PARAMS_WSTETH: BridgeParamsWstETH = { @@ -43,12 +42,6 @@ export const BRIDGE_PARAMS_WSTETH: BridgeParamsWstETH = { wstEthBridged: "0x703b52F2b28fEbcB60E1372858AF5b18849FE867", rpcUrl: config.ZkSync.RpcUrl, }, - Mantle: { - name: "Mantle", - l1Gateway: "0x2D001d79E5aF5F65a939781FE228B267a8Ed468B", - wstEthBridged: "0x458ed78EB972a369799fb278c0243b25e5242A83", - rpcUrl: config.Mantle.RpcUrl, - }, }; export const LDO_ADDRESS = "0x5a98fcbea516cf06857215779fd812ca3bef1b32"; diff --git a/l2-bridge-mantle/README.md b/l2-bridge-mantle/README.md index a20a141b..6a745ab9 100644 --- a/l2-bridge-mantle/README.md +++ b/l2-bridge-mantle/README.md @@ -16,14 +16,15 @@ the cache. ## Alerts 1. Bridge events - 1. 🚨🚨🚨 Mantle L2 Bridge: Implementation initialized - 2. 🚨 Mantle L2 Bridge: Deposits Disabled - 3. 🚨 Mantle L2 Bridge: Role Admin changed - 4. 🚨 Mantle L2 Bridge: Withdrawals Disabled - 5. ⚠ī¸ Mantle L2 Bridge: Role granted - 6. ⚠ī¸ Mantle L2 Bridge: Role revoked - 7. ℹī¸ Mantle L2 Bridge: Deposits Enabled - 8. ℹī¸ Mantle L2 Bridge: Withdrawals Enabled + 1. 🚨🚨🚨 Mantle bridge balance mismatch 🚨🚨🚨 + 2. 🚨🚨🚨 Mantle L2 Bridge: Implementation initialized + 3. 🚨 Mantle L2 Bridge: Deposits Disabled + 4. 🚨 Mantle L2 Bridge: Role Admin changed + 5. 🚨 Mantle L2 Bridge: Withdrawals Disabled + 6. ⚠ī¸ Mantle L2 Bridge: Role granted + 7. ⚠ī¸ Mantle L2 Bridge: Role revoked + 8. ℹī¸ Mantle L2 Bridge: Deposits Enabled + 9. ℹī¸ Mantle L2 Bridge: Withdrawals Enabled 2. Gov Events 1. 🚨 Mantle Gov Bridge: Ethereum Governance Executor Updated 2. 🚨 Mantle Gov Bridge: Guardian Updated @@ -55,13 +56,5 @@ yarn install Running in a live mode: ``` -yarn start:dev -``` - -Testing on a specific block/range/transaction: - -``` -yarn block 13626668 -yarn range '13626667..13626668' -yarn tx 0x2d2774c04e3faf9f17cd26e0978bb812081b9d0b5cc6fd8bf04cc441f92c0a8c +yarn start ``` diff --git a/l2-bridge-mantle/package.json b/l2-bridge-mantle/package.json index 50f0bc2c..59a5a023 100644 --- a/l2-bridge-mantle/package.json +++ b/l2-bridge-mantle/package.json @@ -45,10 +45,10 @@ "stake": "forta-agent stake", "test": "jest", "generate-types": "typechain --target=ethers-v5 --out-dir=./src/generated ./src/abi/*", - "eslint:lint": "eslint ./src ./tests", - "eslint:format": "eslint ./src ./tests --fix", - "prettier:check": "prettier --check ./src ./tests", - "prettier:format": "prettier --write ./src ./tests", + "eslint:lint": "eslint ./src", + "eslint:format": "eslint ./src --fix", + "prettier:check": "prettier --check ./src", + "prettier:format": "prettier --write ./src", "lint": "yarn run prettier:check && yarn run eslint:lint", "format": "yarn run eslint:format && yarn run prettier:format", "postinstall": "yarn generate-types" diff --git a/l2-bridge-mantle/src/abi/ERC20Short.json b/l2-bridge-mantle/src/abi/ERC20Short.json new file mode 100644 index 00000000..81b8dd00 --- /dev/null +++ b/l2-bridge-mantle/src/abi/ERC20Short.json @@ -0,0 +1,34 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/l2-bridge-mantle/src/agent.spec.ts b/l2-bridge-mantle/src/agent.spec.ts new file mode 100644 index 00000000..01f0a623 --- /dev/null +++ b/l2-bridge-mantle/src/agent.spec.ts @@ -0,0 +1,64 @@ +import { App } from './app' +import * as E from 'fp-ts/Either' +import { Finding } from 'forta-agent' +import BigNumber from 'bignumber.js' + +describe('agent-mantle functional test', () => { + test('should process app on 62_394_250 and 62_394_300 (50 l2 blocks)', async () => { + const app = await App.getInstance() + + const l1Block = 19_639_035 + const l2StartBlock = 62_394_250 + const l2EndBlock = 62_394_300 + const l2BlocksDto = await app.mantleClient.fetchL2Blocks(l2StartBlock, l2EndBlock) + + for (const proxyWatcher of app.proxyWatchers) { + const err = await proxyWatcher.initialize(l2StartBlock) + if (err !== null) { + throw null + } + } + + const monitorWithdrawalsInitResp = await app.monitorWithdrawals.initialize(l2StartBlock) + if (E.isLeft(monitorWithdrawalsInitResp)) { + throw monitorWithdrawalsInitResp.left + } + + const l2logs = await app.blockSrv.getL2Logs(l2BlocksDto) + if (E.isLeft(l2logs)) { + throw l2logs.left + } + + const l2BlockNumberSet: Set = new Set() + for (const l2log of l2logs.right) { + l2BlockNumberSet.add(new BigNumber(l2log.blockNumber, 10).toNumber()) + } + + const bridgeEventFindings = app.bridgeWatcher.handleL2Logs(l2logs.right) + const govEventFindings = app.govWatcher.handleL2Logs(l2logs.right) + const proxyAdminEventFindings = app.proxyEventWatcher.handleL2Logs(l2logs.right) + const monitorWithdrawalsFindings = app.monitorWithdrawals.handleL2Blocks(l2logs.right, l2BlocksDto) + const proxyWatcherFindings: Finding[] = [] + + const l2BlockNumbers = Array.from(l2BlockNumberSet).toSorted((a, b) => a - b) + + for (const proxyWatcher of app.proxyWatchers) { + const fnds = await proxyWatcher.handleL2Blocks(l2BlockNumbers) + proxyWatcherFindings.push(...fnds) + } + + const bridgeBalanceFindings = await app.bridgeBalanceSrv.handleBlock(l1Block, l2BlockNumbers) + + const findings: Finding[] = [] + findings.push( + ...bridgeEventFindings, + ...govEventFindings, + ...proxyAdminEventFindings, + ...monitorWithdrawalsFindings, + ...proxyWatcherFindings, + ...bridgeBalanceFindings, + ) + + expect(findings.length).toEqual(0) + }, 360_000) +}) diff --git a/l2-bridge-mantle/src/agent.ts b/l2-bridge-mantle/src/agent.ts index 7c52d6b8..7643b0dd 100644 --- a/l2-bridge-mantle/src/agent.ts +++ b/l2-bridge-mantle/src/agent.ts @@ -19,38 +19,43 @@ export function initialize(): Initialize { return async function (): Promise { const app = await App.getInstance() - const latestBlock = await app.mantleClient.getLatestBlock() - if (E.isLeft(latestBlock)) { - app.logger.error(latestBlock.left) - + const latestL2Block = await app.mantleClient.getLatestL2Block() + if (E.isLeft(latestL2Block)) { + app.logger.error(latestL2Block.left) process.exit(1) } - const agentMeta = await app.proxyWatcher.initialize(latestBlock.right.number) - if (E.isLeft(agentMeta)) { - app.logger.error(agentMeta.left) + const agents: string[] = [] + for (const proxyWatcher of app.proxyWatchers) { + const proxyWatcherErr = await proxyWatcher.initialize(latestL2Block.right.number) + if (proxyWatcherErr !== null) { + app.logger.error(proxyWatcherErr) + process.exit(1) + } - process.exit(1) + metadata[`${proxyWatcher.getName()}.lastAdmin`] = proxyWatcher.getAdmin() + metadata[`${proxyWatcher.getName()}.lastImpl`] = proxyWatcher.getImpl() + + agents.push(proxyWatcher.getName()) } - const monitorWithdrawalsInitResp = await app.monitorWithdrawals.initialize(latestBlock.right.number) + const monitorWithdrawalsInitResp = await app.monitorWithdrawals.initialize(latestL2Block.right.number) if (E.isLeft(monitorWithdrawalsInitResp)) { app.logger.error(monitorWithdrawalsInitResp.left) process.exit(1) } - metadata[`${app.proxyWatcher.getName()}.lastAdmins`] = agentMeta.right.lastAdmins - metadata[`${app.proxyWatcher.getName()}.lastImpls`] = agentMeta.right.lastImpls metadata[`${app.monitorWithdrawals.getName()}.currentWithdrawals`] = monitorWithdrawalsInitResp.right.currentWithdrawals - const agents: string[] = [app.proxyWatcher.getName(), app.monitorWithdrawals.getName()] + agents.push(app.monitorWithdrawals.getName()) + metadata.agents = '[' + agents.toString() + ']' await app.findingsRW.write([ Finding.fromObject({ - name: 'Agent launched', + name: `Agent launched`, description: `Version: ${VERSION.desc}`, alertId: 'LIDO-AGENT-LAUNCHED', severity: FindingSeverity.Info, @@ -80,34 +85,42 @@ export const handleBlock = (): HandleBlock => { findings.push(...findingsAsync) } - const blocksDto = await app.blockSrv.getBlocks() - if (E.isLeft(blocksDto)) { + const l2blocksDto = await app.blockSrv.getL2Blocks() + if (E.isLeft(l2blocksDto)) { isHandleBLockRunning = false - return [blocksDto.left] + return [l2blocksDto.left] } app.logger.info( - `ETH block ${blockEvent.blockNumber.toString()}. Fetched mantle blocks from ${blocksDto.right[0].number} to ${ - blocksDto.right[blocksDto.right.length - 1].number - }. Total: ${blocksDto.right.length}`, + `ETH block ${blockEvent.blockNumber.toString()}. Fetched mantle blocks from ${l2blocksDto.right[0].number} to ${ + l2blocksDto.right[l2blocksDto.right.length - 1].number + }. Total: ${l2blocksDto.right.length}`, ) - const logs = await app.blockSrv.getLogs(blocksDto.right) - if (E.isLeft(logs)) { + const l2logs = await app.blockSrv.getL2Logs(l2blocksDto.right) + if (E.isLeft(l2logs)) { isHandleBLockRunning = false - return [logs.left] + return [l2logs.left] + } + + const bridgeEventFindings = app.bridgeWatcher.handleL2Logs(l2logs.right) + const govEventFindings = app.govWatcher.handleL2Logs(l2logs.right) + const proxyAdminEventFindings = app.proxyEventWatcher.handleL2Logs(l2logs.right) + const monitorWithdrawalsFindings = app.monitorWithdrawals.handleL2Blocks(l2logs.right, l2blocksDto.right) + + const l2BlockNumberSet: Set = new Set() + for (const l2log of l2logs.right) { + l2BlockNumberSet.add(new BigNumber(l2log.blockNumber, 10).toNumber()) } - const bridgeEventFindings = app.bridgeWatcher.handleLogs(logs.right) - const govEventFindings = app.govWatcher.handleLogs(logs.right) - const proxyAdminEventFindings = app.proxyEventWatcher.handleLogs(logs.right) - const monitorWithdrawalsFindings = app.monitorWithdrawals.handleBlocks(logs.right, blocksDto.right) + const l2BlockNumbers = Array.from(l2BlockNumberSet).toSorted((a, b) => a - b) + const proxyWatcherFindings: Finding[] = [] - const blockNumbers: Set = new Set() - for (const log of logs.right) { - blockNumbers.add(new BigNumber(log.blockNumber, 10).toNumber()) + for (const proxyWatcher of app.proxyWatchers) { + const fnds = await proxyWatcher.handleL2Blocks(l2BlockNumbers) + proxyWatcherFindings.push(...fnds) } - const proxyWatcherFindings = await app.proxyWatcher.handleBlocks(Array.from(blockNumbers)) + const bridgeBalanceFindings = await app.bridgeBalanceSrv.handleBlock(blockEvent.block.number, l2BlockNumbers) findings.push( ...bridgeEventFindings, @@ -115,6 +128,7 @@ export const handleBlock = (): HandleBlock => { ...proxyAdminEventFindings, ...monitorWithdrawalsFindings, ...proxyWatcherFindings, + ...bridgeBalanceFindings, ) app.logger.info(elapsedTime('handleBlock', startTime) + '\n') diff --git a/l2-bridge-mantle/src/app.ts b/l2-bridge-mantle/src/app.ts index 98b551b0..0b5e73a1 100644 --- a/l2-bridge-mantle/src/app.ts +++ b/l2-bridge-mantle/src/app.ts @@ -1,10 +1,9 @@ -import { FortaGuardClient } from './clients/forta_guard_client' -import { ethers, Finding } from 'forta-agent' -import { IMantleProvider, MantleProvider } from './clients/mantle_provider' +import { Finding, getJsonRpcUrl } from 'forta-agent' +import { MantleClient } from './clients/mantle_provider' import { EventWatcher } from './services/event_watcher' import { getProxyAdminEvents } from './utils/events/proxy_admin_events' import { ProxyContractClient } from './clients/proxy_contract_client' -import { L2ERC20TokenBridge__factory, OssifiableProxy__factory } from './generated' +import { ERC20Short__factory, L2ERC20TokenBridge__factory, OssifiableProxy__factory } from './generated' import { MantleBlockClient } from './clients/mantle_block_client' import { ProxyWatcher } from './services/proxy_watcher' import { MonitorWithdrawals } from './services/monitor_withdrawals' @@ -14,13 +13,18 @@ import { getBridgeEvents } from './utils/events/bridge_events' import { getGovEvents } from './utils/events/gov_events' import { Address } from './utils/constants' import { Logger } from 'winston' +import { ethers } from 'ethers' +import { BridgeBalanceSrv } from './services/bridge_balance' +import { ETHProvider } from './clients/eth_provider_client' export type Container = { - mantleClient: IMantleProvider - proxyWatcher: ProxyWatcher + ethClient: ETHProvider + mantleClient: MantleClient + proxyWatchers: ProxyWatcher[] monitorWithdrawals: MonitorWithdrawals blockSrv: MantleBlockClient bridgeWatcher: EventWatcher + bridgeBalanceSrv: BridgeBalanceSrv govWatcher: EventWatcher proxyEventWatcher: EventWatcher findingsRW: DataRW @@ -40,51 +44,74 @@ export class App { }) const adr: Address = Address - const mantleRpcURL = FortaGuardClient.getSecret() + const mantleRpcURL = 'https://rpc.mantle.xyz' const baseNetworkID = 5000 - const nodeClient = new ethers.providers.JsonRpcProvider(mantleRpcURL, baseNetworkID) + const mantleProvider = new ethers.providers.JsonRpcProvider(mantleRpcURL, baseNetworkID) - const l2Bridge = L2ERC20TokenBridge__factory.connect(adr.L2_ERC20_TOKEN_GATEWAY.hash, nodeClient) - - const mantleClient = new MantleProvider(nodeClient, logger, l2Bridge) + const l2Bridge = L2ERC20TokenBridge__factory.connect(adr.MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS, mantleProvider) + const bridgedWSthEthRunner = ERC20Short__factory.connect(adr.MANTLE_WSTETH_ADDRESS, mantleProvider) + const mantleClient = new MantleClient(mantleProvider, logger, l2Bridge, bridgedWSthEthRunner) const bridgeEventWatcher = new EventWatcher( 'BridgeEventWatcher', - getBridgeEvents(adr.L2_ERC20_TOKEN_GATEWAY_ADDRESS, adr.RolesMap), + getBridgeEvents(adr.MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS, adr.RolesMap), logger, ) - const govEventWatcher = new EventWatcher('GovEventWatcher', getGovEvents(adr.GOV_BRIDGE_ADDRESS), logger) + const govEventWatcher = new EventWatcher('GovEventWatcher', getGovEvents(adr.MANTLE_GOV_EXECUTOR_ADDRESS), logger) const proxyEventWatcher = new EventWatcher( 'ProxyEventWatcher', - getProxyAdminEvents(adr.MANTLE_WST_ETH_BRIDGED, adr.L2_ERC20_TOKEN_GATEWAY), + getProxyAdminEvents(adr.MANTLE_WSTETH_BRIDGED, adr.MANTLE_L2ERC20_TOKEN_BRIDGED), logger, ) - const LIDO_PROXY_CONTRACTS: ProxyContractClient[] = [ - new ProxyContractClient( - adr.L2_ERC20_TOKEN_GATEWAY.name, - adr.L2_ERC20_TOKEN_GATEWAY.hash, - OssifiableProxy__factory.connect(adr.L2_ERC20_TOKEN_GATEWAY.hash, nodeClient), + const blockSrv: MantleBlockClient = new MantleBlockClient(mantleClient, logger) + + const proxyWatchers: ProxyWatcher[] = [ + new ProxyWatcher( + new ProxyContractClient( + adr.MANTLE_L2ERC20_TOKEN_BRIDGED.name, + adr.MANTLE_L2ERC20_TOKEN_BRIDGED.address, + OssifiableProxy__factory.connect(adr.MANTLE_L2ERC20_TOKEN_BRIDGED.address, mantleProvider), + ), + logger, ), - new ProxyContractClient( - adr.MANTLE_WST_ETH_BRIDGED.name, - adr.MANTLE_WST_ETH_BRIDGED.hash, - OssifiableProxy__factory.connect(adr.MANTLE_WST_ETH_BRIDGED.hash, nodeClient), + new ProxyWatcher( + new ProxyContractClient( + adr.MANTLE_WSTETH_BRIDGED.name, + adr.MANTLE_WSTETH_BRIDGED.address, + OssifiableProxy__factory.connect(adr.MANTLE_WSTETH_BRIDGED.address, mantleProvider), + ), + logger, ), ] - const blockSrv: MantleBlockClient = new MantleBlockClient(mantleClient, logger) - const proxyWorker: ProxyWatcher = new ProxyWatcher(LIDO_PROXY_CONTRACTS, logger) + const monitorWithdrawals = new MonitorWithdrawals(mantleClient, adr.MANTLE_L2ERC20_TOKEN_BRIDGED.address, logger) - const monitorWithdrawals = new MonitorWithdrawals(mantleClient, adr.L2_ERC20_TOKEN_GATEWAY.hash, logger) + const mainnet = 1 + const drpcUrl = 'https://eth.drpc.org/' + const ethProvider = new ethers.providers.FallbackProvider([ + new ethers.providers.JsonRpcProvider(getJsonRpcUrl(), mainnet), + new ethers.providers.JsonRpcProvider(drpcUrl, mainnet), + ]) + + const wSthEthRunner = ERC20Short__factory.connect(adr.L1_WSTETH_ADDRESS, ethProvider) + const ethClient = new ETHProvider(logger, wSthEthRunner) + const bridgeBalanceSrv = new BridgeBalanceSrv( + logger, + ethClient, + adr.MANTLE_L1ERC20_TOKEN_BRIDGE_ADDRESS, + mantleClient, + ) App.instance = { + ethClient: ethClient, mantleClient: mantleClient, - proxyWatcher: proxyWorker, + proxyWatchers: proxyWatchers, monitorWithdrawals: monitorWithdrawals, blockSrv: blockSrv, bridgeWatcher: bridgeEventWatcher, + bridgeBalanceSrv: bridgeBalanceSrv, govWatcher: govEventWatcher, proxyEventWatcher: proxyEventWatcher, findingsRW: new DataRW([]), diff --git a/l2-bridge-mantle/src/clients/eth_provider.spec.ts b/l2-bridge-mantle/src/clients/eth_provider.spec.ts new file mode 100644 index 00000000..cccd40c0 --- /dev/null +++ b/l2-bridge-mantle/src/clients/eth_provider.spec.ts @@ -0,0 +1,19 @@ +import { App } from '../app' +import * as E from 'fp-ts/Either' +import { Address, ETH_DECIMALS } from '../utils/constants' +import BigNumber from 'bignumber.js' + +describe('eth provider tests', () => { + test('getBalanceByBlockHash is 10.151583036279178025 wsETH', async () => { + const app = await App.getInstance() + const adr = Address + + const blockNumber = 19_619_102 + const balance = await app.ethClient.getWstEthBalance(blockNumber, adr.MANTLE_L1ERC20_TOKEN_BRIDGE_ADDRESS) + if (E.isLeft(balance)) { + throw balance.left + } + + expect(balance.right.dividedBy(ETH_DECIMALS)).toEqual(new BigNumber('10.151583036279178025')) + }, 120_000) +}) diff --git a/l2-bridge-mantle/src/clients/eth_provider_client.ts b/l2-bridge-mantle/src/clients/eth_provider_client.ts new file mode 100644 index 00000000..b0a214cf --- /dev/null +++ b/l2-bridge-mantle/src/clients/eth_provider_client.ts @@ -0,0 +1,39 @@ +import { Logger } from 'winston' +import { IL1BridgeBalanceClient } from '../services/bridge_balance' +import * as E from 'fp-ts/Either' +import BigNumber from 'bignumber.js' +import { NetworkError } from '../utils/error' +import { retryAsync } from 'ts-retry' +import { ERC20Short as wStEthRunner } from '../generated' + +const DELAY_IN_500MS = 500 +const ATTEMPTS_5 = 5 + +export class ETHProvider implements IL1BridgeBalanceClient { + private readonly wStEthRunner: wStEthRunner + private readonly logger: Logger + + constructor(logger: Logger, wStEthRunner: wStEthRunner) { + this.wStEthRunner = wStEthRunner + this.logger = logger + } + + public async getWstEthBalance(l1blockNumber: number, address: string): Promise> { + try { + const out = await retryAsync( + async (): Promise => { + const [balance] = await this.wStEthRunner.functions.balanceOf(address, { + blockTag: l1blockNumber, + }) + + return balance.toString() + }, + { delay: DELAY_IN_500MS, maxTry: ATTEMPTS_5 }, + ) + + return E.right(new BigNumber(out)) + } catch (e) { + return E.left(new NetworkError(e, `Could not call wStEthRunner.functions.balanceOf`)) + } + } +} diff --git a/l2-bridge-mantle/src/clients/forta_guard_client.ts b/l2-bridge-mantle/src/clients/forta_guard_client.ts deleted file mode 100644 index e8150c6d..00000000 --- a/l2-bridge-mantle/src/clients/forta_guard_client.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { fetchJwt } from 'forta-agent' -import { verifyJwt } from 'forta-agent/dist/sdk/jwt' -import * as E from 'fp-ts/Either' - -export class FortaGuardClient { - private fortaGuardURL: string = 'http://127.0.0.1/secret' - private readonly verifyJwt: boolean - - constructor(verifyJwt: boolean) { - this.verifyJwt = verifyJwt - } - - public static getSecret(): string { - return Buffer.from('aHR0cHM6Ly9ycGMubWFudGxlLnh5eg==', 'base64').toString('utf-8') - } - - public async getSecret(key: string): Promise> { - let token: string - try { - token = await fetchJwt({}) - } catch (e) { - return E.left(new Error(`Could not fetch jwt. cause ${e}`)) - } - - if (this.verifyJwt) { - try { - const isTokenOk = await verifyJwt(token) - if (!isTokenOk) { - return E.left(new Error(`Token verification failed`)) - } - } catch (e) { - return E.left(new Error(`Token verification failed`)) - } - } - - try { - const response = await fetch(this.fortaGuardURL + '/' + key, { - method: 'GET', - headers: { - Authorization: 'Bearer ' + token, - }, - }) - - if (!response.ok) { - return E.left(new Error(`Could not fetch secret, status: ${response.status}`)) - } - const out = await response.text() - - return E.right(out) - } catch (e) { - return E.left(new Error(`Could not fetch secret, cause: ${e}`)) - } - } -} diff --git a/l2-bridge-mantle/src/clients/mantle_block_client.ts b/l2-bridge-mantle/src/clients/mantle_block_client.ts index a09727c9..41eda185 100644 --- a/l2-bridge-mantle/src/clients/mantle_block_client.ts +++ b/l2-bridge-mantle/src/clients/mantle_block_client.ts @@ -1,5 +1,5 @@ -import { BlockDto } from 'src/entity/blockDto' -import { IMantleProvider } from './mantle_provider' +import { BlockDto } from '../entity/blockDto' +import { IMantleClient } from './mantle_provider' import { Log } from '@ethersproject/abstract-provider' import { Finding } from 'forta-agent' import * as E from 'fp-ts/Either' @@ -8,27 +8,27 @@ import { Logger } from 'winston' import { elapsedTime } from '../utils/time' export class MantleBlockClient { - private mantleProvider: IMantleProvider + private mantleProvider: IMantleClient private logger: Logger private cachedBlockDto: BlockDto | undefined = undefined - constructor(provider: IMantleProvider, logger: Logger) { + constructor(provider: IMantleClient, logger: Logger) { this.mantleProvider = provider this.logger = logger } - public async getBlocks(): Promise> { + public async getL2Blocks(): Promise> { const start = new Date().getTime() const blocks = await this.fetchBlocks() - this.logger.info(elapsedTime(MantleBlockClient.name + '.' + this.getBlocks.name, start)) + this.logger.info(elapsedTime(MantleBlockClient.name + '.' + this.getL2Blocks.name, start)) return blocks } - public async getLogs(workingBlocks: BlockDto[]): Promise> { + public async getL2Logs(workingBlocks: BlockDto[]): Promise> { const start = new Date().getTime() const logs = await this.fetchLogs(workingBlocks) - this.logger.info(elapsedTime(MantleBlockClient.name + '.' + this.getLogs.name, start)) + this.logger.info(elapsedTime(MantleBlockClient.name + '.' + this.getL2Logs.name, start)) return logs } @@ -37,12 +37,12 @@ export class MantleBlockClient { const out: BlockDto[] = [] if (this.cachedBlockDto === undefined) { - const block = await this.mantleProvider.getLatestBlock() + const block = await this.mantleProvider.getLatestL2Block() if (E.isLeft(block)) { return E.left( networkAlert( block.left, - `Error in ${MantleBlockClient.name}.${this.getBlocks.name}:21`, + `Error in ${MantleBlockClient.name}.${this.getL2Blocks.name}:21`, `Could not call mantleProvider.getLatestBlock`, 0, ), @@ -56,20 +56,20 @@ export class MantleBlockClient { out.push(this.cachedBlockDto) } else { - const latestBlock = await this.mantleProvider.getLatestBlock() + const latestBlock = await this.mantleProvider.getLatestL2Block() if (E.isLeft(latestBlock)) { this.cachedBlockDto = undefined return E.left( networkAlert( latestBlock.left, - `Error in ${MantleBlockClient.name}.${this.getBlocks.name}:39`, + `Error in ${MantleBlockClient.name}.${this.getL2Blocks.name}:39`, `Could not call mantleProvider.getLatestBlock`, 0, ), ) } - const blocks = await this.mantleProvider.fetchBlocks(this.cachedBlockDto.number, latestBlock.right.number - 1) + const blocks = await this.mantleProvider.fetchL2Blocks(this.cachedBlockDto.number, latestBlock.right.number - 1) for (const block of blocks) { out.push({ number: block.number, @@ -102,7 +102,7 @@ export class MantleBlockClient { return E.left( networkAlert( logs.left, - `Error in ${MantleBlockClient.name}.${this.getLogs.name}:76`, + `Error in ${MantleBlockClient.name}.${this.getL2Logs.name}:76`, `Could not call mantleProvider.getLogs`, workingBlocks[workingBlocks.length - 1].number, ), diff --git a/l2-bridge-mantle/src/clients/mantle_provider.spec.ts b/l2-bridge-mantle/src/clients/mantle_provider.spec.ts new file mode 100644 index 00000000..3624f2fa --- /dev/null +++ b/l2-bridge-mantle/src/clients/mantle_provider.spec.ts @@ -0,0 +1,28 @@ +import { App } from '../app' +import BigNumber from 'bignumber.js' +import { ETH_DECIMALS } from '../utils/constants' +import * as E from 'fp-ts/Either' + +describe('MantleProvider', () => { + test('fetchBlocks', async () => { + const app = await App.getInstance() + + const start = 50_183_000 + const end = 50_184_000 + const blocks = await app.mantleClient.fetchL2Blocks(start, end) + + expect(blocks.length).toEqual(end - start + 1) + }, 120_000) + + test('getWstEthTotalSupply is 9.860230303930711579 wsETH', async () => { + const app = await App.getInstance() + + const baseBlockNumber = 62_393_461 + const balance = await app.mantleClient.getWstEthTotalSupply(baseBlockNumber) + if (E.isLeft(balance)) { + throw balance.left + } + + expect(balance.right.dividedBy(ETH_DECIMALS)).toEqual(new BigNumber('9.860230303930711579')) + }, 120_000) +}) diff --git a/l2-bridge-mantle/src/clients/mantle_provider.ts b/l2-bridge-mantle/src/clients/mantle_provider.ts index 7dc1aae7..7dd94c00 100644 --- a/l2-bridge-mantle/src/clients/mantle_provider.ts +++ b/l2-bridge-mantle/src/clients/mantle_provider.ts @@ -8,6 +8,8 @@ import { L2ERC20TokenBridge } from '../generated' import { WithdrawalInitiatedEvent } from '../generated/L2ERC20TokenBridge' import { WithdrawalRecord } from '../entity/blockDto' import BigNumber from 'bignumber.js' +import { IL2BridgeBalanceClient } from '../services/bridge_balance' +import { ERC20Short as BridgedWstEthRunner } from '../generated' export abstract class IMonitorWithdrawalsClient { public abstract getWithdrawalEvents( @@ -20,34 +22,37 @@ export abstract class IMonitorWithdrawalsClient { ): Promise> } -export abstract class IMantleProvider { - public abstract fetchBlocks(startBlock: number, endBlock: number): Promise +export abstract class IMantleClient { + public abstract fetchL2Blocks(startBlock: number, endBlock: number): Promise public abstract getLogs(startBlock: number, endBlock: number): Promise> - public abstract getLatestBlock(): Promise> + public abstract getLatestL2Block(): Promise> public abstract getTransaction(txHash: string): Promise> public abstract getBlockNumber(): Promise> } -export class MantleProvider implements IMantleProvider, IMonitorWithdrawalsClient { +export class MantleClient implements IMantleClient, IMonitorWithdrawalsClient, IL2BridgeBalanceClient { private readonly logger: Logger private readonly jsonRpcProvider: ethers.providers.JsonRpcProvider private readonly L2ERC20TokenBridge: L2ERC20TokenBridge + private readonly bridgedWstEthRunner: BridgedWstEthRunner constructor( jsonRpcProvider: ethers.providers.JsonRpcProvider, logger: Logger, L2ERC20TokenBridge: L2ERC20TokenBridge, + bridgedWstEthRunner: BridgedWstEthRunner, ) { this.jsonRpcProvider = jsonRpcProvider this.logger = logger this.L2ERC20TokenBridge = L2ERC20TokenBridge + this.bridgedWstEthRunner = bridgedWstEthRunner } - public async fetchBlocks(startBlock: number, endBlock: number): Promise { + public async fetchL2Blocks(startBlock: number, endBlock: number): Promise { const batchRequests = [] for (let i = startBlock; i <= endBlock; i++) { batchRequests.push({ @@ -152,7 +157,7 @@ export class MantleProvider implements IMantleProvider, IMonitorWithdrawalsClien return E.right(logs) } - public async getLatestBlock(): Promise> { + public async getLatestL2Block(): Promise> { try { const out = await retryAsync( async (): Promise => { @@ -246,7 +251,7 @@ export class MantleProvider implements IMantleProvider, IMonitorWithdrawalsClien ) const record: WithdrawalRecord = { - time: block.timestamp, + timestamp: block.timestamp, amount: new BigNumber(String(withdrawEvent.args._amount)), } @@ -259,4 +264,23 @@ export class MantleProvider implements IMantleProvider, IMonitorWithdrawalsClien return E.right(out) } + + public async getWstEthTotalSupply(l2blockNumber: number): Promise> { + try { + const out = await retryAsync( + async (): Promise => { + const [balance] = await this.bridgedWstEthRunner.functions.totalSupply({ + blockTag: l2blockNumber, + }) + + return balance.toString() + }, + { delay: 500, maxTry: 5 }, + ) + + return E.right(new BigNumber(out)) + } catch (e) { + return E.left(new NetworkError(e, `Could not call bridgedWstEthRunner.functions.totalSupply`)) + } + } } diff --git a/l2-bridge-mantle/src/entity/blockDto.ts b/l2-bridge-mantle/src/entity/blockDto.ts index b7aec27c..55e099bf 100644 --- a/l2-bridge-mantle/src/entity/blockDto.ts +++ b/l2-bridge-mantle/src/entity/blockDto.ts @@ -6,6 +6,6 @@ export type BlockDto = { } export type WithdrawalRecord = { - time: number + timestamp: number amount: BigNumber } diff --git a/l2-bridge-mantle/src/services/bridge_balance.ts b/l2-bridge-mantle/src/services/bridge_balance.ts new file mode 100644 index 00000000..ec31bd06 --- /dev/null +++ b/l2-bridge-mantle/src/services/bridge_balance.ts @@ -0,0 +1,98 @@ +import { Finding, FindingSeverity, FindingType } from 'forta-agent' +import { elapsedTime } from '../utils/time' +import { Logger } from 'winston' +import BigNumber from 'bignumber.js' +import * as E from 'fp-ts/Either' +import { getUniqueKey, networkAlert } from '../utils/finding.helpers' +import { ETH_DECIMALS } from '../utils/constants' + +export abstract class IL1BridgeBalanceClient { + abstract getWstEthBalance(l1blockNumber: number, address: string): Promise> +} + +export abstract class IL2BridgeBalanceClient { + abstract getWstEthTotalSupply(l1blockNumber: number): Promise> +} + +export class BridgeBalanceSrv { + private name = `BridgeBalanceSrv` + private readonly logger: Logger + private readonly clientL1: IL1BridgeBalanceClient + private readonly clientL2: IL2BridgeBalanceClient + + private readonly baseL1TokenBridge: string + + constructor( + logger: Logger, + clientL1: IL1BridgeBalanceClient, + baseL1TokenBridge: string, + clientL2: IL2BridgeBalanceClient, + ) { + this.logger = logger + this.clientL1 = clientL1 + this.clientL2 = clientL2 + this.baseL1TokenBridge = baseL1TokenBridge + } + + async handleBlock(l1BlockNumber: number, l2BlockNumbers: number[]): Promise { + const start = new Date().getTime() + + const findings = await this.handleBridgeBalanceWstETH(l1BlockNumber, l2BlockNumbers) + + this.logger.info(elapsedTime(this.name + '.' + this.handleBlock.name, start)) + return findings + } + + private async handleBridgeBalanceWstETH(l1BlockNumber: number, l2BlockNumbers: number[]): Promise { + const wstETHBalance_onL1MantleBridge = await this.clientL1.getWstEthBalance(l1BlockNumber, this.baseL1TokenBridge) + + const out: Finding[] = [] + if (E.isLeft(wstETHBalance_onL1MantleBridge)) { + return [ + networkAlert( + wstETHBalance_onL1MantleBridge.left, + `Error in ${BridgeBalanceSrv.name}.${this.handleBridgeBalanceWstETH.name}:36`, + `Could not call clientL1.getWstEth`, + l1BlockNumber, + ), + ] + } + + for (const l2blockNumber of l2BlockNumbers) { + const wstETHTotalSupply_onMantle = await this.clientL2.getWstEthTotalSupply(l2blockNumber) + + if (E.isLeft(wstETHTotalSupply_onMantle)) { + out.push( + networkAlert( + wstETHTotalSupply_onMantle.left, + `Error in ${BridgeBalanceSrv.name}.${this.handleBridgeBalanceWstETH.name}:62`, + `Could not call clientL2.getWstEth`, + l2blockNumber, + ), + ) + + continue + } + + if (wstETHTotalSupply_onMantle.right.isGreaterThan(wstETHBalance_onL1MantleBridge.right)) { + out.push( + Finding.fromObject({ + name: `🚨🚨🚨 Mantle bridge balance mismatch 🚨🚨🚨`, + description: + `Total supply of bridged wstETH is greater than balanceOf L1 bridge side!\n` + + `L2 total supply: ${wstETHTotalSupply_onMantle.right.dividedBy(ETH_DECIMALS).toFixed(2)}\n` + + `L1 balanceOf: ${wstETHBalance_onL1MantleBridge.right.dividedBy(ETH_DECIMALS).toFixed(2)}\n\n` + + `ETH: ${l1BlockNumber}\n` + + `Mantle: ${l2blockNumber}\n`, + alertId: 'BRIDGE-BALANCE-MISMATCH', + severity: FindingSeverity.Critical, + type: FindingType.Suspicious, + uniqueKey: getUniqueKey('ac6b4e21-9f3f-4434-ab7a-52a0d98624d3', l1BlockNumber + l2blockNumber), + }), + ) + } + } + + return out + } +} diff --git a/l2-bridge-mantle/src/services/event_watcher.ts b/l2-bridge-mantle/src/services/event_watcher.ts index 19f656af..b3a8e403 100644 --- a/l2-bridge-mantle/src/services/event_watcher.ts +++ b/l2-bridge-mantle/src/services/event_watcher.ts @@ -20,19 +20,19 @@ export class EventWatcher { return this.name } - public handleLogs(logs: Log[]): Finding[] { + public handleL2Logs(l2logs: Log[]): Finding[] { const start = new Date().getTime() const addresses: string[] = [] - for (const log of logs) { - addresses.push(log.address) + for (const l2log of l2logs) { + addresses.push(l2log.address) } const findings: Finding[] = [] for (const eventToFinding of this.eventsToFinding) { const ind = addresses.indexOf(eventToFinding.address) if (ind >= 0) { - const filteredEvents = filterLog(logs, eventToFinding.event, eventToFinding.address) + const filteredEvents = filterLog(l2logs, eventToFinding.event, eventToFinding.address) for (const event of filteredEvents) { findings.push( @@ -43,14 +43,14 @@ export class EventWatcher { severity: eventToFinding.severity, type: eventToFinding.type, metadata: { args: String(event.args) }, - uniqueKey: getUniqueKey(eventToFinding.uniqueKey, logs[ind].blockNumber), + uniqueKey: getUniqueKey(eventToFinding.uniqueKey, l2logs[ind].blockNumber), }), ) } } } - this.logger.info(elapsedTime(this.getName() + '.' + this.handleLogs.name, start)) + this.logger.info(elapsedTime(this.getName() + '.' + this.handleL2Logs.name, start)) return findings } } diff --git a/l2-bridge-mantle/src/services/monitor_withdrawals.ts b/l2-bridge-mantle/src/services/monitor_withdrawals.ts index 0568b1df..30db225e 100644 --- a/l2-bridge-mantle/src/services/monitor_withdrawals.ts +++ b/l2-bridge-mantle/src/services/monitor_withdrawals.ts @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js' import { filterLog, Finding, FindingSeverity, FindingType } from 'forta-agent' -import { BlockDto, WithdrawalRecord } from 'src/entity/blockDto' +import { BlockDto, WithdrawalRecord } from '../entity/blockDto' import { Log } from '@ethersproject/abstract-provider' import * as E from 'fp-ts/Either' import { IMonitorWithdrawalsClient } from '../clients/mantle_provider' @@ -11,12 +11,13 @@ import { getUniqueKey } from '../utils/finding.helpers' const ETH_DECIMALS = new BigNumber(10).pow(18) // 10k wstETH -const MAX_WITHDRAWALS_SUM = 10000 +const MAX_WITHDRAWALS_10K_WstEth = 10_000 export type MonitorWithdrawalsInitResp = { currentWithdrawals: string } -export const MAX_WITHDRAWALS_WINDOW = 60 * 60 * 24 * 2 +const HOURS_48 = 60 * 60 * 24 * 2 +const AVG_BLOCK_TIME_2SECONDS: number = 2 //s export class MonitorWithdrawals { private readonly name: string = 'WithdrawalsMonitor' @@ -27,8 +28,8 @@ export class MonitorWithdrawals { private readonly l2Erc20TokenGatewayAddress: string private readonly withdrawalsClient: IMonitorWithdrawalsClient - private withdrawalsCache: WithdrawalRecord[] = [] - private lastReportedToManyWithdrawals = 0 + private withdrawalStore: WithdrawalRecord[] = [] + private toManyWithdrawalsTimestamp = 0 constructor(withdrawalsClient: IMonitorWithdrawalsClient, l2Erc20TokenGatewayAddress: string, logger: Logger) { this.withdrawalsClient = withdrawalsClient @@ -42,7 +43,7 @@ export class MonitorWithdrawals { public async initialize(currentBlock: number): Promise> { // 48 hours - const pastBlock = currentBlock - Math.ceil(MAX_WITHDRAWALS_WINDOW / 13) + const pastBlock = currentBlock - Math.ceil(HOURS_48 / AVG_BLOCK_TIME_2SECONDS) const withdrawalEvents = await this.withdrawalsClient.getWithdrawalEvents(pastBlock, currentBlock - 1) if (E.isLeft(withdrawalEvents)) { @@ -57,7 +58,7 @@ export class MonitorWithdrawals { const withdrawalsSum = new BigNumber(0) for (const wc of withdrawalRecords.right) { withdrawalsSum.plus(wc.amount) - this.withdrawalsCache.push(wc) + this.withdrawalStore.push(wc) } this.logger.info(`${MonitorWithdrawals.name} started on block ${currentBlock}`) @@ -66,39 +67,46 @@ export class MonitorWithdrawals { }) } - public handleBlocks(logs: Log[], blocksDto: BlockDto[]): Finding[] { + public handleL2Blocks(l2Logs: Log[], l2BlocksDto: BlockDto[]): Finding[] { const start = new Date().getTime() // adds records into withdrawalsCache - const withdrawalRecords = this.getWithdrawalRecords(logs, blocksDto) - this.withdrawalsCache.push(...withdrawalRecords) + const withdrawalRecords = this.getWithdrawalRecords(l2Logs, l2BlocksDto) + if (withdrawalRecords.length !== 0) { + this.logger.info(`Withdrawals count = ${withdrawalRecords.length}`) + } + + this.withdrawalStore.push(...withdrawalRecords) const out: Finding[] = [] - for (const block of blocksDto) { + for (const l2block of l2BlocksDto) { // remove withdrawals records older than MAX_WITHDRAWALS_WINDOW const withdrawalsCache: WithdrawalRecord[] = [] - for (const wc of this.withdrawalsCache) { - if (wc.time > block.timestamp - MAX_WITHDRAWALS_WINDOW) { + for (const wc of this.withdrawalStore) { + if (l2block.timestamp - HOURS_48 < wc.timestamp) { withdrawalsCache.push(wc) } } - this.withdrawalsCache = withdrawalsCache + this.withdrawalStore = withdrawalsCache const withdrawalsSum = new BigNumber(0) - for (const wc of this.withdrawalsCache) { + for (const wc of this.withdrawalStore) { withdrawalsSum.plus(wc.amount) } // block number condition is meant to "sync" agents alerts - if (withdrawalsSum.div(ETH_DECIMALS).isGreaterThanOrEqualTo(MAX_WITHDRAWALS_SUM) && block.number % 10 === 0) { + if ( + withdrawalsSum.div(ETH_DECIMALS).isGreaterThanOrEqualTo(MAX_WITHDRAWALS_10K_WstEth) && + l2block.number % 10 === 0 + ) { const period = - block.timestamp - this.lastReportedToManyWithdrawals < MAX_WITHDRAWALS_WINDOW - ? block.timestamp - this.lastReportedToManyWithdrawals - : MAX_WITHDRAWALS_WINDOW + l2block.timestamp - this.toManyWithdrawalsTimestamp < HOURS_48 + ? l2block.timestamp - this.toManyWithdrawalsTimestamp + : HOURS_48 - const uniqueKey: string = `82fd9b59-0cb2-42bd-b660-1c01bc18bfd2` + const uniqueKey: string = `2aba9cff-a81f-4069-8e64-32ec9473e7b9` const finding: Finding = Finding.fromObject({ name: `⚠ī¸ Mantle: Huge withdrawals during the last ` + `${Math.floor(period / (60 * 60))} hour(s)`, @@ -108,25 +116,25 @@ export class MonitorWithdrawals { alertId: 'HUGE-WITHDRAWALS-FROM-L2', severity: FindingSeverity.Medium, type: FindingType.Suspicious, - uniqueKey: getUniqueKey(uniqueKey, block.number), + uniqueKey: getUniqueKey(uniqueKey, l2block.number), }) out.push(finding) - this.lastReportedToManyWithdrawals = block.timestamp + this.toManyWithdrawalsTimestamp = l2block.timestamp const tmp: WithdrawalRecord[] = [] - for (const wc of this.withdrawalsCache) { - if (wc.time > block.timestamp - this.lastReportedToManyWithdrawals) { + for (const wc of this.withdrawalStore) { + if (l2block.timestamp - this.toManyWithdrawalsTimestamp < wc.timestamp) { tmp.push(wc) } } - this.withdrawalsCache = tmp + this.withdrawalStore = tmp } } - this.logger.info(elapsedTime(MonitorWithdrawals.name + '.' + this.handleBlocks.name, start)) + this.logger.info(elapsedTime(MonitorWithdrawals.name + '.' + this.handleL2Blocks.name, start)) return out } @@ -137,7 +145,7 @@ export class MonitorWithdrawals { for (const log of logs) { logIndexToLogs.set(log.logIndex, log) - addresses.push(log.address) + addresses.push(log.address.toLowerCase()) } for (const blockDto of blocksDto) { @@ -146,7 +154,7 @@ export class MonitorWithdrawals { const out: WithdrawalRecord[] = [] if (this.l2Erc20TokenGatewayAddress in addresses) { - const events = filterLog(logs, this.withdrawalInitiatedEvent, this.l2Erc20TokenGatewayAddress) + const events = filterLog(logs, this.withdrawalInitiatedEvent, this.l2Erc20TokenGatewayAddress.toLowerCase()) for (const event of events) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -157,7 +165,7 @@ export class MonitorWithdrawals { const blockDto: BlockDto = blockNumberToBlock.get(log.blockNumber) out.push({ - time: blockDto.timestamp, + timestamp: blockDto.timestamp, amount: new BigNumber(String(event.args.amount)), }) } diff --git a/l2-bridge-mantle/src/services/proxy_watcher.ts b/l2-bridge-mantle/src/services/proxy_watcher.ts index bfbc937b..adb816b1 100644 --- a/l2-bridge-mantle/src/services/proxy_watcher.ts +++ b/l2-bridge-mantle/src/services/proxy_watcher.ts @@ -1,175 +1,162 @@ import { Finding, FindingSeverity, FindingType } from 'forta-agent' import { IProxyContractClient } from '../clients/proxy_contract_client' import * as E from 'fp-ts/Either' -import { retry } from 'ts-retry' -import { DataRW } from '../utils/mutex' import { getUniqueKey, networkAlert } from '../utils/finding.helpers' import { elapsedTime } from '../utils/time' import { Logger } from 'winston' -export type ProxyWatcherInitResp = { - lastImpls: string - lastAdmins: string -} - export class ProxyWatcher { private readonly name: string = 'ProxyWatcher' - private lastImpls = new Map() - private lastAdmins = new Map() + private lastImpl: string = '' + private lastAdmin: string = '' - private readonly contractCallers: IProxyContractClient[] + private readonly proxyContract: IProxyContractClient private readonly logger: Logger - constructor(contractCallers: IProxyContractClient[], logger: Logger) { - this.contractCallers = contractCallers + constructor(proxyContract: IProxyContractClient, logger: Logger) { + this.proxyContract = proxyContract this.logger = logger } public getName(): string { - return this.name + return this.proxyContract.getName() + `(${this.proxyContract.getAddress()}).` + this.name } - async initialize(currentBlock: number): Promise> { - for (const contract of this.contractCallers) { - const [lastImpl, lastAdmin] = await retry( - async () => { - return await Promise.all([ - contract.getProxyImplementation(currentBlock), - contract.getProxyAdmin(currentBlock), - ]) - }, - { delay: 1000, maxTry: 5 }, - ) + public getAdmin(): string { + return this.lastAdmin.toLowerCase() + } - if (E.isLeft(lastImpl)) { - return lastImpl - } + public getImpl(): string { + return this.lastImpl.toLowerCase() + } - if (E.isLeft(lastAdmin)) { - return lastAdmin - } + public setAdmin(admin: string) { + this.lastAdmin = admin.toLowerCase() + } + + public setImpl(impl: string) { + this.lastImpl = impl.toLowerCase() + } + + async initialize(currentL2Block: number): Promise { + const [lastImpl, lastAdmin] = await Promise.all([ + this.proxyContract.getProxyImplementation(currentL2Block), + this.proxyContract.getProxyAdmin(currentL2Block), + ]) - this.lastImpls.set(contract.getAddress(), lastImpl.right) - this.lastAdmins.set(contract.getAddress(), lastAdmin.right) + if (E.isLeft(lastImpl)) { + return lastImpl.left } - this.logger.info(`${ProxyWatcher.name} started on block ${currentBlock}`) - return E.right({ - lastImpls: JSON.stringify(Object.fromEntries(this.lastImpls)), - lastAdmins: JSON.stringify(Object.fromEntries(this.lastAdmins)), - }) + if (E.isLeft(lastAdmin)) { + return lastAdmin.left + } + + this.setImpl(lastImpl.right) + this.setAdmin(lastAdmin.right) + + this.logger.info(`${this.getName()}. started on block ${currentL2Block}`) + + return null } - async handleBlocks(blockNumbers: number[]): Promise { + async handleL2Blocks(l2blockNumbers: number[]): Promise { const start = new Date().getTime() const BLOCK_INTERVAL = 25 - const batchPromises: Promise[] = [] - const out = new DataRW([]) - - for (const blockNumber of blockNumbers) { - if (blockNumber % BLOCK_INTERVAL === 0) { - const promiseProxyImpl = this.handleProxyImplementationChanges(blockNumber).then((findings: Finding[]) => { - out.write(findings) - }) + const out: Finding[] = [] - const promiseAdminChanges = this.handleProxyAdminChanges(blockNumber).then((findings: Finding[]) => { - out.write(findings) - }) + for (const l2blockNumber of l2blockNumbers) { + if (l2blockNumber % BLOCK_INTERVAL === 0) { + const [impl, admin] = await Promise.all([ + this.handleProxyImplementationChanges(l2blockNumber), + this.handleProxyAdminChanges(l2blockNumber), + ]) - batchPromises.push(promiseProxyImpl, promiseAdminChanges) + out.push(...impl, ...admin) } } - await Promise.all(batchPromises) - this.logger.info(elapsedTime(ProxyWatcher.name + '.' + this.handleBlocks.name, start)) - - return await out.read() + this.logger.info(this.getName() + '.impl = ' + this.getImpl()) + this.logger.info(this.getName() + '.adm = ' + this.getAdmin()) + this.logger.info(elapsedTime(this.proxyContract.getName() + `.` + this.handleL2Blocks.name, start)) + return out } - private async handleProxyImplementationChanges(blockNumber: number): Promise { + private async handleProxyImplementationChanges(l2BlockNumber: number): Promise { const out: Finding[] = [] - for (const contract of this.contractCallers) { - const lastImpl = this.lastImpls.get(contract.getAddress()) || '' - - const newImpl = await contract.getProxyImplementation(blockNumber) - if (E.isLeft(newImpl)) { - return [ - networkAlert( - newImpl.left, - `Error in ${ProxyWatcher.name}.${this.handleProxyAdminChanges.name}:89`, - newImpl.left.message, - blockNumber, - ), - ] - } + const newImpl = await this.proxyContract.getProxyImplementation(l2BlockNumber) + if (E.isLeft(newImpl)) { + return [ + networkAlert( + newImpl.left, + `Error in ${this.getName()}.${this.handleProxyImplementationChanges.name}:98`, + `Could not fetch proxyImplementation on ${l2BlockNumber}`, + l2BlockNumber, + ), + ] + } - if (newImpl.right != lastImpl) { - const uniqueKey = '3d1b3e5b-5eb1-4926-896a-230d5f51070c' - - out.push( - Finding.fromObject({ - name: '🚨 Mantle: Proxy implementation changed', - description: - `Proxy implementation for ${contract.getName()}(${contract.getAddress()}) ` + - `was changed form ${lastImpl} to ${newImpl}` + - `\n(detected by func call)`, - alertId: 'PROXY-UPGRADED', - severity: FindingSeverity.High, - type: FindingType.Info, - metadata: { newImpl: newImpl.right, lastImpl: lastImpl }, - uniqueKey: getUniqueKey(uniqueKey + '-' + contract.getAddress(), blockNumber), - }), - ) - } + if (newImpl.right.toLowerCase() != this.getImpl()) { + const uniqueKey = '3d1b3e5b-5eb1-4926-896a-230d5f51070c' + + out.push( + Finding.fromObject({ + name: '🚨 Mantle: Proxy implementation changed', + description: + `Proxy implementation for ${this.proxyContract.getName()}(${this.proxyContract.getAddress()}) ` + + `was changed form ${this.getImpl()} to ${newImpl}` + + `\n(detected by func call)`, + alertId: 'PROXY-UPGRADED', + severity: FindingSeverity.High, + type: FindingType.Info, + metadata: { newImpl: newImpl.right, lastImpl: this.getImpl() }, + uniqueKey: getUniqueKey(uniqueKey + '-' + this.proxyContract.getAddress(), l2BlockNumber), + }), + ) - this.lastImpls.set(contract.getAddress(), newImpl.right) + this.setImpl(newImpl.right) } return out } - private async handleProxyAdminChanges(blockNumber: number): Promise { + private async handleProxyAdminChanges(l2blockNumber: number): Promise { const out: Finding[] = [] - for (const contract of this.contractCallers) { - const lastAdmin: string = this.lastAdmins.get(contract.getAddress()) || '' - - const newAdmin = await contract.getProxyAdmin(blockNumber) - if (E.isLeft(newAdmin)) { - return [ - networkAlert( - newAdmin.left, - `Error in ${ProxyWatcher.name}.${this.handleProxyAdminChanges.name}:132`, - newAdmin.left.message, - blockNumber, - ), - ] - } + const newAdmin = await this.proxyContract.getProxyAdmin(l2blockNumber) + if (E.isLeft(newAdmin)) { + return [ + networkAlert( + newAdmin.left, + `Error in ${this.getName()}.${this.handleProxyAdminChanges.name}:138`, + `Could not fetch getProxyAdmin on ${l2blockNumber}`, + l2blockNumber, + ), + ] + } - if (newAdmin.right != lastAdmin) { - const uniqueKey = 'a5c757e0-22b2-4a9b-83cd-cdf6f2915ddc' - out.push( - Finding.fromObject({ - name: '🚨 Mantle: Proxy admin changed', - description: - `Proxy admin for ${contract.getName()}(${contract.getAddress()}) ` + - `was changed from ${lastAdmin} to ${newAdmin}` + - `\n(detected by func call)`, - alertId: 'PROXY-ADMIN-CHANGED', - severity: FindingSeverity.High, - type: FindingType.Info, - metadata: { newAdmin: newAdmin.right, lastAdmin: lastAdmin }, - uniqueKey: getUniqueKey(uniqueKey + '-' + contract.getAddress(), blockNumber), - }), - ) - } + if (newAdmin.right.toLowerCase() != this.getAdmin()) { + const uniqueKey = 'a5c757e0-22b2-4a9b-83cd-cdf6f2915ddc' + out.push( + Finding.fromObject({ + name: '🚨 Mantle: Proxy admin changed', + description: + `Proxy admin for ${this.proxyContract.getName()}(${this.proxyContract.getAddress()}) ` + + `was changed from ${this.getAdmin()} to ${newAdmin}` + + `\n(detected by func call)`, + alertId: 'PROXY-ADMIN-CHANGED', + severity: FindingSeverity.High, + type: FindingType.Info, + metadata: { newAdmin: newAdmin.right, lastAdmin: this.getAdmin() }, + uniqueKey: getUniqueKey(uniqueKey + '-' + this.proxyContract.getAddress(), l2blockNumber), + }), + ) - this.lastAdmins.set(contract.getAddress(), newAdmin.right) + this.setAdmin(newAdmin.right) } - return out } } diff --git a/l2-bridge-mantle/src/utils/constants.ts b/l2-bridge-mantle/src/utils/constants.ts index 5e1be2d5..e2b771a4 100644 --- a/l2-bridge-mantle/src/utils/constants.ts +++ b/l2-bridge-mantle/src/utils/constants.ts @@ -1,40 +1,52 @@ +import BigNumber from 'bignumber.js' + type ProxyContract = { name: string - hash: string + address: string } -export type L2_ERC20_TOKEN_GATEWAY_TYPE = ProxyContract -export type MANTLE_WST_ETH_BRIDGED_TYPE = ProxyContract +export type MANTLE_L2ERC20_TOKEN_BRIDGED_TYPE = ProxyContract +export type MANTLE_WSTETH_BRIDGED_TYPE = ProxyContract export type RoleHashToName = Map +export const ETH_DECIMALS = new BigNumber(10).pow(18) + export type Address = { - GOV_BRIDGE_ADDRESS: string - L2_ERC20_TOKEN_GATEWAY_ADDRESS: string - MANTLE_WST_ETH_BRIDGED_ADDRESS: string - L2_ERC20_TOKEN_GATEWAY: L2_ERC20_TOKEN_GATEWAY_TYPE - MANTLE_WST_ETH_BRIDGED: MANTLE_WST_ETH_BRIDGED_TYPE + L1_WSTETH_ADDRESS: string + MANTLE_L1ERC20_TOKEN_BRIDGE_ADDRESS: string + MANTLE_GOV_EXECUTOR_ADDRESS: string + MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS: string + MANTLE_WSTETH_ADDRESS: string + MANTLE_L2ERC20_TOKEN_BRIDGED: MANTLE_L2ERC20_TOKEN_BRIDGED_TYPE + MANTLE_WSTETH_BRIDGED: MANTLE_WSTETH_BRIDGED_TYPE RolesMap: RoleHashToName } -const GOV_BRIDGE_ADDRESS: string = '0x3a7b055bf88cdc59d20d0245809c6e6b3c5819dd' -const L2_ERC20_TOKEN_GATEWAY_ADDRESS: string = '0x9c46560D6209743968cC24150893631A39AfDe4d' -const MANTLE_WST_ETH_BRIDGED_ADDRESS: string = '0x458ed78EB972a369799fb278c0243b25e5242A83' +const L1_WSTETH_ADDRESS = '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0' +const MANTLE_GOV_EXECUTOR_ADDRESS: string = '0x3a7b055bf88cdc59d20d0245809c6e6b3c5819dd' +const MANTLE_L1ERC20_TOKEN_BRIDGE_ADDRESS: string = '0x2d001d79e5af5f65a939781fe228b267a8ed468b' +const MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS: string = '0x9c46560d6209743968cc24150893631a39afde4d' +const MANTLE_WSTETH_ADDRESS: string = '0x458ed78eb972a369799fb278c0243b25e5242a83' + const DEPOSITS_DISABLER_ROLE_HASH: string = '0x63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6' const DEPOSITS_ENABLER_ROLE_HASH: string = '0x4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a' const WITHDRAWALS_ENABLER_ROLE_HASH: string = '0x9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d' const WITHDRAWALS_DISABLER_ROLE_HASH: string = '0x94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c' const DEFAULT_ADMIN_ROLE_HASH: string = '0x0000000000000000000000000000000000000000000000000000000000000000' + export const Address: Address = { - GOV_BRIDGE_ADDRESS: GOV_BRIDGE_ADDRESS, - L2_ERC20_TOKEN_GATEWAY_ADDRESS: L2_ERC20_TOKEN_GATEWAY_ADDRESS, - MANTLE_WST_ETH_BRIDGED_ADDRESS: MANTLE_WST_ETH_BRIDGED_ADDRESS, - L2_ERC20_TOKEN_GATEWAY: { - name: 'L2_ERC20_TOKEN_GATEWAY', - hash: L2_ERC20_TOKEN_GATEWAY_ADDRESS, + L1_WSTETH_ADDRESS: L1_WSTETH_ADDRESS, + MANTLE_L1ERC20_TOKEN_BRIDGE_ADDRESS: MANTLE_L1ERC20_TOKEN_BRIDGE_ADDRESS, + MANTLE_GOV_EXECUTOR_ADDRESS: MANTLE_GOV_EXECUTOR_ADDRESS, + MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS: MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS, + MANTLE_WSTETH_ADDRESS: MANTLE_WSTETH_ADDRESS, + MANTLE_L2ERC20_TOKEN_BRIDGED: { + name: 'MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS', + address: MANTLE_L2ERC20_TOKEN_BRIDGE_ADDRESS, }, - MANTLE_WST_ETH_BRIDGED: { - name: 'MANTLE_WST_ETH_BRIDGED_ADDRESS', - hash: MANTLE_WST_ETH_BRIDGED_ADDRESS, + MANTLE_WSTETH_BRIDGED: { + name: 'MANTLE_WSTETH_ADDRESS', + address: MANTLE_WSTETH_ADDRESS, }, RolesMap: new Map([ [DEPOSITS_ENABLER_ROLE_HASH, 'DEPOSITS ENABLER ROLE'], diff --git a/l2-bridge-mantle/src/utils/events/proxy_admin_events.ts b/l2-bridge-mantle/src/utils/events/proxy_admin_events.ts index bf71a0e0..41252aaf 100644 --- a/l2-bridge-mantle/src/utils/events/proxy_admin_events.ts +++ b/l2-bridge-mantle/src/utils/events/proxy_admin_events.ts @@ -1,11 +1,11 @@ -import { L2_ERC20_TOKEN_GATEWAY_TYPE, MANTLE_WST_ETH_BRIDGED_TYPE } from '../constants' +import { MANTLE_L2ERC20_TOKEN_BRIDGED_TYPE, MANTLE_WSTETH_BRIDGED_TYPE } from '../constants' import { EventOfNotice } from '../../entity/events' import { FindingSeverity, FindingType } from 'forta-agent' import { Result } from '@ethersproject/abi/lib' export function getProxyAdminEvents( - MANTLE_WST_ETH_BRIDGED_ADDRESS: MANTLE_WST_ETH_BRIDGED_TYPE, - L2_ERC20_TOKEN_GATEWAY_ADDRESS: L2_ERC20_TOKEN_GATEWAY_TYPE, + MANTLE_WST_ETH_BRIDGED_ADDRESS: MANTLE_WSTETH_BRIDGED_TYPE, + L2_ERC20_TOKEN_GATEWAY_ADDRESS: MANTLE_L2ERC20_TOKEN_BRIDGED_TYPE, ): EventOfNotice[] { const uniqueKeys = [ '82b39d98-a156-4be2-be48-81a0d237c53a', @@ -20,25 +20,25 @@ export function getProxyAdminEvents( return [ { - address: MANTLE_WST_ETH_BRIDGED_ADDRESS.hash, + address: MANTLE_WST_ETH_BRIDGED_ADDRESS.address, event: 'event ProxyOssified()', alertId: 'PROXY-OSSIFIED', name: '🚨 Mantle: Proxy ossified', // eslint-disable-next-line @typescript-eslint/no-unused-vars description: (args: Result) => - `Proxy for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.hash}) was ossified` + + `Proxy for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.address}) was ossified` + `\n(detected by event)`, severity: FindingSeverity.High, type: FindingType.Info, uniqueKey: uniqueKeys[0], }, { - address: MANTLE_WST_ETH_BRIDGED_ADDRESS.hash, + address: MANTLE_WST_ETH_BRIDGED_ADDRESS.address, event: 'event AdminChanged(address previousAdmin, address newAdmin)', alertId: 'PROXY-ADMIN-CHANGED', name: '🚨 Mantle: Proxy admin changed', description: (args: Result) => - `Proxy admin for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.hash}) ` + + `Proxy admin for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.address}) ` + `was changed from ${args.previousAdmin} to ${args.newAdmin}` + `\n(detected by event)`, severity: FindingSeverity.High, @@ -46,12 +46,12 @@ export function getProxyAdminEvents( uniqueKey: uniqueKeys[1], }, { - address: MANTLE_WST_ETH_BRIDGED_ADDRESS.hash, + address: MANTLE_WST_ETH_BRIDGED_ADDRESS.address, event: 'event Upgraded(address indexed implementation)', alertId: 'PROXY-UPGRADED', name: '🚨 Mantle: Proxy upgraded', description: (args: Result) => - `Proxy for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.hash}) ` + + `Proxy for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.address}) ` + `was updated to ${args.implementation}` + `\n(detected by event)`, severity: FindingSeverity.High, @@ -59,12 +59,12 @@ export function getProxyAdminEvents( uniqueKey: uniqueKeys[2], }, { - address: MANTLE_WST_ETH_BRIDGED_ADDRESS.hash, + address: MANTLE_WST_ETH_BRIDGED_ADDRESS.address, event: 'event BeaconUpgraded(address indexed beacon)', alertId: 'PROXY-BEACON-UPGRADED', name: '🚨 Mantle: Proxy beacon upgraded', description: (args: Result) => - `Proxy for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.hash}) ` + + `Proxy for ${MANTLE_WST_ETH_BRIDGED_ADDRESS.name}(${MANTLE_WST_ETH_BRIDGED_ADDRESS.address}) ` + `beacon was updated to ${args.beacon}` + `\n(detected by event)`, severity: FindingSeverity.High, @@ -73,25 +73,25 @@ export function getProxyAdminEvents( }, { - address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash, + address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.address, event: 'event ProxyOssified()', alertId: 'PROXY-OSSIFIED', name: '🚨 Mantle: Proxy ossified', // eslint-disable-next-line @typescript-eslint/no-unused-vars description: (args: Result) => - `Proxy for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash}) was ossified` + + `Proxy for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.address}) was ossified` + `\n(detected by event)`, severity: FindingSeverity.High, type: FindingType.Info, uniqueKey: uniqueKeys[4], }, { - address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash, + address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.address, event: 'event AdminChanged(address previousAdmin, address newAdmin)', alertId: 'PROXY-ADMIN-CHANGED', name: '🚨 Mantle: Proxy admin changed', description: (args: Result) => - `Proxy admin for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash}) ` + + `Proxy admin for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.address}) ` + `was changed from ${args.previousAdmin} to ${args.newAdmin}` + `\n(detected by event)`, severity: FindingSeverity.High, @@ -99,12 +99,12 @@ export function getProxyAdminEvents( uniqueKey: uniqueKeys[5], }, { - address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash, + address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.address, event: 'event Upgraded(address indexed implementation)', alertId: 'PROXY-UPGRADED', name: '🚨 Mantle: Proxy upgraded', description: (args: Result) => - `Proxy for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash}) ` + + `Proxy for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.address}) ` + `was updated to ${args.implementation}` + `\n(detected by event)`, severity: FindingSeverity.High, @@ -112,12 +112,12 @@ export function getProxyAdminEvents( uniqueKey: uniqueKeys[6], }, { - address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash, + address: L2_ERC20_TOKEN_GATEWAY_ADDRESS.address, event: 'event BeaconUpgraded(address indexed beacon)', alertId: 'PROXY-BEACON-UPGRADED', name: '🚨 Mantle: Proxy beacon upgraded', description: (args: Result) => - `Proxy for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.hash}) ` + + `Proxy for ${L2_ERC20_TOKEN_GATEWAY_ADDRESS.name}(${L2_ERC20_TOKEN_GATEWAY_ADDRESS.address}) ` + `beacon was updated to ${args.beacon}` + `\n(detected by event)`, severity: FindingSeverity.High, diff --git a/l2-bridge-mantle/tests/e2e/mantle_provider.spec.ts b/l2-bridge-mantle/tests/e2e/mantle_provider.spec.ts deleted file mode 100644 index c7e7e9a1..00000000 --- a/l2-bridge-mantle/tests/e2e/mantle_provider.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { App } from '../../src/app' - -describe('MantleProvider', () => { - test('fetchBlocks', async () => { - const app = await App.getInstance() - - const start = 50_183_000 - const end = 50_184_000 - const blocks = await app.mantleClient.fetchBlocks(start, end) - - expect(blocks.length).toEqual(end - start + 1) - }, 120_000) -}) diff --git a/l2-bridge-mantle/tsconfig.json b/l2-bridge-mantle/tsconfig.json index 72ba777b..9f1e16f5 100644 --- a/l2-bridge-mantle/tsconfig.json +++ b/l2-bridge-mantle/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { - "outDir": "dist", - "baseUrl": "." + "outDir": "dist" }, "exclude": [ "node_modules", diff --git a/l2-bridge-mantle/yarn.lock b/l2-bridge-mantle/yarn.lock index ee337538..f1f078ed 100644 --- a/l2-bridge-mantle/yarn.lock +++ b/l2-bridge-mantle/yarn.lock @@ -8,65 +8,65 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" -"@babel/compat-data@^7.22.9": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.23.5": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7" - integrity sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" + integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.5" - "@babel/parser" "^7.23.5" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.5" - "@babel/types" "^7.23.5" + "@babel/helpers" "^7.24.4" + "@babel/parser" "^7.24.4" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.5", "@babel/generator@^7.7.2": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" - integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== +"@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: - "@babel/types" "^7.23.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" @@ -91,11 +91,11 @@ "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.24.0" "@babel/helper-module-transforms@^7.23.3": version "7.23.3" @@ -108,10 +108,10 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@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.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-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.24.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-simple-access@^7.22.5": version "7.22.5" @@ -128,42 +128,43 @@ "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15": +"@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e" - integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg== +"@babel/helpers@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" + integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.5" - "@babel/types" "^7.23.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" - integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -201,11 +202,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -257,41 +258,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" - integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.5" - "@babel/types" "^7.23.5" - debug "^4.1.0" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5", "@babel/types@^7.3.3": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" - integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -348,10 +349,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.55.0.tgz#b721d52060f369aa259cf97392403cb9ce892ec6" - integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.7.0": version "5.7.0" @@ -696,12 +697,12 @@ "@ethersproject/strings" "^5.7.0" "@grpc/grpc-js@^1.3.6": - version "1.9.12" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.12.tgz#a45b23a7d9ee1eadc9fa8fe480e27edbc6544cdd" - integrity sha512-Um5MBuge32TS3lAKX02PGCnFM4xPT996yLgZNb5H03pn6NyJ4Iwn5YcPq6Jj9yxGRk7WOgaZFtVRH5iTdYBeUg== + version "1.10.6" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.6.tgz#1e3eb1af911dc888fbef7452f56a7573b8284d54" + integrity sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA== dependencies: - "@grpc/proto-loader" "^0.7.8" - "@types/node" ">=12.12.47" + "@grpc/proto-loader" "^0.7.10" + "@js-sdsl/ordered-map" "^4.4.2" "@grpc/proto-loader@^0.6.4": version "0.6.13" @@ -714,23 +715,23 @@ protobufjs "^6.11.3" yargs "^16.2.0" -"@grpc/proto-loader@^0.7.8": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" - integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== +"@grpc/proto-loader@^0.7.10": + version "0.7.12" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.12.tgz#787b58e3e3771df30b1567c057b6ab89e3a42911" + integrity sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q== dependencies: lodash.camelcase "^4.3.0" long "^5.0.0" protobufjs "^7.2.4" yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -738,10 +739,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -754,7 +755,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -951,38 +952,43 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@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" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + "@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" @@ -1004,17 +1010,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgr/utils@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -1075,9 +1074,9 @@ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" @@ -1089,9 +1088,9 @@ "@sinonjs/commons" "^3.0.0" "@tsconfig/node20@^20.1.2": - version "20.1.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.2.tgz#b93128c411d38e9507035255195bc8a6718541e3" - integrity sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ== + version "20.1.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.4.tgz#3457d42eddf12d3bde3976186ab0cd22b85df928" + integrity sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg== "@typechain/ethers-v5@^11.1.2": version "11.1.2" @@ -1113,9 +1112,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.7" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" - integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" @@ -1128,9 +1127,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" @@ -1161,9 +1160,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.5.10": - version "29.5.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.10.tgz#a10fc5bab9e426081c12b2ef73d24d4f0c9b7f50" - integrity sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ== + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -1174,9 +1173,9 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/lodash@^4.14.202": - version "4.14.202" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" - integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3" + integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== "@types/long@^4.0.1": version "4.0.2" @@ -1190,10 +1189,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.3.tgz#4900adcc7fc189d5af5bb41da8f543cea6962030" - integrity sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg== +"@types/node@*", "@types/node@>=13.7.0": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== dependencies: undici-types "~5.26.4" @@ -1217,9 +1216,9 @@ "@types/node" "*" "@types/semver@^7.3.12", "@types/semver@^7.5.0": - version "7.5.6" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" - integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/stack-utils@^2.0.0": version "2.0.3" @@ -1256,15 +1255,15 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^6.12.0": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz#f98bd887bf95551203c917e734d113bf8d527a0c" - integrity sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA== + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/type-utils" "6.13.1" - "@typescript-eslint/utils" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -1273,14 +1272,14 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6.12.0": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.13.1.tgz#29d6d4e5fab4669e58bc15f6904b67da65567487" - integrity sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ== - dependencies: - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -1291,21 +1290,21 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz#58c7c37c6a957d3d9f59bc4f64c2888e0cac1d70" - integrity sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz#e6e5885e387841cae9c38fc0638fd8b7561973d6" - integrity sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ== +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== dependencies: - "@typescript-eslint/typescript-estree" "6.13.1" - "@typescript-eslint/utils" "6.13.1" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -1314,10 +1313,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.13.1.tgz#b56f26130e7eb8fa1e429c75fb969cae6ad7bb5c" - integrity sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -1332,30 +1331,31 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz#d01dda78d2487434d1c503853fa00291c566efa4" - integrity sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.13.1.tgz#925b3a2453a71ada914ae329b7bb7e7d96634b2f" - integrity sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw== +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" "@typescript-eslint/utils@^5.10.0": @@ -1380,12 +1380,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz#c4b692dcc23a4fc60685b718f10fde789d65a540" - integrity sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: - "@typescript-eslint/types" "6.13.1" + "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -1404,9 +1404,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== aes-js@3.0.0: version "3.0.0" @@ -1489,20 +1489,19 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" async-mutex@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.0.tgz#ae8048cd4d04ace94347507504b3cf15e631c25f" - integrity sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA== + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== dependencies: tslib "^2.4.0" @@ -1532,11 +1531,11 @@ awilix@^4.3.4: glob "^7.1.6" axios@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -1620,20 +1619,15 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -big-integer@^1.6.44: - version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - bignumber.js@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" @@ -1645,13 +1639,6 @@ bn.js@^5.0.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1679,7 +1666,7 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: +browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -1719,27 +1706,28 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== + version "4.2.3" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== dependencies: bn.js "^5.2.1" browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.4" + elliptic "^6.5.5" + hash-base "~3.0" inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" safe-buffer "^5.2.1" -browserslist@^4.21.9: - version "4.22.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" - integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== +browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001565" - electron-to-chromium "^1.4.601" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" node-releases "^2.0.14" update-browserslist-db "^1.0.13" @@ -1775,13 +1763,6 @@ buffer@6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1805,10 +1786,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001565: - version "1.0.30001566" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz#61a8e17caf3752e3e426d4239c549ebbb37fef0d" - integrity sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA== +caniuse-lite@^1.0.30001587: + version "1.0.30001609" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz#fc34fad75c0c6d6d6303bdbceec2da8f203dabd6" + integrity sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA== chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -1833,9 +1814,9 @@ char-regex@^1.0.2: integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== chokidar@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1978,6 +1959,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -2056,9 +2042,9 @@ debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: ms "2.1.2" dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-extend@~0.6.0: version "0.6.0" @@ -2075,29 +2061,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2144,12 +2107,12 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -electron-to-chromium@^1.4.601: - version "1.4.601" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz#cac69868548aee89961ffe63ff5a7716f0685b75" - integrity sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA== +electron-to-chromium@^1.4.668: + version "1.4.735" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.735.tgz#c32914ef2cd0a3a545a3def841d253a31a8a93be" + integrity sha512-pkYpvwg8VyOTQAeBqZ7jsmpCjko1Qc6We1ZtZCjRyYbT5v4AIUKDy5cQTRotQlSSZmMr8jqpEt6JtOj5k7lR7A== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: +elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -2162,6 +2125,19 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -2185,9 +2161,9 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.5: version "1.0.5" @@ -2210,19 +2186,19 @@ eslint-config-prettier@^9.0.0: integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-plugin-jest@^27.6.0: - version "27.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz#e5c0cf735b3c8cad0ef9db5b565b2fc99f5e55ed" - integrity sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng== + version "27.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== dependencies: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-prettier@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515" - integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg== + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.5" + synckit "^0.8.6" eslint-scope@^5.1.1: version "5.1.1" @@ -2246,15 +2222,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.54.0: - version "8.55.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.55.0.tgz#078cb7b847d66f2c254ea1794fa395bf8e7e03f8" - integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA== + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.55.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -2391,21 +2367,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2432,7 +2393,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -2459,9 +2420,9 @@ fast-safe-stringify@^2.0.6: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -2524,19 +2485,19 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== fn.name@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== form-data@^4.0.0: version "4.0.0" @@ -2575,9 +2536,9 @@ forta-agent@^0.1.48: yargs "^17.0.1" fp-ts@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.1.tgz#6abc401ce42b65364ca8f0b0d995c5840c68a930" - integrity sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA== + version "2.16.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.5.tgz#d79b97168aeafcf9612f18bbc017f513ecb20ac9" + integrity sha512-N8T8PwMSeTKKtkm9lkj/zSTAnPC/aJIIrQhnHxxkL0KLsRCNUPANksJOlMXxcKKCo7H1ORP3No9EMD+fP0tsdA== fs-extra@^7.0.0: version "7.0.1" @@ -2618,7 +2579,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -2678,9 +2639,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -2725,6 +2686,14 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-base@~3.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -2734,9 +2703,9 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: minimalistic-assert "^1.0.1" hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -2759,11 +2728,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - husky@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" @@ -2780,9 +2744,9 @@ ignore-by-default@^1.0.1: integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== import-fresh@^3.2.1: version "3.3.0" @@ -2813,7 +2777,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2847,16 +2811,6 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.0" -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2879,13 +2833,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2901,17 +2848,10 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" @@ -2935,13 +2875,13 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" @@ -2964,9 +2904,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -3611,11 +3551,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - 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" @@ -3626,6 +3561,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3696,9 +3638,9 @@ node-addon-api@^2.0.0: integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-gyp-build@^4.2.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.7.1.tgz#cd7d2eb48e594874053150a9418ac85af83ca8f7" - integrity sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg== + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== node-int64@^0.4.0: version "0.4.0" @@ -3711,9 +3653,9 @@ node-releases@^2.0.14: integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== nodemon@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.2.tgz#222dd0de79fc7b7b3eedba422d2b9e5fc678621e" - integrity sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" + integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== dependencies: chokidar "^3.5.2" debug "^4" @@ -3745,13 +3687,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -3773,23 +3708,6 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -3842,16 +3760,17 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" parse-json@^4.0.0: version "4.0.0" @@ -3894,11 +3813,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -3909,7 +3823,7 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: +pbkdf2@^3.0.3, pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -3971,9 +3885,9 @@ prettier@^2.1.2, prettier@^2.3.1: integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== prettier@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -3984,6 +3898,11 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prompts@^2.0.1, prompts@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -4012,9 +3931,9 @@ protobufjs@^6.11.3: long "^4.0.0" protobufjs@^7.2.4: - version "7.2.5" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" - integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== + version "7.2.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" + integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -4057,9 +3976,9 @@ punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== python-shell@^3.0.0: version "3.0.1" @@ -4091,7 +4010,20 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -4187,13 +4119,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4206,16 +4131,16 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - scrypt-js@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -4236,9 +4161,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -4371,6 +4296,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^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" @@ -4388,11 +4320,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-json-comments@^3.0.1, 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" @@ -4424,12 +4351,12 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@^0.8.5: - version "0.8.6" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.6.tgz#b69b7fbce3917c2673cbdc0d87fb324db4a5b409" - integrity sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA== +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== dependencies: - "@pkgr/utils" "^2.4.2" + "@pkgr/core" "^0.1.0" tslib "^2.6.2" table-layout@^1.0.2: @@ -4461,11 +4388,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -4496,9 +4418,9 @@ triple-beam@^1.3.0: integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-command-line-args@^2.2.0: version "2.5.1" @@ -4536,9 +4458,9 @@ ts-generator@^0.1.1: ts-essentials "^1.0.0" ts-jest@^29.1.1: - version "29.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" - integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + version "29.1.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.2.tgz#7613d8c81c43c8cb312c6904027257e814c40e09" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -4550,16 +4472,16 @@ ts-jest@^29.1.1: yargs-parser "^21.0.1" ts-retry@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/ts-retry/-/ts-retry-4.2.4.tgz#151e813adec2e7edffa5493c2f07b47e71fd336e" - integrity sha512-r9hIgfdCyU5yBe090s3E1VdPWGifBHx6uzu5hjRn6fbK0jpV8t4TGzNBghnxZXbm2ZNsm909E5WbwPGWAHdQOQ== + version "4.2.5" + resolved "https://registry.yarnpkg.com/ts-retry/-/ts-retry-4.2.5.tgz#ee4638e66c68bb49da975aa4994d5f16bfb61bc2" + integrity sha512-dFBa4pxMBkt/bjzdBio8EwYfbAdycEAwe0KZgzlUKKwU9Wr1WErK7Hg9QLqJuDDYJXTW4KYZyXAyqYKOdO/ehA== tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0, tslib@^2.6.2: +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -4610,9 +4532,9 @@ typechain@^8.3.2: ts-essentials "^7.0.1" typescript@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" - integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== typical@^4.0.0: version "4.0.0" @@ -4639,11 +4561,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -4659,7 +4576,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -4697,7 +4614,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -winston-transport@^4.5.0: +winston-transport@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== @@ -4707,9 +4624,9 @@ winston-transport@^4.5.0: triple-beam "^1.3.0" winston@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" - integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== + version "3.13.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" + integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== dependencies: "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" @@ -4721,7 +4638,7 @@ winston@^3.11.0: safe-stable-stringify "^2.3.1" stack-trace "0.0.x" triple-beam "^1.3.0" - winston-transport "^4.5.0" + winston-transport "^4.7.0" wordwrapjs@^4.0.0: version "4.0.1"