From a9035f15791f6ec5ff59a2f695497f42158fb8b6 Mon Sep 17 00:00:00 2001 From: Tornado Contrib Date: Mon, 29 Apr 2024 15:54:32 +0000 Subject: [PATCH] Initial commit Exported from tornado-cli 1.0.3 --- .eslintrc.js | 65 + .gitattributes | 1 + .gitignore | 7 + .npmrc | 1 + README.md | 25 + logo.png | Bin 0 -> 39157 bytes logo2.png | Bin 0 -> 3646 bytes package.json | 85 + rollup.config.mjs | 82 + src/abi/ENS.json | 681 ++ src/abi/ERC20.json | 273 + src/abi/GasPriceOracle.json | 189 + src/abi/Multicall.json | 440 ++ src/abi/OffchainOracle.json | 555 ++ src/abi/OvmGasPriceOracle.json | 152 + src/abi/ReverseRecords.json | 32 + src/batch.ts | 339 + src/data.ts | 146 + src/deposits.ts | 247 + src/encryptedNotes.ts | 189 + src/events/base.ts | 792 +++ src/events/index.ts | 3 + src/events/node.ts | 780 +++ src/events/types.ts | 80 + src/fees.ts | 124 + src/graphql/index.ts | 1138 ++++ src/graphql/queries.ts | 197 + src/index.ts | 22 + src/merkleTree.ts | 199 + src/merkleTreeWorker.ts | 70 + src/mimc.ts | 28 + src/multicall.ts | 37 + src/networkConfig.ts | 790 +++ src/parser.ts | 77 + src/pedersen.ts | 32 + src/prices.ts | 31 + src/providers.ts | 645 ++ src/relayerClient.ts | 434 ++ src/schemas/index.ts | 21 + src/schemas/jobs.ts | 59 + src/schemas/status.ts | 181 + src/tokens.ts | 90 + src/treeCache.ts | 113 + src/typechain/ENS.ts | 756 +++ src/typechain/ERC20.ts | 351 ++ src/typechain/GasPriceOracle.ts | 271 + src/typechain/Multicall.ts | 416 ++ src/typechain/OffchainOracle.ts | 622 ++ src/typechain/OvmGasPriceOracle.ts | 460 ++ src/typechain/ReverseRecords.ts | 88 + src/typechain/common.ts | 131 + src/typechain/factories/ENS__factory.ts | 698 +++ src/typechain/factories/ERC20__factory.ts | 318 + .../factories/GasPriceOracle__factory.ts | 212 + src/typechain/factories/Multicall__factory.ts | 457 ++ .../factories/OffchainOracle__factory.ts | 538 ++ .../factories/OvmGasPriceOracle__factory.ts | 321 + .../factories/ReverseRecords__factory.ts | 55 + src/typechain/factories/index.ts | 10 + src/typechain/index.ts | 18 + src/types/bloomfilter.js.d.ts | 25 + src/utils.ts | 145 + src/websnark.ts | 85 + tsconfig.json | 114 + webpack.config.js | 80 + yarn.lock | 5472 +++++++++++++++++ 66 files changed, 21095 insertions(+) create mode 100644 .eslintrc.js create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 README.md create mode 100644 logo.png create mode 100644 logo2.png create mode 100644 package.json create mode 100644 rollup.config.mjs create mode 100644 src/abi/ENS.json create mode 100644 src/abi/ERC20.json create mode 100644 src/abi/GasPriceOracle.json create mode 100644 src/abi/Multicall.json create mode 100644 src/abi/OffchainOracle.json create mode 100644 src/abi/OvmGasPriceOracle.json create mode 100644 src/abi/ReverseRecords.json create mode 100644 src/batch.ts create mode 100644 src/data.ts create mode 100644 src/deposits.ts create mode 100644 src/encryptedNotes.ts create mode 100644 src/events/base.ts create mode 100644 src/events/index.ts create mode 100644 src/events/node.ts create mode 100644 src/events/types.ts create mode 100644 src/fees.ts create mode 100644 src/graphql/index.ts create mode 100644 src/graphql/queries.ts create mode 100644 src/index.ts create mode 100644 src/merkleTree.ts create mode 100644 src/merkleTreeWorker.ts create mode 100644 src/mimc.ts create mode 100644 src/multicall.ts create mode 100644 src/networkConfig.ts create mode 100644 src/parser.ts create mode 100644 src/pedersen.ts create mode 100644 src/prices.ts create mode 100644 src/providers.ts create mode 100644 src/relayerClient.ts create mode 100644 src/schemas/index.ts create mode 100644 src/schemas/jobs.ts create mode 100644 src/schemas/status.ts create mode 100644 src/tokens.ts create mode 100644 src/treeCache.ts create mode 100644 src/typechain/ENS.ts create mode 100644 src/typechain/ERC20.ts create mode 100644 src/typechain/GasPriceOracle.ts create mode 100644 src/typechain/Multicall.ts create mode 100644 src/typechain/OffchainOracle.ts create mode 100644 src/typechain/OvmGasPriceOracle.ts create mode 100644 src/typechain/ReverseRecords.ts create mode 100644 src/typechain/common.ts create mode 100644 src/typechain/factories/ENS__factory.ts create mode 100644 src/typechain/factories/ERC20__factory.ts create mode 100644 src/typechain/factories/GasPriceOracle__factory.ts create mode 100644 src/typechain/factories/Multicall__factory.ts create mode 100644 src/typechain/factories/OffchainOracle__factory.ts create mode 100644 src/typechain/factories/OvmGasPriceOracle__factory.ts create mode 100644 src/typechain/factories/ReverseRecords__factory.ts create mode 100644 src/typechain/factories/index.ts create mode 100644 src/typechain/index.ts create mode 100644 src/types/bloomfilter.js.d.ts create mode 100644 src/utils.ts create mode 100644 src/websnark.ts create mode 100644 tsconfig.json create mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..23389a3 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,65 @@ +module.exports = { + "env": { + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "prettier", + "plugin:prettier/recommended", + ], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint", + "prettier" + ], + "rules": { + "prettier/prettier": [ + "error", + { + singleQuote: true, + printWidth: 120 + } + ], + "import/order": ["error"], + /** + "indent": [ + "error", + 2 + ], + **/ + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "@typescript-eslint/no-unused-vars": ["warn"] + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..46c9a9b --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +dist/* linguist-vendored \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f2b777 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +.env +/events +/trees +backup-tornado-* +backup-tornadoInvoice-* +backup-note-account-* \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..05ba80e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@tornado:registry=https://git.tornado.ws/api/packages/tornado-packages/npm/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3835b45 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +
+ + + +# Tornado Core + +🛠 An SDK for building applications on top of [Privacy Pools](https://www.forbes.com/sites/tomerniv/2023/09/07/privacy-pools-bridging-the-gap-between-blockchain-and-regulatory-compliance) + +[![Telegram Badge](https://img.shields.io/badge/Join%20Group-telegram?style=flat&logo=telegram&color=blue&link=https%3A%2F%2Ft.me%2Ftornadoofficial)](https://t.me/tornadoofficial) [![Element Badge](https://img.shields.io/badge/Join%20Element%20Chat-Element?style=flat&logo=element&color=green&link=https%3A%2F%2Felement.tornadocash.social%2F)](https://element.tornadocash.social) [![Discourse Badge](https://img.shields.io/badge/Discourse-Discourse?style=flat&logo=Discourse&color=black&link=https%3A%2F%2Fforum.tornado.ws%2F)](https://forum.tornado.ws/) + +
+ +### About Tornado Core + +Tornado Core is a modern building block for Privacy Pools to build anything from custom UI or CLI tools + + + Written in [TypeScript](https://www.typescriptlang.org/) + + + Built on top of modern tech stacks like [Ethers.js V6](https://docs.ethers.org/v6/) or [TypeChain](https://github.com/dethcrypto/TypeChain) + + + Creates resource heavy Merkle Trees on a separate thread using Web Workers / Worker Threads + + + Resilient API requests made by [cross-fetch](https://www.npmjs.com/package/cross-fetch) and retries, especially for Tor Users + + + Modular design \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..220daa12aa9822d44d41dabc175875d43e4cd326 GIT binary patch literal 39157 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 z zmvo9$Q!JCTlUJs|GdIi8w~|{@Dc#rVqr^(HLBN~*idj{k+#5^CeXC7Jb#CA%CzIJZ zLz^A+e%1adX;A4{rWC~VrXggaea^AE8saB?3z1To{G7=y?f1RBOD@7M>!2d+b{<|Q z|CDVeeeCzy%X+!O{1oo$kIWxtzb^)TT(r87R$Pawp{HZMmXPlI6>W_bi@h;Tc8?ZQ z?-K)bloSjXGSgT3Q8{f)&pbCR>9oY9;=vlXP3PfuK2-tMqi>)GGzGz(Z$P99=ERPA z{7T9o7wwCY?AiqL6UGw%BQTuETHzqM2(58^IiTMEksm6vKumZ3Y#Y44eGfsMw?nzh z=F&)drV45Mx1q$8?Iz_^NnP7fuHEx^8WxrKk)FMHQ>WQR^pjx%?6Sv_O!k`;t@f^u zGXY{85tOH65ccI!_#p#koZ$TgKr{Cfl(#C96Ej5etU=WUO?{mgGW_O4kin2uN9-1S zz^^J=+`|d(ykLtqMdJ;X2x#X*7JiVn;shd~eJq)yKjW0z+?UBhAMJ0Hi^#j?9H0A9 zMv&MJdo}A1@y^(%OdmDwKz!xh8jSa1Zf_8YCEjAPx>c$nA=QJbW&CuWW~2OjZwBca z#K04)yTw zju*iIcq%kcei^6^iH`BEr3hxt^CgugO5`}0RiXRU=r$5KQ)6?~SEjX;DjWIoLk2ne zk7;aLi&gsY0u_gQb3rL!@~5R64Sg{k z1dyG%C35@CdmQgY&Rb(A%d->a9-@7Si5;i&1lk}-lWlYRk|EMy@E?Yo(34=2)F4^L*n@@qYcev_}e#tH*e?7mWR@no+NXq)NVm#D3O>mp2|JhR? zIg9r=f?4C7eY&(@h zk2LqZF}3O5%17tIp{&o^-|On~%U}-ooY0xh=jy-g?xxUme>Jhu9jPiR>8{IW*PhF$ z{f99rq>wXxgI*)~2BUM!C zmy@&tkjh2iZ%QNGgGe!Hhi1iahbc3@*l?oAejpgGyBYT~d{R}w;EcxqNpwg?tpq}# zK|drB?{vE~-x%S-B+k()Ewqe7)pE0@Thj`N2ZTQKNx**|m{UQm)Ah>?+m&3?Fo){O zSkFzRIxfVbDql;4SV+;~k?s@E!ip`!Y@KJamzar&jtjMSn?*cZvwUUHnT%G@M%dmc z$7D5jSI{BH7g_?YJcdzeq^Ne5Sjz4?enCG`kV0}WY z(;%1~C#Tonj5w92#&J$Zf&j1MbXApGxtDSgX^s7!wnG|&aN60`hMYmj*ppV8c7^ void; + +/** + * Fetch blocks from web3 provider on batches + */ +export class BatchBlockService { + provider: Provider; + onProgress?: BatchBlockOnProgress; + concurrencySize: number; + batchSize: number; + shouldRetry: boolean; + retryMax: number; + retryOn: number; + constructor({ + provider, + onProgress, + concurrencySize = 10, + batchSize = 10, + shouldRetry = true, + retryMax = 5, + retryOn = 500, + }: BatchBlockServiceConstructor) { + this.provider = provider; + this.onProgress = onProgress; + this.concurrencySize = concurrencySize; + this.batchSize = batchSize; + this.shouldRetry = shouldRetry; + this.retryMax = retryMax; + this.retryOn = retryOn; + } + + async getBlock(blockTag: BlockTag): Promise { + const blockObject = await this.provider.getBlock(blockTag); + + // if the provider returns null (which they have corrupted block data for one of their nodes) throw and retry + if (!blockObject) { + const errMsg = `No block for ${blockTag}`; + throw new Error(errMsg); + } + + return blockObject; + } + + createBatchRequest(batchArray: BlockTag[][]): Promise[] { + return batchArray.map(async (blocks: BlockTag[], index: number) => { + // send batch requests on milliseconds to avoid including them on a single batch request + await sleep(20 * index); + + return (async () => { + let retries = 0; + let err; + + // eslint-disable-next-line no-unmodified-loop-condition + while ((!this.shouldRetry && retries === 0) || (this.shouldRetry && retries < this.retryMax)) { + try { + return await Promise.all(blocks.map((b) => this.getBlock(b))); + } catch (e) { + retries++; + err = e; + + // retry on 0.5 seconds + await sleep(this.retryOn); + } + } + + throw err; + })(); + }); + } + + async getBatchBlocks(blocks: BlockTag[]): Promise { + let blockCount = 0; + const results: Block[] = []; + + for (const chunks of chunk(blocks, this.concurrencySize * this.batchSize)) { + const chunksResult = (await Promise.all(this.createBatchRequest(chunk(chunks, this.batchSize)))).flat(); + + results.push(...chunksResult); + + blockCount += chunks.length; + + if (typeof this.onProgress === 'function') { + this.onProgress({ + percentage: blockCount / blocks.length, + currentIndex: blockCount, + totalIndex: blocks.length, + }); + } + } + + return results; + } +} + +/** + * Fetch transactions from web3 provider on batches + */ +export class BatchTransactionService { + provider: Provider; + onProgress?: BatchBlockOnProgress; + concurrencySize: number; + batchSize: number; + shouldRetry: boolean; + retryMax: number; + retryOn: number; + constructor({ + provider, + onProgress, + concurrencySize = 10, + batchSize = 10, + shouldRetry = true, + retryMax = 5, + retryOn = 500, + }: BatchBlockServiceConstructor) { + this.provider = provider; + this.onProgress = onProgress; + this.concurrencySize = concurrencySize; + this.batchSize = batchSize; + this.shouldRetry = shouldRetry; + this.retryMax = retryMax; + this.retryOn = retryOn; + } + + async getTransaction(txHash: string): Promise { + const txObject = await this.provider.getTransaction(txHash); + + if (!txObject) { + const errMsg = `No transaction for ${txHash}`; + throw new Error(errMsg); + } + + return txObject; + } + + createBatchRequest(batchArray: string[][]): Promise[] { + return batchArray.map(async (txs: string[], index: number) => { + await sleep(20 * index); + + return (async () => { + let retries = 0; + let err; + + // eslint-disable-next-line no-unmodified-loop-condition + while ((!this.shouldRetry && retries === 0) || (this.shouldRetry && retries < this.retryMax)) { + try { + return await Promise.all(txs.map((tx) => this.getTransaction(tx))); + } catch (e) { + retries++; + err = e; + + // retry on 0.5 seconds + await sleep(this.retryOn); + } + } + + throw err; + })(); + }); + } + + async getBatchTransactions(txs: string[]): Promise { + let txCount = 0; + const results = []; + + for (const chunks of chunk(txs, this.concurrencySize * this.batchSize)) { + const chunksResult = (await Promise.all(this.createBatchRequest(chunk(chunks, this.batchSize)))).flat(); + + results.push(...chunksResult); + + txCount += chunks.length; + + if (typeof this.onProgress === 'function') { + this.onProgress({ percentage: txCount / txs.length, currentIndex: txCount, totalIndex: txs.length }); + } + } + + return results; + } +} + +export interface BatchEventServiceConstructor { + provider: Provider; + contract: BaseContract; + onProgress?: BatchEventOnProgress; + concurrencySize?: number; + blocksPerRequest?: number; + shouldRetry?: boolean; + retryMax?: number; + retryOn?: number; +} + +export type BatchEventOnProgress = ({ + percentage, + type, + fromBlock, + toBlock, + count, +}: { + percentage: number; + type?: ContractEventName; + fromBlock?: number; + toBlock?: number; + count?: number; +}) => void; + +// To enable iteration only numbers are accepted for fromBlock input +export type EventInput = { + fromBlock: number; + toBlock: number; + type: ContractEventName; +}; + +/** + * Fetch events from web3 provider on bulk + */ +export class BatchEventsService { + provider: Provider; + contract: BaseContract; + onProgress?: BatchEventOnProgress; + concurrencySize: number; + blocksPerRequest: number; + shouldRetry: boolean; + retryMax: number; + retryOn: number; + constructor({ + provider, + contract, + onProgress, + concurrencySize = 10, + blocksPerRequest = 2000, + shouldRetry = true, + retryMax = 5, + retryOn = 500, + }: BatchEventServiceConstructor) { + this.provider = provider; + this.contract = contract; + this.onProgress = onProgress; + this.concurrencySize = concurrencySize; + this.blocksPerRequest = blocksPerRequest; + this.shouldRetry = shouldRetry; + this.retryMax = retryMax; + this.retryOn = retryOn; + } + + async getPastEvents({ fromBlock, toBlock, type }: EventInput): Promise { + let err; + let retries = 0; + + // eslint-disable-next-line no-unmodified-loop-condition + while ((!this.shouldRetry && retries === 0) || (this.shouldRetry && retries < this.retryMax)) { + try { + return (await this.contract.queryFilter(type, fromBlock, toBlock)) as EventLog[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (e: any) { + err = e; + retries++; + + // If provider.getBlockNumber returned last block that isn't accepted (happened on Avalanche/Gnosis), + // get events to last accepted block + if (e.message.includes('after last accepted block')) { + const acceptedBlock = parseInt(e.message.split('after last accepted block ')[1]); + toBlock = acceptedBlock; + } + + // retry on 0.5 seconds + await sleep(this.retryOn); + } + } + + throw err; + } + + createBatchRequest(batchArray: EventInput[]): Promise[] { + return batchArray.map(async (event: EventInput, index: number) => { + await sleep(20 * index); + + return this.getPastEvents(event); + }); + } + + async getBatchEvents({ fromBlock, toBlock, type = '*' }: EventInput): Promise { + if (!toBlock) { + toBlock = await this.provider.getBlockNumber(); + } + + const eventsToSync = []; + + for (let i = fromBlock; i < toBlock; i += this.blocksPerRequest) { + const j = i + this.blocksPerRequest - 1 > toBlock ? toBlock : i + this.blocksPerRequest - 1; + + eventsToSync.push({ fromBlock: i, toBlock: j, type }); + } + + const events = []; + const eventChunk = chunk(eventsToSync, this.concurrencySize); + + let chunkCount = 0; + + for (const chunk of eventChunk) { + chunkCount++; + + const fetchedEvents = (await Promise.all(this.createBatchRequest(chunk))).flat(); + events.push(...fetchedEvents); + + if (typeof this.onProgress === 'function') { + this.onProgress({ + percentage: chunkCount / eventChunk.length, + type, + fromBlock: chunk[0].fromBlock, + toBlock: chunk[chunk.length - 1].toBlock, + count: fetchedEvents.length, + }); + } + } + + return events; + } +} diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 0000000..ba6d55b --- /dev/null +++ b/src/data.ts @@ -0,0 +1,146 @@ +import path from 'path'; +import { stat, mkdir, readFile, writeFile } from 'fs/promises'; +import { zip, unzip, AsyncZippable, Unzipped } from 'fflate'; +import { BaseEvents, MinimalEvents } from './events'; + +export async function existsAsync(fileOrDir: string): Promise { + try { + await stat(fileOrDir); + + return true; + } catch { + return false; + } +} + +export function zipAsync(file: AsyncZippable): Promise { + return new Promise((res, rej) => { + zip(file, { mtime: new Date('1/1/1980') }, (err, data) => { + if (err) { + rej(err); + return; + } + res(data); + }); + }); +} + +export function unzipAsync(data: Uint8Array): Promise { + return new Promise((res, rej) => { + unzip(data, {}, (err, data) => { + if (err) { + rej(err); + return; + } + res(data); + }); + }); +} + +export async function saveUserFile({ + fileName, + userDirectory, + dataString, +}: { + fileName: string; + userDirectory: string; + dataString: string; +}) { + fileName = fileName.toLowerCase(); + + const filePath = path.join(userDirectory, fileName); + + const payload = await zipAsync({ + [fileName]: new TextEncoder().encode(dataString), + }); + + if (!(await existsAsync(userDirectory))) { + await mkdir(userDirectory, { recursive: true }); + } + + await writeFile(filePath + '.zip', payload); + await writeFile(filePath, dataString); +} + +export async function loadSavedEvents({ + name, + userDirectory, + deployedBlock, +}: { + name: string; + userDirectory: string; + deployedBlock: number; +}): Promise> { + const filePath = path.join(userDirectory, `${name}.json`.toLowerCase()); + + if (!(await existsAsync(filePath))) { + return { + events: [] as T[], + lastBlock: null, + }; + } + + try { + const events = JSON.parse(await readFile(filePath, { encoding: 'utf8' })) as T[]; + + return { + events, + lastBlock: events && events.length ? events[events.length - 1].blockNumber : deployedBlock, + }; + } catch (err) { + console.log('Method loadSavedEvents has error'); + console.log(err); + return { + events: [], + lastBlock: deployedBlock, + }; + } +} + +export async function download({ name, cacheDirectory }: { name: string; cacheDirectory: string }) { + const fileName = `${name}.json`.toLowerCase(); + const zipName = `${fileName}.zip`; + const zipPath = path.join(cacheDirectory, zipName); + + const data = await readFile(zipPath); + const { [fileName]: content } = await unzipAsync(data); + + return new TextDecoder().decode(content); +} + +export async function loadCachedEvents({ + name, + cacheDirectory, + deployedBlock, +}: { + name: string; + cacheDirectory: string; + deployedBlock: number; +}): Promise> { + try { + const module = await download({ cacheDirectory, name }); + + if (module) { + const events = JSON.parse(module); + + const lastBlock = events && events.length ? events[events.length - 1].blockNumber : deployedBlock; + + return { + events, + lastBlock, + }; + } + + return { + events: [], + lastBlock: deployedBlock, + }; + } catch (err) { + console.log('Method loadCachedEvents has error'); + console.log(err); + return { + events: [], + lastBlock: deployedBlock, + }; + } +} diff --git a/src/deposits.ts b/src/deposits.ts new file mode 100644 index 0000000..2e7d8e1 --- /dev/null +++ b/src/deposits.ts @@ -0,0 +1,247 @@ +import { bnToBytes, bytesToBN, leBuff2Int, leInt2Buff, rBigInt, toFixedHex } from './utils'; +import { buffPedersenHash } from './pedersen'; +import type { NetIdType } from './networkConfig'; + +export type DepositType = { + currency: string; + amount: string; + netId: NetIdType; +}; + +export type createDepositParams = { + nullifier: bigint; + secret: bigint; +}; + +export type createDepositObject = { + preimage: Uint8Array; + noteHex: string; + commitment: bigint; + commitmentHex: string; + nullifierHash: bigint; + nullifierHex: string; +}; + +export type createNoteParams = DepositType & { + nullifier?: bigint; + secret?: bigint; +}; + +export type parsedNoteExec = DepositType & { + note: string; +}; + +export type depositTx = { + from: string; + transactionHash: string; +}; + +export type withdrawalTx = { + to: string; + transactionHash: string; +}; + +export async function createDeposit({ nullifier, secret }: createDepositParams): Promise { + const preimage = new Uint8Array([...leInt2Buff(nullifier), ...leInt2Buff(secret)]); + const noteHex = toFixedHex(bytesToBN(preimage), 62); + const commitment = BigInt(await buffPedersenHash(preimage)); + const commitmentHex = toFixedHex(commitment); + const nullifierHash = BigInt(await buffPedersenHash(leInt2Buff(nullifier))); + const nullifierHex = toFixedHex(nullifierHash); + + return { + preimage, + noteHex, + commitment, + commitmentHex, + nullifierHash, + nullifierHex, + }; +} + +export interface DepositConstructor { + currency: string; + amount: string; + netId: NetIdType; + nullifier: bigint; + secret: bigint; + note: string; + noteHex: string; + invoice: string; + commitmentHex: string; + nullifierHex: string; +} + +export class Deposit { + currency: string; + amount: string; + netId: NetIdType; + + nullifier: bigint; + secret: bigint; + + note: string; + noteHex: string; + invoice: string; + + commitmentHex: string; + nullifierHex: string; + + constructor({ + currency, + amount, + netId, + nullifier, + secret, + note, + noteHex, + invoice, + commitmentHex, + nullifierHex, + }: DepositConstructor) { + this.currency = currency; + this.amount = amount; + this.netId = netId; + + this.nullifier = nullifier; + this.secret = secret; + + this.note = note; + this.noteHex = noteHex; + this.invoice = invoice; + + this.commitmentHex = commitmentHex; + this.nullifierHex = nullifierHex; + } + + toString() { + return JSON.stringify( + { + currency: this.currency, + amount: this.amount, + netId: this.netId, + nullifier: this.nullifier, + secret: this.secret, + note: this.note, + noteHex: this.noteHex, + invoice: this.invoice, + commitmentHex: this.commitmentHex, + nullifierHex: this.nullifierHex, + }, + null, + 2, + ); + } + + static async createNote({ currency, amount, netId, nullifier, secret }: createNoteParams): Promise { + if (!nullifier) { + nullifier = rBigInt(31); + } + if (!secret) { + secret = rBigInt(31); + } + + const depositObject = await createDeposit({ + nullifier, + secret, + }); + + const newDeposit = new Deposit({ + currency: currency.toLowerCase(), + amount: amount, + netId, + note: `tornado-${currency.toLowerCase()}-${amount}-${netId}-${depositObject.noteHex}`, + noteHex: depositObject.noteHex, + invoice: `tornadoInvoice-${currency.toLowerCase()}-${amount}-${netId}-${depositObject.commitmentHex}`, + nullifier: nullifier, + secret: secret, + commitmentHex: depositObject.commitmentHex, + nullifierHex: depositObject.nullifierHex, + }); + + return newDeposit; + } + + static async parseNote(noteString: string): Promise { + const noteRegex = /tornado-(?\w+)-(?[\d.]+)-(?\d+)-0x(?[0-9a-fA-F]{124})/g; + const match = noteRegex.exec(noteString); + if (!match) { + throw new Error('The note has invalid format'); + } + const matchGroup = match?.groups as unknown as parsedNoteExec; + + const currency = matchGroup.currency.toLowerCase(); + const amount = matchGroup.amount; + const netId = Number(matchGroup.netId); + + const bytes = bnToBytes('0x' + matchGroup.note); + const nullifier = BigInt(leBuff2Int(bytes.slice(0, 31)).toString()); + const secret = BigInt(leBuff2Int(bytes.slice(31, 62)).toString()); + + const depositObject = await createDeposit({ nullifier, secret }); + + const invoice = `tornadoInvoice-${currency}-${amount}-${netId}-${depositObject.commitmentHex}`; + + const newDeposit = new Deposit({ + currency, + amount, + netId, + note: noteString, + noteHex: depositObject.noteHex, + invoice, + nullifier, + secret, + commitmentHex: depositObject.commitmentHex, + nullifierHex: depositObject.nullifierHex, + }); + + return newDeposit; + } +} + +export type parsedInvoiceExec = DepositType & { + commitment: string; +}; + +export class Invoice { + currency: string; + amount: string; + netId: NetIdType; + commitment: string; + invoice: string; + + constructor(invoiceString: string) { + const invoiceRegex = + /tornadoInvoice-(?\w+)-(?[\d.]+)-(?\d+)-0x(?[0-9a-fA-F]{64})/g; + const match = invoiceRegex.exec(invoiceString); + if (!match) { + throw new Error('The note has invalid format'); + } + const matchGroup = match?.groups as unknown as parsedInvoiceExec; + + const currency = matchGroup.currency.toLowerCase(); + const amount = matchGroup.amount; + const netId = Number(matchGroup.netId); + + this.currency = currency; + this.amount = amount; + this.netId = netId; + + this.commitment = '0x' + matchGroup.commitment; + this.invoice = invoiceString; + } + + toString() { + return JSON.stringify( + { + currency: this.currency, + amount: this.amount, + netId: this.netId, + commitment: this.commitment, + invoice: this.invoice, + }, + null, + 2, + ); + } +} diff --git a/src/encryptedNotes.ts b/src/encryptedNotes.ts new file mode 100644 index 0000000..1064491 --- /dev/null +++ b/src/encryptedNotes.ts @@ -0,0 +1,189 @@ +import { getEncryptionPublicKey, encrypt, decrypt, EthEncryptedData } from '@metamask/eth-sig-util'; +import { Echoer } from '@tornado/contracts'; +import { Wallet, computeAddress, getAddress } from 'ethers'; +import { crypto, base64ToBytes, bytesToBase64, bytesToHex, hexToBytes, toFixedHex, concatBytes } from './utils'; +import { EchoEvents, EncryptedNotesEvents } from './events'; +import type { NetIdType } from './networkConfig'; + +export interface NoteToEncrypt { + address: string; + noteHex: string; +} + +export interface DecryptedNotes { + blockNumber: number; + address: string; + noteHex: string; +} + +export function packEncryptedMessage({ nonce, ephemPublicKey, ciphertext }: EthEncryptedData) { + const nonceBuf = toFixedHex(bytesToHex(base64ToBytes(nonce)), 24); + const ephemPublicKeyBuf = toFixedHex(bytesToHex(base64ToBytes(ephemPublicKey)), 32); + const ciphertextBuf = bytesToHex(base64ToBytes(ciphertext)); + + const messageBuff = concatBytes(hexToBytes(nonceBuf), hexToBytes(ephemPublicKeyBuf), hexToBytes(ciphertextBuf)); + + return bytesToHex(messageBuff); +} + +export function unpackEncryptedMessage(encryptedMessage: string) { + const messageBuff = hexToBytes(encryptedMessage); + const nonceBuf = bytesToBase64(messageBuff.slice(0, 24)); + const ephemPublicKeyBuf = bytesToBase64(messageBuff.slice(24, 56)); + const ciphertextBuf = bytesToBase64(messageBuff.slice(56)); + + return { + messageBuff: bytesToHex(messageBuff), + version: 'x25519-xsalsa20-poly1305', + nonce: nonceBuf, + ephemPublicKey: ephemPublicKeyBuf, + ciphertext: ciphertextBuf, + } as EthEncryptedData & { + messageBuff: string; + }; +} + +export interface NoteAccountConstructor { + netId: NetIdType; + blockNumber?: number; + // hex + recoveryKey?: string; + Echoer: Echoer; +} + +export class NoteAccount { + netId: NetIdType; + blockNumber?: number; + // Dedicated 32 bytes private key only used for note encryption, backed up to an Echoer and local for future derivation + // Note that unlike the private key it shouldn't have the 0x prefix + recoveryKey: string; + // Address derived from recoveryKey, only used for frontend UI + recoveryAddress: string; + // Note encryption public key derived from recoveryKey + recoveryPublicKey: string; + Echoer: Echoer; + + constructor({ netId, blockNumber, recoveryKey, Echoer }: NoteAccountConstructor) { + if (!recoveryKey) { + recoveryKey = bytesToHex(crypto.getRandomValues(new Uint8Array(32))).slice(2); + } + + this.netId = Math.floor(Number(netId)); + this.blockNumber = blockNumber; + this.recoveryKey = recoveryKey; + this.recoveryAddress = computeAddress('0x' + recoveryKey); + this.recoveryPublicKey = getEncryptionPublicKey(recoveryKey); + this.Echoer = Echoer; + } + + /** + * Intends to mock eth_getEncryptionPublicKey behavior from MetaMask + * In order to make the recoveryKey retrival from Echoer possible from the bare private key + */ + static getWalletPublicKey(wallet: Wallet) { + let { privateKey } = wallet; + + if (privateKey.startsWith('0x')) { + privateKey = privateKey.replace('0x', ''); + } + + // Should return base64 encoded public key + return getEncryptionPublicKey(privateKey); + } + + // This function intends to provide an encrypted value of recoveryKey for an on-chain Echoer backup purpose + // Thus, the pubKey should be derived by a Wallet instance or from Web3 wallets + // pubKey: base64 encoded 32 bytes key from https://docs.metamask.io/wallet/reference/eth_getencryptionpublickey/ + getEncryptedAccount(walletPublicKey: string) { + const encryptedData = encrypt({ + publicKey: walletPublicKey, + data: this.recoveryKey, + version: 'x25519-xsalsa20-poly1305', + }); + + const data = packEncryptedMessage(encryptedData); + + return { + // Use this later to save hexPrivateKey generated with + // Buffer.from(JSON.stringify(encryptedData)).toString('hex') + // As we don't use buffer with this library we should leave UI to do the rest + encryptedData, + // Data that could be used as an echo(data) params + data, + }; + } + + /** + * Decrypt Echoer backuped note encryption account with private keys + */ + decryptAccountsWithWallet(wallet: Wallet, events: EchoEvents[]): NoteAccount[] { + let { privateKey } = wallet; + + if (privateKey.startsWith('0x')) { + privateKey = privateKey.replace('0x', ''); + } + + const decryptedEvents = []; + + for (const event of events) { + try { + const unpackedMessage = unpackEncryptedMessage(event.encryptedAccount); + + const recoveryKey = decrypt({ + encryptedData: unpackedMessage, + privateKey, + }); + + decryptedEvents.push( + new NoteAccount({ + netId: this.netId, + blockNumber: event.blockNumber, + recoveryKey, + Echoer: this.Echoer, + }), + ); + } catch { + // decryption may fail for invalid accounts + continue; + } + } + + return decryptedEvents; + } + + decryptNotes(events: EncryptedNotesEvents[]): DecryptedNotes[] { + const decryptedEvents = []; + + for (const event of events) { + try { + const unpackedMessage = unpackEncryptedMessage(event.encryptedNote); + + const [address, noteHex] = decrypt({ + encryptedData: unpackedMessage, + privateKey: this.recoveryKey, + }).split('-'); + + decryptedEvents.push({ + blockNumber: event.blockNumber, + address: getAddress(address), + noteHex, + }); + } catch { + // decryption may fail for foreign notes + continue; + } + } + + return decryptedEvents; + } + + encryptNote({ address, noteHex }: NoteToEncrypt) { + const encryptedData = encrypt({ + publicKey: this.recoveryPublicKey, + data: `${address}-${noteHex}`, + version: 'x25519-xsalsa20-poly1305', + }); + + return packEncryptedMessage(encryptedData); + } +} diff --git a/src/events/base.ts b/src/events/base.ts new file mode 100644 index 0000000..8b79d62 --- /dev/null +++ b/src/events/base.ts @@ -0,0 +1,792 @@ +import { BaseContract, Provider, EventLog, TransactionResponse, getAddress, Block, ContractEventName } from 'ethers'; +import type { + Tornado, + TornadoRouter, + TornadoProxyLight, + Governance, + RelayerRegistry, + Echoer, +} from '@tornado/contracts'; +import * as graph from '../graphql'; +import { + BatchEventsService, + BatchBlockService, + BatchTransactionService, + BatchEventOnProgress, + BatchBlockOnProgress, +} from '../batch'; +import { fetchDataOptions } from '../providers'; +import type { NetIdType } from '../networkConfig'; +import type { + BaseEvents, + MinimalEvents, + DepositsEvents, + WithdrawalsEvents, + EncryptedNotesEvents, + AllGovernanceEvents, + GovernanceProposalCreatedEvents, + GovernanceVotedEvents, + GovernanceDelegatedEvents, + GovernanceUndelegatedEvents, + RegistersEvents, + BaseGraphEvents, + EchoEvents, +} from './types'; + +export const DEPOSIT = 'deposit'; +export const WITHDRAWAL = 'withdrawal'; + +export type BaseEventsServiceConstructor = { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + contract: BaseContract; + type?: string; + deployedBlock?: number; + fetchDataOptions?: fetchDataOptions; +}; + +export type BatchGraphOnProgress = ({ + type, + fromBlock, + toBlock, + count, +}: { + type?: ContractEventName; + fromBlock?: number; + toBlock?: number; + count?: number; +}) => void; + +export type BaseGraphParams = { + graphApi: string; + subgraphName: string; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +}; + +export class BaseEventsService { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + contract: BaseContract; + type: string; + deployedBlock: number; + batchEventsService: BatchEventsService; + fetchDataOptions?: fetchDataOptions; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + contract, + type = '', + deployedBlock = 0, + fetchDataOptions, + }: BaseEventsServiceConstructor) { + this.netId = netId; + this.provider = provider; + this.graphApi = graphApi; + this.subgraphName = subgraphName; + this.fetchDataOptions = fetchDataOptions; + + this.contract = contract; + this.type = type; + this.deployedBlock = deployedBlock; + + this.batchEventsService = new BatchEventsService({ + provider, + contract, + onProgress: this.updateEventProgress, + }); + } + + getInstanceName(): string { + return ''; + } + + getType(): string { + return this.type || ''; + } + + getGraphMethod(): string { + return ''; + } + + getGraphParams(): BaseGraphParams { + return { + graphApi: this.graphApi || '', + subgraphName: this.subgraphName || '', + fetchDataOptions: this.fetchDataOptions, + onProgress: this.updateGraphProgress, + }; + } + + /* eslint-disable @typescript-eslint/no-unused-vars */ + updateEventProgress({ percentage, type, fromBlock, toBlock, count }: Parameters[0]) {} + + updateBlockProgress({ percentage, currentIndex, totalIndex }: Parameters[0]) {} + + updateTransactionProgress({ percentage, currentIndex, totalIndex }: Parameters[0]) {} + + updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters[0]) {} + /* eslint-enable @typescript-eslint/no-unused-vars */ + + async formatEvents(events: EventLog[]): Promise { + // eslint-disable-next-line no-return-await + return await new Promise((resolve) => resolve(events as unknown as EventType[])); + } + + /** + * Get saved or cached events + */ + + async getEventsFromDB(): Promise> { + return { + events: [], + lastBlock: null, + }; + } + + async getEventsFromCache(): Promise> { + return { + events: [], + lastBlock: null, + }; + } + + async getSavedEvents(): Promise> { + let cachedEvents = await this.getEventsFromDB(); + + if (!cachedEvents || !cachedEvents.events.length) { + cachedEvents = await this.getEventsFromCache(); + } + + return cachedEvents; + } + + /** + * Get latest events + */ + + async getEventsFromGraph({ + fromBlock, + methodName = '', + }: { + fromBlock: number; + methodName?: string; + }): Promise> { + if (!this.graphApi || !this.subgraphName) { + return { + events: [], + lastBlock: fromBlock, + }; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { events, lastSyncBlock } = (await (graph as any)[methodName || this.getGraphMethod()]({ + fromBlock, + ...this.getGraphParams(), + })) as BaseGraphEvents; + return { + events, + lastBlock: lastSyncBlock, + }; + } + + async getEventsFromRpc({ + fromBlock, + toBlock, + }: { + fromBlock: number; + toBlock?: number; + }): Promise> { + try { + if (!toBlock) { + toBlock = await this.provider.getBlockNumber(); + } + + if (fromBlock >= toBlock) { + return { + events: [], + lastBlock: toBlock, + }; + } + + this.updateEventProgress({ percentage: 0, type: this.getType() }); + + const events = await this.formatEvents( + await this.batchEventsService.getBatchEvents({ fromBlock, toBlock, type: this.getType() }), + ); + + if (!events.length) { + return { + events, + lastBlock: toBlock, + }; + } + + return { + events, + lastBlock: toBlock, + }; + } catch (err) { + console.log(err); + return { + events: [], + lastBlock: fromBlock, + }; + } + } + + async getLatestEvents({ fromBlock }: { fromBlock: number }): Promise> { + const allEvents = []; + const graphEvents = await this.getEventsFromGraph({ fromBlock }); + const lastSyncBlock = + graphEvents.lastBlock && graphEvents.lastBlock >= fromBlock ? graphEvents.lastBlock : fromBlock; + const rpcEvents = await this.getEventsFromRpc({ fromBlock: lastSyncBlock }); + allEvents.push(...graphEvents.events); + allEvents.push(...rpcEvents.events); + const lastBlock = rpcEvents + ? rpcEvents.lastBlock + : allEvents[allEvents.length - 1] + ? allEvents[allEvents.length - 1].blockNumber + : fromBlock; + + return { + events: allEvents, + lastBlock, + }; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + validateEvents({ events, lastBlock }: BaseEvents) {} + + /** + * Handle saving events + */ + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async saveEvents({ events, lastBlock }: BaseEvents) {} + + /** + * Trigger saving and receiving latest events + */ + + async updateEvents() { + const savedEvents = await this.getSavedEvents(); + + let fromBlock = this.deployedBlock; + + if (savedEvents && savedEvents.lastBlock) { + fromBlock = savedEvents.lastBlock + 1; + } + + const newEvents = await this.getLatestEvents({ fromBlock }); + + const eventSet = new Set(); + + let allEvents: EventType[] = []; + + allEvents.push(...savedEvents.events); + allEvents.push(...newEvents.events); + + allEvents = allEvents + .sort((a, b) => { + if (a.blockNumber === b.blockNumber) { + return a.logIndex - b.logIndex; + } + return a.blockNumber - b.blockNumber; + }) + .filter(({ transactionHash, logIndex }) => { + const eventKey = `${transactionHash}_${logIndex}`; + const hasEvent = eventSet.has(eventKey); + eventSet.add(eventKey); + return !hasEvent; + }); + const lastBlock = newEvents + ? newEvents.lastBlock + : allEvents[allEvents.length - 1] + ? allEvents[allEvents.length - 1].blockNumber + : null; + + this.validateEvents({ events: allEvents, lastBlock }); + + await this.saveEvents({ events: allEvents, lastBlock }); + + return { + events: allEvents, + lastBlock, + }; + } +} + +export type BaseDepositsServiceConstructor = { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + Tornado: Tornado; + type: string; + amount: string; + currency: string; + deployedBlock?: number; + fetchDataOptions?: fetchDataOptions; +}; + +export type DepositsGraphParams = BaseGraphParams & { + amount: string; + currency: string; +}; + +export class BaseDepositsService extends BaseEventsService { + amount: string; + currency: string; + batchTransactionService: BatchTransactionService; + batchBlockService: BatchBlockService; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + Tornado, + type, + amount, + currency, + deployedBlock, + fetchDataOptions, + }: BaseDepositsServiceConstructor) { + super({ netId, provider, graphApi, subgraphName, contract: Tornado, type, deployedBlock, fetchDataOptions }); + + this.amount = amount; + this.currency = currency; + + this.batchTransactionService = new BatchTransactionService({ + provider, + onProgress: this.updateTransactionProgress, + }); + + this.batchBlockService = new BatchBlockService({ + provider, + onProgress: this.updateBlockProgress, + }); + } + + getInstanceName(): string { + return `${this.getType().toLowerCase()}s_${this.netId}_${this.currency}_${this.amount}`; + } + + getGraphMethod(): string { + return `getAll${this.getType()}s`; + } + + getGraphParams(): DepositsGraphParams { + return { + graphApi: this.graphApi || '', + subgraphName: this.subgraphName || '', + amount: this.amount, + currency: this.currency, + fetchDataOptions: this.fetchDataOptions, + onProgress: this.updateGraphProgress, + }; + } + + async formatEvents(events: EventLog[]): Promise<(DepositsEvents | WithdrawalsEvents)[]> { + const type = this.getType().toLowerCase(); + if (type === DEPOSIT) { + const formattedEvents = events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { + const { commitment, leafIndex, timestamp } = args; + + return { + blockNumber, + logIndex, + transactionHash, + commitment: commitment as string, + leafIndex: Number(leafIndex), + timestamp: Number(timestamp), + }; + }); + + const txs = await this.batchTransactionService.getBatchTransactions([ + ...new Set(formattedEvents.map(({ transactionHash }) => transactionHash)), + ]); + + return formattedEvents.map((event) => { + const { from } = txs.find(({ hash }) => hash === event.transactionHash) as TransactionResponse; + + return { + ...event, + from, + }; + }); + } else { + const formattedEvents = events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { + const { nullifierHash, to, fee } = args; + + return { + blockNumber, + logIndex, + transactionHash, + nullifierHash: String(nullifierHash), + to: getAddress(to), + fee: String(fee), + }; + }); + + const blocks = await this.batchBlockService.getBatchBlocks([ + ...new Set(formattedEvents.map(({ blockNumber }) => blockNumber)), + ]); + + return formattedEvents.map((event) => { + const { timestamp } = blocks.find(({ number }) => number === event.blockNumber) as Block; + + return { + ...event, + timestamp, + }; + }); + } + } + + validateEvents({ events }: { events: (DepositsEvents | WithdrawalsEvents)[] }) { + if (events.length && this.getType().toLowerCase() === DEPOSIT) { + const lastEvent = events[events.length - 1] as DepositsEvents; + + if (lastEvent.leafIndex !== events.length - 1) { + const errMsg = `Deposit events invalid wants ${events.length - 1} leafIndex have ${lastEvent.leafIndex}`; + throw new Error(errMsg); + } + } + } +} + +export type BaseEchoServiceConstructor = { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + Echoer: Echoer; + deployedBlock?: number; + fetchDataOptions?: fetchDataOptions; +}; + +export class BaseEchoService extends BaseEventsService { + constructor({ + netId, + provider, + graphApi, + subgraphName, + Echoer, + deployedBlock, + fetchDataOptions, + }: BaseEchoServiceConstructor) { + super({ netId, provider, graphApi, subgraphName, contract: Echoer, deployedBlock, fetchDataOptions }); + } + + getInstanceName(): string { + return `echo_${this.netId}`; + } + + getType(): string { + return 'Echo'; + } + + getGraphMethod(): string { + return 'getAllGraphEchoEvents'; + } + + async formatEvents(events: EventLog[]) { + return events + .map(({ blockNumber, index: logIndex, transactionHash, args }) => { + const { who, data } = args; + + if (who && data) { + const eventObjects = { + blockNumber, + logIndex, + transactionHash, + }; + + return { + ...eventObjects, + address: who, + encryptedAccount: data, + }; + } + }) + .filter((e) => e) as EchoEvents[]; + } + + async getEventsFromGraph({ fromBlock }: { fromBlock: number }): Promise> { + // TheGraph doesn't support our batch sync due to missing blockNumber field + if (!this.graphApi || this.graphApi.includes('api.thegraph.com')) { + return { + events: [], + lastBlock: fromBlock, + }; + } + + return super.getEventsFromGraph({ fromBlock }); + } +} + +export type BaseEncryptedNotesServiceConstructor = { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + Router: TornadoRouter | TornadoProxyLight; + deployedBlock?: number; + fetchDataOptions?: fetchDataOptions; +}; + +export class BaseEncryptedNotesService extends BaseEventsService { + constructor({ + netId, + provider, + graphApi, + subgraphName, + Router, + deployedBlock, + fetchDataOptions, + }: BaseEncryptedNotesServiceConstructor) { + super({ netId, provider, graphApi, subgraphName, contract: Router, deployedBlock, fetchDataOptions }); + } + + getInstanceName(): string { + return `encrypted_notes_${this.netId}`; + } + + getType(): string { + return 'EncryptedNote'; + } + + getGraphMethod(): string { + return 'getAllEncryptedNotes'; + } + + async formatEvents(events: EventLog[]) { + return events + .map(({ blockNumber, index: logIndex, transactionHash, args }) => { + const { encryptedNote } = args; + + if (encryptedNote) { + const eventObjects = { + blockNumber, + logIndex, + transactionHash, + }; + + return { + ...eventObjects, + encryptedNote, + }; + } + }) + .filter((e) => e) as EncryptedNotesEvents[]; + } +} + +export type BaseGovernanceServiceConstructor = { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + Governance: Governance; + deployedBlock?: number; + fetchDataOptions?: fetchDataOptions; +}; + +export class BaseGovernanceService extends BaseEventsService { + batchTransactionService: BatchTransactionService; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + Governance, + deployedBlock, + fetchDataOptions, + }: BaseGovernanceServiceConstructor) { + super({ netId, provider, graphApi, subgraphName, contract: Governance, deployedBlock, fetchDataOptions }); + + this.batchTransactionService = new BatchTransactionService({ + provider, + onProgress: this.updateTransactionProgress, + }); + } + + getInstanceName() { + return `governance_${this.netId}`; + } + + getType() { + return '*'; + } + + getGraphMethod() { + return 'getAllGovernanceEvents'; + } + + async formatEvents(events: EventLog[]): Promise { + const proposalEvents: GovernanceProposalCreatedEvents[] = []; + const votedEvents: GovernanceVotedEvents[] = []; + const delegatedEvents: GovernanceDelegatedEvents[] = []; + const undelegatedEvents: GovernanceUndelegatedEvents[] = []; + + events.forEach(({ blockNumber, index: logIndex, transactionHash, args, eventName: event }) => { + const eventObjects = { + blockNumber, + logIndex, + transactionHash, + event, + }; + + if (event === 'ProposalCreated') { + const { id, proposer, target, startTime, endTime, description } = args; + + proposalEvents.push({ + ...eventObjects, + id: Number(id), + proposer, + target, + startTime: Number(startTime), + endTime: Number(endTime), + description, + }); + } + + if (event === 'Voted') { + const { proposalId, voter, support, votes } = args; + + votedEvents.push({ + ...eventObjects, + proposalId: Number(proposalId), + voter, + support, + votes, + from: '', + input: '', + }); + } + + if (event === 'Delegated') { + const { account, to: delegateTo } = args; + + delegatedEvents.push({ + ...eventObjects, + account, + delegateTo, + }); + } + + if (event === 'Undelegated') { + const { account, from: delegateFrom } = args; + + undelegatedEvents.push({ + ...eventObjects, + account, + delegateFrom, + }); + } + }); + + if (votedEvents.length) { + this.updateTransactionProgress({ percentage: 0 }); + + const txs = await this.batchTransactionService.getBatchTransactions([ + ...new Set(votedEvents.map(({ transactionHash }) => transactionHash)), + ]); + + votedEvents.forEach((event, index) => { + // eslint-disable-next-line prefer-const + let { data: input, from } = txs.find((t) => t.hash === event.transactionHash) as TransactionResponse; + + // Filter spammy txs + if (!input || input.length > 2048) { + input = ''; + } + + votedEvents[index].from = from; + votedEvents[index].input = input; + }); + } + + return [...proposalEvents, ...votedEvents, ...delegatedEvents, ...undelegatedEvents]; + } + + async getEventsFromGraph({ fromBlock }: { fromBlock: number }): Promise> { + // TheGraph doesn't support governance subgraphs + if (!this.graphApi || !this.subgraphName || this.graphApi.includes('api.thegraph.com')) { + return { + events: [], + lastBlock: fromBlock, + }; + } + + return super.getEventsFromGraph({ fromBlock }); + } +} + +export type BaseRegistryServiceConstructor = { + netId: NetIdType; + provider: Provider; + graphApi?: string; + subgraphName?: string; + RelayerRegistry: RelayerRegistry; + deployedBlock?: number; + fetchDataOptions?: fetchDataOptions; +}; + +export class BaseRegistryService extends BaseEventsService { + constructor({ + netId, + provider, + graphApi, + subgraphName, + RelayerRegistry, + deployedBlock, + fetchDataOptions, + }: BaseRegistryServiceConstructor) { + super({ netId, provider, graphApi, subgraphName, contract: RelayerRegistry, deployedBlock, fetchDataOptions }); + } + + getInstanceName() { + return `registered_${this.netId}`; + } + + // Name of type used for events + getType() { + return 'RelayerRegistered'; + } + + // Name of method used for graph + getGraphMethod() { + return 'getAllRegisters'; + } + + async formatEvents(events: EventLog[]) { + return events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { + const eventObjects = { + blockNumber, + logIndex, + transactionHash, + }; + + return { + ...eventObjects, + ensName: args.ensName, + relayerAddress: args.relayerAddress, + }; + }); + } + + async fetchRelayers(): Promise { + return (await this.updateEvents()).events; + } +} diff --git a/src/events/index.ts b/src/events/index.ts new file mode 100644 index 0000000..c386db6 --- /dev/null +++ b/src/events/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './base'; +export * from './node'; diff --git a/src/events/node.ts b/src/events/node.ts new file mode 100644 index 0000000..738ea5f --- /dev/null +++ b/src/events/node.ts @@ -0,0 +1,780 @@ +import Table from 'cli-table3'; +import moment from 'moment'; +import { BatchBlockOnProgress, BatchEventOnProgress } from '../batch'; +import { saveUserFile, loadSavedEvents, loadCachedEvents } from '../data'; +import { + BaseDepositsService, + BaseEncryptedNotesService, + BaseGovernanceService, + BaseRegistryService, + BaseDepositsServiceConstructor, + BaseEncryptedNotesServiceConstructor, + BaseGovernanceServiceConstructor, + BaseRegistryServiceConstructor, + BaseEchoServiceConstructor, + BaseEchoService, +} from './base'; +import type { + BaseEvents, + DepositsEvents, + WithdrawalsEvents, + EncryptedNotesEvents, + RegistersEvents, + AllGovernanceEvents, + EchoEvents, +} from './types'; + +export type NodeDepositsServiceConstructor = BaseDepositsServiceConstructor & { + cacheDirectory?: string; + userDirectory?: string; +}; + +export class NodeDepositsService extends BaseDepositsService { + cacheDirectory?: string; + userDirectory?: string; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + Tornado, + type, + amount, + currency, + deployedBlock, + fetchDataOptions, + cacheDirectory, + userDirectory, + }: NodeDepositsServiceConstructor) { + super({ + netId, + provider, + graphApi, + subgraphName, + Tornado, + type, + amount, + currency, + deployedBlock, + fetchDataOptions, + }); + + this.cacheDirectory = cacheDirectory; + this.userDirectory = userDirectory; + } + + updateEventProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from ${fromBlock} to ${toBlock}\n`); + } + } + } + + updateTransactionProgress({ currentIndex, totalIndex }: Parameters[0]) { + if (totalIndex) { + console.log(`Fetched ${currentIndex} deposit txs of ${totalIndex}`); + } + } + + updateBlockProgress({ currentIndex, totalIndex }: Parameters[0]) { + if (totalIndex) { + console.log(`Fetched ${currentIndex} withdrawal blocks of ${totalIndex}`); + } + } + + updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events from graph node count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from graph node ${fromBlock} to ${toBlock}\n`); + } + } + } + + async getEventsFromDB() { + if (!this.userDirectory) { + console.log( + 'Updating events for', + this.amount, + this.currency.toUpperCase(), + `${this.getType().toLowerCase()}s\n`, + ); + console.log(`savedEvents count - ${0}`); + console.log(`savedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const savedEvents = await loadSavedEvents({ + name: this.getInstanceName(), + userDirectory: this.userDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log('Updating events for', this.amount, this.currency.toUpperCase(), `${this.getType().toLowerCase()}s\n`); + console.log(`savedEvents count - ${savedEvents.events.length}`); + console.log(`savedEvents lastBlock - ${savedEvents.lastBlock}\n`); + + return savedEvents; + } + + async getEventsFromCache() { + if (!this.cacheDirectory) { + console.log(`cachedEvents count - ${0}`); + console.log(`cachedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const cachedEvents = await loadCachedEvents({ + name: this.getInstanceName(), + cacheDirectory: this.cacheDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`cachedEvents count - ${cachedEvents.events.length}`); + console.log(`cachedEvents lastBlock - ${cachedEvents.lastBlock}\n`); + + return cachedEvents; + } + + async saveEvents({ events, lastBlock }: BaseEvents) { + const instanceName = this.getInstanceName(); + + console.log('\ntotalEvents count - ', events.length); + console.log( + `totalEvents lastBlock - ${events[events.length - 1] ? events[events.length - 1].blockNumber : lastBlock}\n`, + ); + + const eventTable = new Table(); + + eventTable.push( + [{ colSpan: 2, content: `${this.getType()}s`, hAlign: 'center' }], + ['Instance', `${this.netId} chain ${this.amount} ${this.currency.toUpperCase()}`], + ['Anonymity set', `${events.length} equal user ${this.getType().toLowerCase()}s`], + [{ colSpan: 2, content: `Latest ${this.getType().toLowerCase()}s` }], + ...events + .slice(events.length - 10) + .reverse() + .map(({ timestamp }, index) => { + const eventIndex = events.length - index; + const eventTime = moment.unix(timestamp).fromNow(); + + return [eventIndex, eventTime]; + }), + ); + + console.log(eventTable.toString() + '\n'); + + if (this.userDirectory) { + await saveUserFile({ + fileName: instanceName + '.json', + userDirectory: this.userDirectory, + dataString: JSON.stringify(events, null, 2) + '\n', + }); + } + } +} + +export type NodeEchoServiceConstructor = BaseEchoServiceConstructor & { + cacheDirectory?: string; + userDirectory?: string; +}; + +export class NodeEchoService extends BaseEchoService { + cacheDirectory?: string; + userDirectory?: string; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + Echoer, + deployedBlock, + fetchDataOptions, + cacheDirectory, + userDirectory, + }: NodeEchoServiceConstructor) { + super({ + netId, + provider, + graphApi, + subgraphName, + Echoer, + deployedBlock, + fetchDataOptions, + }); + + this.cacheDirectory = cacheDirectory; + this.userDirectory = userDirectory; + } + + updateEventProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from ${fromBlock} to ${toBlock}\n`); + } + } + } + + updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events from graph node count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from graph node ${fromBlock} to ${toBlock}\n`); + } + } + } + + async getEventsFromDB() { + if (!this.userDirectory) { + console.log(`Updating events for ${this.netId} chain echo events\n`); + console.log(`savedEvents count - ${0}`); + console.log(`savedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const savedEvents = await loadSavedEvents({ + name: this.getInstanceName(), + userDirectory: this.userDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`Updating events for ${this.netId} chain echo events\n`); + console.log(`savedEvents count - ${savedEvents.events.length}`); + console.log(`savedEvents lastBlock - ${savedEvents.lastBlock}\n`); + + return savedEvents; + } + + async getEventsFromCache() { + if (!this.cacheDirectory) { + console.log(`cachedEvents count - ${0}`); + console.log(`cachedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const cachedEvents = await loadCachedEvents({ + name: this.getInstanceName(), + cacheDirectory: this.cacheDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`cachedEvents count - ${cachedEvents.events.length}`); + console.log(`cachedEvents lastBlock - ${cachedEvents.lastBlock}\n`); + + return cachedEvents; + } + + async saveEvents({ events, lastBlock }: BaseEvents) { + const instanceName = this.getInstanceName(); + + console.log('\ntotalEvents count - ', events.length); + console.log( + `totalEvents lastBlock - ${events[events.length - 1] ? events[events.length - 1].blockNumber : lastBlock}\n`, + ); + + const eventTable = new Table(); + + eventTable.push( + [{ colSpan: 2, content: 'Echo Accounts', hAlign: 'center' }], + ['Network', `${this.netId} chain`], + ['Events', `${events.length} events`], + [{ colSpan: 2, content: 'Latest events' }], + ...events + .slice(events.length - 10) + .reverse() + .map(({ blockNumber }, index) => { + const eventIndex = events.length - index; + + return [eventIndex, blockNumber]; + }), + ); + + console.log(eventTable.toString() + '\n'); + + if (this.userDirectory) { + await saveUserFile({ + fileName: instanceName + '.json', + userDirectory: this.userDirectory, + dataString: JSON.stringify(events, null, 2) + '\n', + }); + } + } +} + +export type NodeEncryptedNotesServiceConstructor = BaseEncryptedNotesServiceConstructor & { + cacheDirectory?: string; + userDirectory?: string; +}; + +export class NodeEncryptedNotesService extends BaseEncryptedNotesService { + cacheDirectory?: string; + userDirectory?: string; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + Router, + deployedBlock, + fetchDataOptions, + cacheDirectory, + userDirectory, + }: NodeEncryptedNotesServiceConstructor) { + super({ + netId, + provider, + graphApi, + subgraphName, + Router, + deployedBlock, + fetchDataOptions, + }); + + this.cacheDirectory = cacheDirectory; + this.userDirectory = userDirectory; + } + + updateEventProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from ${fromBlock} to ${toBlock}\n`); + } + } + } + + updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events from graph node count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from graph node ${fromBlock} to ${toBlock}\n`); + } + } + } + + async getEventsFromDB() { + if (!this.userDirectory) { + console.log(`Updating events for ${this.netId} chain encrypted events\n`); + console.log(`savedEvents count - ${0}`); + console.log(`savedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const savedEvents = await loadSavedEvents({ + name: this.getInstanceName(), + userDirectory: this.userDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`Updating events for ${this.netId} chain encrypted events\n`); + console.log(`savedEvents count - ${savedEvents.events.length}`); + console.log(`savedEvents lastBlock - ${savedEvents.lastBlock}\n`); + + return savedEvents; + } + + async getEventsFromCache() { + if (!this.cacheDirectory) { + console.log(`cachedEvents count - ${0}`); + console.log(`cachedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const cachedEvents = await loadCachedEvents({ + name: this.getInstanceName(), + cacheDirectory: this.cacheDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`cachedEvents count - ${cachedEvents.events.length}`); + console.log(`cachedEvents lastBlock - ${cachedEvents.lastBlock}\n`); + + return cachedEvents; + } + + async saveEvents({ events, lastBlock }: BaseEvents) { + const instanceName = this.getInstanceName(); + + console.log('\ntotalEvents count - ', events.length); + console.log( + `totalEvents lastBlock - ${events[events.length - 1] ? events[events.length - 1].blockNumber : lastBlock}\n`, + ); + + const eventTable = new Table(); + + eventTable.push( + [{ colSpan: 2, content: 'Encrypted Notes', hAlign: 'center' }], + ['Network', `${this.netId} chain`], + ['Events', `${events.length} events`], + [{ colSpan: 2, content: 'Latest events' }], + ...events + .slice(events.length - 10) + .reverse() + .map(({ blockNumber }, index) => { + const eventIndex = events.length - index; + + return [eventIndex, blockNumber]; + }), + ); + + console.log(eventTable.toString() + '\n'); + + if (this.userDirectory) { + await saveUserFile({ + fileName: instanceName + '.json', + userDirectory: this.userDirectory, + dataString: JSON.stringify(events, null, 2) + '\n', + }); + } + } +} + +export type NodeGovernanceServiceConstructor = BaseGovernanceServiceConstructor & { + cacheDirectory?: string; + userDirectory?: string; +}; + +export class NodeGovernanceService extends BaseGovernanceService { + cacheDirectory?: string; + userDirectory?: string; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + Governance, + deployedBlock, + fetchDataOptions, + cacheDirectory, + userDirectory, + }: NodeGovernanceServiceConstructor) { + super({ + netId, + provider, + graphApi, + subgraphName, + Governance, + deployedBlock, + fetchDataOptions, + }); + + this.cacheDirectory = cacheDirectory; + this.userDirectory = userDirectory; + } + + updateEventProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from ${fromBlock} to ${toBlock}\n`); + } + } + } + + updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events from graph node count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from graph node ${fromBlock} to ${toBlock}\n`); + } + } + } + + updateTransactionProgress({ currentIndex, totalIndex }: Parameters[0]) { + if (totalIndex) { + console.log(`Fetched ${currentIndex} governance txs of ${totalIndex}`); + } + } + + async getEventsFromDB() { + if (!this.userDirectory) { + console.log(`Updating events for ${this.netId} chain governance events\n`); + console.log(`savedEvents count - ${0}`); + console.log(`savedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const savedEvents = await loadSavedEvents({ + name: this.getInstanceName(), + userDirectory: this.userDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`Updating events for ${this.netId} chain governance events\n`); + console.log(`savedEvents count - ${savedEvents.events.length}`); + console.log(`savedEvents lastBlock - ${savedEvents.lastBlock}\n`); + + return savedEvents; + } + + async getEventsFromCache() { + if (!this.cacheDirectory) { + console.log(`cachedEvents count - ${0}`); + console.log(`cachedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const cachedEvents = await loadCachedEvents({ + name: this.getInstanceName(), + cacheDirectory: this.cacheDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`cachedEvents count - ${cachedEvents.events.length}`); + console.log(`cachedEvents lastBlock - ${cachedEvents.lastBlock}\n`); + + return cachedEvents; + } + + async saveEvents({ events, lastBlock }: BaseEvents) { + const instanceName = this.getInstanceName(); + + console.log('\ntotalEvents count - ', events.length); + console.log( + `totalEvents lastBlock - ${events[events.length - 1] ? events[events.length - 1].blockNumber : lastBlock}\n`, + ); + + const eventTable = new Table(); + + eventTable.push( + [{ colSpan: 2, content: 'Governance Events', hAlign: 'center' }], + ['Network', `${this.netId} chain`], + ['Events', `${events.length} events`], + [{ colSpan: 2, content: 'Latest events' }], + ...events + .slice(events.length - 10) + .reverse() + .map(({ blockNumber }, index) => { + const eventIndex = events.length - index; + + return [eventIndex, blockNumber]; + }), + ); + + console.log(eventTable.toString() + '\n'); + + if (this.userDirectory) { + await saveUserFile({ + fileName: instanceName + '.json', + userDirectory: this.userDirectory, + dataString: JSON.stringify(events, null, 2) + '\n', + }); + } + } +} + +export type NodeRegistryServiceConstructor = BaseRegistryServiceConstructor & { + cacheDirectory?: string; + userDirectory?: string; +}; + +export class NodeRegistryService extends BaseRegistryService { + cacheDirectory?: string; + userDirectory?: string; + + constructor({ + netId, + provider, + graphApi, + subgraphName, + RelayerRegistry, + deployedBlock, + fetchDataOptions, + cacheDirectory, + userDirectory, + }: NodeRegistryServiceConstructor) { + super({ + netId, + provider, + graphApi, + subgraphName, + RelayerRegistry, + deployedBlock, + fetchDataOptions, + }); + + this.cacheDirectory = cacheDirectory; + this.userDirectory = userDirectory; + } + + updateEventProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from ${fromBlock} to ${toBlock}\n`); + } + } + } + + updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters[0]) { + if (toBlock) { + console.log(`fromBlock - ${fromBlock}`); + console.log(`toBlock - ${toBlock}`); + + if (count) { + console.log(`downloaded ${type} events from graph node count - ${count}`); + console.log('____________________________________________'); + console.log(`Fetched ${type} events from graph node ${fromBlock} to ${toBlock}\n`); + } + } + } + + async getEventsFromDB() { + if (!this.userDirectory) { + console.log(`Updating events for ${this.netId} chain registry events\n`); + console.log(`savedEvents count - ${0}`); + console.log(`savedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const savedEvents = await loadSavedEvents({ + name: this.getInstanceName(), + userDirectory: this.userDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`Updating events for ${this.netId} chain registry events\n`); + console.log(`savedEvents count - ${savedEvents.events.length}`); + console.log(`savedEvents lastBlock - ${savedEvents.lastBlock}\n`); + + return savedEvents; + } + + async getEventsFromCache() { + if (!this.cacheDirectory) { + console.log(`cachedEvents count - ${0}`); + console.log(`cachedEvents lastBlock - ${this.deployedBlock}\n`); + + return { + events: [], + lastBlock: this.deployedBlock, + }; + } + + const cachedEvents = await loadCachedEvents({ + name: this.getInstanceName(), + cacheDirectory: this.cacheDirectory, + deployedBlock: this.deployedBlock, + }); + + console.log(`cachedEvents count - ${cachedEvents.events.length}`); + console.log(`cachedEvents lastBlock - ${cachedEvents.lastBlock}\n`); + + return cachedEvents; + } + + async saveEvents({ events, lastBlock }: BaseEvents) { + const instanceName = this.getInstanceName(); + + console.log('\ntotalEvents count - ', events.length); + console.log( + `totalEvents lastBlock - ${events[events.length - 1] ? events[events.length - 1].blockNumber : lastBlock}\n`, + ); + + const eventTable = new Table(); + + eventTable.push( + [{ colSpan: 2, content: 'Registered Relayers', hAlign: 'center' }], + ['Network', `${this.netId} chain`], + ['Events', `${events.length} events`], + [{ colSpan: 2, content: 'Latest events' }], + ...events + .slice(events.length - 10) + .reverse() + .map(({ blockNumber }, index) => { + const eventIndex = events.length - index; + + return [eventIndex, blockNumber]; + }), + ); + + console.log(eventTable.toString() + '\n'); + + if (this.userDirectory) { + await saveUserFile({ + fileName: instanceName + '.json', + userDirectory: this.userDirectory, + dataString: JSON.stringify(events, null, 2) + '\n', + }); + } + } +} diff --git a/src/events/types.ts b/src/events/types.ts new file mode 100644 index 0000000..3a2ed69 --- /dev/null +++ b/src/events/types.ts @@ -0,0 +1,80 @@ +import { RelayerParams } from '../relayerClient'; + +export interface BaseEvents { + events: T[]; + lastBlock: number | null; +} + +export interface BaseGraphEvents { + events: T[]; + lastSyncBlock: number; +} + +export interface MinimalEvents { + blockNumber: number; + logIndex: number; + transactionHash: string; +} + +export type GovernanceEvents = MinimalEvents & { + event: string; +}; + +export type GovernanceProposalCreatedEvents = GovernanceEvents & { + id: number; + proposer: string; + target: string; + startTime: number; + endTime: number; + description: string; +}; + +export type GovernanceVotedEvents = GovernanceEvents & { + proposalId: number; + voter: string; + support: boolean; + votes: string; + from: string; + input: string; +}; + +export type GovernanceDelegatedEvents = GovernanceEvents & { + account: string; + delegateTo: string; +}; + +export type GovernanceUndelegatedEvents = GovernanceEvents & { + account: string; + delegateFrom: string; +}; + +export type AllGovernanceEvents = + | GovernanceProposalCreatedEvents + | GovernanceVotedEvents + | GovernanceDelegatedEvents + | GovernanceUndelegatedEvents; + +export type RegistersEvents = MinimalEvents & RelayerParams; + +export type DepositsEvents = MinimalEvents & { + commitment: string; + leafIndex: number; + timestamp: number; + from: string; +}; + +export type WithdrawalsEvents = MinimalEvents & { + nullifierHash: string; + to: string; + fee: string; + timestamp: number; +}; + +export type EchoEvents = MinimalEvents & { + address: string; + encryptedAccount: string; +}; + +export type EncryptedNotesEvents = MinimalEvents & { + encryptedNote: string; +}; diff --git a/src/fees.ts b/src/fees.ts new file mode 100644 index 0000000..5cd5187 --- /dev/null +++ b/src/fees.ts @@ -0,0 +1,124 @@ +import { Transaction, parseUnits } from 'ethers'; +import type { BigNumberish, TransactionLike } from 'ethers'; +import { OvmGasPriceOracle } from './typechain'; + +const DUMMY_ADDRESS = '0x1111111111111111111111111111111111111111'; + +const DUMMY_NONCE = '0x1111111111111111111111111111111111111111111111111111111111111111'; + +const DUMMY_WITHDRAW_DATA = + '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'; + +/** + * Example: + * + * amountInWei (0.1 ETH) * tokenDecimals (18) * tokenPriceInWei (0.0008) = 125 TOKEN + */ +export function convertETHToTokenAmount( + amountInWei: BigNumberish, + tokenPriceInWei: BigNumberish, + tokenDecimals: number = 18, +): bigint { + const tokenDecimalsMultiplier = BigInt(10 ** Number(tokenDecimals)); + return (BigInt(amountInWei) * tokenDecimalsMultiplier) / BigInt(tokenPriceInWei); +} + +export interface RelayerFeeParams { + gasPrice: BigNumberish; + gasLimit?: BigNumberish; + l1Fee?: BigNumberish; + denomination: BigNumberish; + ethRefund: BigNumberish; + tokenPriceInWei: BigNumberish; + tokenDecimals: number; + relayerFeePercent?: number; + isEth?: boolean; + premiumPercent?: number; +} + +export class TornadoFeeOracle { + ovmGasPriceOracle?: OvmGasPriceOracle; + + constructor(ovmGasPriceOracle?: OvmGasPriceOracle) { + if (ovmGasPriceOracle) { + this.ovmGasPriceOracle = ovmGasPriceOracle; + } + } + + /** + * Calculate L1 fee for op-stack chains + * + * This is required since relayers would pay the full transaction fees for users + */ + fetchL1OptimismFee(tx?: TransactionLike): Promise { + if (!this.ovmGasPriceOracle) { + return new Promise((resolve) => resolve(BigInt(0))); + } + + if (!tx) { + // this tx is only used to simulate bytes size of the encoded tx so has nothing to with the accuracy + // inspired by the old style classic-ui calculation + tx = { + type: 0, + gasLimit: 1_000_000, + nonce: Number(DUMMY_NONCE), + data: DUMMY_WITHDRAW_DATA, + gasPrice: parseUnits('1', 'gwei'), + from: DUMMY_ADDRESS, + to: DUMMY_ADDRESS, + }; + } + + return this.ovmGasPriceOracle.getL1Fee.staticCall(Transaction.from(tx).unsignedSerialized); + } + + /** + * We don't need to distinguish default refunds by tokens since most users interact with other defi protocols after withdrawal + * So we default with 1M gas which is enough for two or three swaps + * Using 30 gwei for default but it is recommended to supply cached gasPrice value from the UI + */ + defaultEthRefund(gasPrice?: BigNumberish, gasLimit?: BigNumberish): bigint { + return (gasPrice ? BigInt(gasPrice) : parseUnits('30', 'gwei')) * BigInt(gasLimit || 1_000_000); + } + + /** + * Calculates token amount for required ethRefund purchases required to calculate fees + */ + calculateTokenAmount(ethRefund: BigNumberish, tokenPriceInEth: BigNumberish, tokenDecimals?: number): bigint { + return convertETHToTokenAmount(ethRefund, tokenPriceInEth, tokenDecimals); + } + + /** + * Warning: For tokens you need to check if the fees are above denomination + * (Usually happens for small denomination pool or if the gas price is high) + */ + calculateRelayerFee({ + gasPrice, + gasLimit = 600_000, + l1Fee = 0, + denomination, + ethRefund = BigInt(0), + tokenPriceInWei, + tokenDecimals = 18, + relayerFeePercent = 0.33, + isEth = true, + premiumPercent = 20, + }: RelayerFeeParams): bigint { + const gasCosts = BigInt(gasPrice) * BigInt(gasLimit) + BigInt(l1Fee); + + const relayerFee = (BigInt(denomination) * BigInt(Math.floor(10000 * relayerFeePercent))) / BigInt(10000 * 100); + + if (isEth) { + // Add 20% premium + return ((gasCosts + relayerFee) * BigInt(premiumPercent ? 100 + premiumPercent : 100)) / BigInt(100); + } + + const feeInEth = gasCosts + BigInt(ethRefund); + + return ( + ((convertETHToTokenAmount(feeInEth, tokenPriceInWei, tokenDecimals) + relayerFee) * + BigInt(premiumPercent ? 100 + premiumPercent : 100)) / + BigInt(100) + ); + } +} diff --git a/src/graphql/index.ts b/src/graphql/index.ts new file mode 100644 index 0000000..7734fa8 --- /dev/null +++ b/src/graphql/index.ts @@ -0,0 +1,1138 @@ +import { getAddress } from 'ethers'; +import { fetchData, fetchDataOptions } from '../providers'; + +import type { + BaseGraphEvents, + RegistersEvents, + DepositsEvents, + WithdrawalsEvents, + EncryptedNotesEvents, + BatchGraphOnProgress, + EchoEvents, + AllGovernanceEvents, + GovernanceProposalCreatedEvents, + GovernanceVotedEvents, + GovernanceDelegatedEvents, + GovernanceUndelegatedEvents, +} from '../events'; +import { + _META, + GET_DEPOSITS, + GET_STATISTIC, + GET_REGISTERED, + GET_WITHDRAWALS, + GET_NOTE_ACCOUNTS, + GET_ENCRYPTED_NOTES, + GET_ECHO_EVENTS, + GET_GOVERNANCE_EVENTS, +} from './queries'; + +export * from './queries'; + +const isEmptyArray = (arr: object) => !Array.isArray(arr) || !arr.length; + +const first = 1000; + +export type queryGraphParams = { + graphApi: string; + subgraphName: string; + query: string; + variables?: { + [key: string]: string | number; + }; + fetchDataOptions?: fetchDataOptions; +}; + +export async function queryGraph({ + graphApi, + subgraphName, + query, + variables, + fetchDataOptions, +}: queryGraphParams): Promise { + const graphUrl = `${graphApi}/subgraphs/name/${subgraphName}`; + + const { data, errors } = await fetchData(graphUrl, { + ...fetchDataOptions, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }); + + if (errors) { + throw new Error(JSON.stringify(errors)); + } + + if (data?._meta?.hasIndexingErrors) { + throw new Error('Subgraph has indexing errors'); + } + + return data; +} + +export interface GraphStatistic { + deposits: { + index: string; + timestamp: string; + blockNumber: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getStatisticParams { + graphApi: string; + subgraphName: string; + currency: string; + amount: string; + fetchDataOptions?: fetchDataOptions; +} + +export interface getStatisticReturns { + events: { + timestamp: number; + leafIndex: number; + blockNumber: number; + }[]; + lastSyncBlock: null | number; +} + +export async function getStatistic({ + graphApi, + subgraphName, + currency, + amount, + fetchDataOptions, +}: getStatisticParams): Promise { + try { + const { + deposits, + _meta: { + block: { number: lastSyncBlock }, + }, + } = await queryGraph({ + graphApi, + subgraphName, + query: GET_STATISTIC, + variables: { + currency, + first: 10, + orderBy: 'index', + orderDirection: 'desc', + amount, + }, + fetchDataOptions, + }); + + const events = deposits + .map((e) => ({ + timestamp: Number(e.timestamp), + leafIndex: Number(e.index), + blockNumber: Number(e.blockNumber), + })) + .reverse(); + + const [lastEvent] = events.slice(-1); + + return { + events, + lastSyncBlock: lastEvent && lastEvent.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + }; + } catch (err) { + console.log('Error from getStatistic query'); + console.log(err); + return { + events: [], + lastSyncBlock: null, + }; + } +} + +export interface GraphMeta { + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getMetaParams { + graphApi: string; + subgraphName: string; + fetchDataOptions?: fetchDataOptions; +} + +export interface getMetaReturns { + lastSyncBlock: null | number; + hasIndexingErrors: null | boolean; +} + +export async function getMeta({ graphApi, subgraphName, fetchDataOptions }: getMetaParams): Promise { + try { + const { + _meta: { + block: { number: lastSyncBlock }, + hasIndexingErrors, + }, + } = await queryGraph({ + graphApi, + subgraphName, + query: _META, + fetchDataOptions, + }); + + return { + lastSyncBlock, + hasIndexingErrors, + }; + } catch (err) { + console.log('Error from getMeta query'); + console.log(err); + return { + lastSyncBlock: null, + hasIndexingErrors: null, + }; + } +} + +export interface GraphRegisters { + relayers: { + id: string; + address: string; + ensName: string; + blockRegistration: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getRegistersParams { + graphApi: string; + subgraphName: string; + fromBlock: number; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +} + +export function getRegisters({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, +}: getRegistersParams): Promise { + return queryGraph({ + graphApi, + subgraphName, + query: GET_REGISTERED, + variables: { + first, + fromBlock, + }, + fetchDataOptions, + }); +} + +export async function getAllRegisters({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, + onProgress, +}: getRegistersParams): Promise> { + try { + const events = []; + let lastSyncBlock = fromBlock; + + // eslint-disable-next-line no-constant-condition + while (true) { + let { + relayers: result, + _meta: { + // eslint-disable-next-line prefer-const + block: { number: currentBlock }, + }, + } = await getRegisters({ graphApi, subgraphName, fromBlock, fetchDataOptions }); + + lastSyncBlock = currentBlock; + + if (isEmptyArray(result)) { + break; + } + + const [firstEvent] = result; + const [lastEvent] = result.slice(-1); + + if (typeof onProgress === 'function') { + onProgress({ + type: 'Registers', + fromBlock: Number(firstEvent.blockRegistration), + toBlock: Number(lastEvent.blockRegistration), + count: result.length, + }); + } + + if (result.length < 900) { + events.push(...result); + break; + } + + result = result.filter(({ blockRegistration }) => blockRegistration !== lastEvent.blockRegistration); + fromBlock = Number(lastEvent.blockRegistration); + + events.push(...result); + } + + if (!events.length) { + return { + events: [], + lastSyncBlock, + }; + } + + const result = events.map(({ id, address, ensName, blockRegistration }) => { + const [transactionHash, logIndex] = id.split('-'); + + return { + blockNumber: Number(blockRegistration), + logIndex: Number(logIndex), + transactionHash, + ensName, + relayerAddress: getAddress(address), + }; + }); + + return { + events: result, + lastSyncBlock, + }; + } catch (err) { + console.log('Error from getAllRegisters query'); + console.log(err); + return { events: [], lastSyncBlock: fromBlock }; + } +} + +export interface GraphDeposits { + deposits: { + id: string; + blockNumber: string; + commitment: string; + index: string; + timestamp: string; + from: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getDepositsParams { + graphApi: string; + subgraphName: string; + currency: string; + amount: string; + fromBlock: number; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +} + +export function getDeposits({ + graphApi, + subgraphName, + currency, + amount, + fromBlock, + fetchDataOptions, +}: getDepositsParams): Promise { + return queryGraph({ + graphApi, + subgraphName, + query: GET_DEPOSITS, + variables: { + currency, + amount, + first, + fromBlock, + }, + fetchDataOptions, + }); +} + +export async function getAllDeposits({ + graphApi, + subgraphName, + currency, + amount, + fromBlock, + fetchDataOptions, + onProgress, +}: getDepositsParams): Promise> { + try { + const events = []; + let lastSyncBlock = fromBlock; + + // eslint-disable-next-line no-constant-condition + while (true) { + let { + deposits: result, + _meta: { + // eslint-disable-next-line prefer-const + block: { number: currentBlock }, + }, + } = await getDeposits({ graphApi, subgraphName, currency, amount, fromBlock, fetchDataOptions }); + + lastSyncBlock = currentBlock; + + if (isEmptyArray(result)) { + break; + } + + const [firstEvent] = result; + const [lastEvent] = result.slice(-1); + + if (typeof onProgress === 'function') { + onProgress({ + type: 'Deposits', + fromBlock: Number(firstEvent.blockNumber), + toBlock: Number(lastEvent.blockNumber), + count: result.length, + }); + } + + if (result.length < 900) { + events.push(...result); + break; + } + + result = result.filter(({ blockNumber }) => blockNumber !== lastEvent.blockNumber); + fromBlock = Number(lastEvent.blockNumber); + + events.push(...result); + } + + if (!events.length) { + return { + events: [], + lastSyncBlock, + }; + } + + const result = events.map(({ id, blockNumber, commitment, index, timestamp, from }) => { + const [transactionHash, logIndex] = id.split('-'); + + return { + blockNumber: Number(blockNumber), + logIndex: Number(logIndex), + transactionHash, + commitment, + leafIndex: Number(index), + timestamp: Number(timestamp), + from: getAddress(from), + }; + }); + + const [lastEvent] = result.slice(-1); + + return { + events: result, + lastSyncBlock: lastEvent && lastEvent.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + }; + } catch (err) { + console.log('Error from getAllDeposits query'); + console.log(err); + return { + events: [], + lastSyncBlock: fromBlock, + }; + } +} + +export interface GraphWithdrawals { + withdrawals: { + id: string; + blockNumber: string; + nullifier: string; + to: string; + fee: string; + timestamp: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getWithdrawalParams { + graphApi: string; + subgraphName: string; + currency: string; + amount: string; + fromBlock: number; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +} + +export function getWithdrawals({ + graphApi, + subgraphName, + currency, + amount, + fromBlock, + fetchDataOptions, +}: getWithdrawalParams): Promise { + return queryGraph({ + graphApi, + subgraphName, + query: GET_WITHDRAWALS, + variables: { + currency, + amount, + first, + fromBlock, + }, + fetchDataOptions, + }); +} + +export async function getAllWithdrawals({ + graphApi, + subgraphName, + currency, + amount, + fromBlock, + fetchDataOptions, + onProgress, +}: getWithdrawalParams): Promise> { + try { + const events = []; + let lastSyncBlock = fromBlock; + + // eslint-disable-next-line no-constant-condition + while (true) { + let { + withdrawals: result, + _meta: { + // eslint-disable-next-line prefer-const + block: { number: currentBlock }, + }, + } = await getWithdrawals({ graphApi, subgraphName, currency, amount, fromBlock, fetchDataOptions }); + + lastSyncBlock = currentBlock; + + if (isEmptyArray(result)) { + break; + } + + const [firstEvent] = result; + const [lastEvent] = result.slice(-1); + + if (typeof onProgress === 'function') { + onProgress({ + type: 'Withdrawals', + fromBlock: Number(firstEvent.blockNumber), + toBlock: Number(lastEvent.blockNumber), + count: result.length, + }); + } + + if (result.length < 900) { + events.push(...result); + break; + } + + result = result.filter(({ blockNumber }) => blockNumber !== lastEvent.blockNumber); + fromBlock = Number(lastEvent.blockNumber); + + events.push(...result); + } + + if (!events.length) { + return { + events: [], + lastSyncBlock, + }; + } + + const result = events.map(({ id, blockNumber, nullifier, to, fee, timestamp }) => { + const [transactionHash, logIndex] = id.split('-'); + + return { + blockNumber: Number(blockNumber), + logIndex: Number(logIndex), + transactionHash, + nullifierHash: nullifier, + to: getAddress(to), + fee, + timestamp: Number(timestamp), + }; + }); + + const [lastEvent] = result.slice(-1); + + return { + events: result, + lastSyncBlock: lastEvent && lastEvent.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + }; + } catch (err) { + console.log('Error from getAllWithdrawals query'); + console.log(err); + return { + events: [], + lastSyncBlock: fromBlock, + }; + } +} + +export interface GraphNoteAccounts { + noteAccounts: { + id: string; + index: string; + address: string; + encryptedAccount: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getNoteAccountsParams { + graphApi: string; + subgraphName: string; + address: string; + fetchDataOptions?: fetchDataOptions; +} + +export interface getNoteAccountsReturns { + events: { + id: string; + index: string; + address: string; + encryptedAccount: string; + }[]; + lastSyncBlock: null | number; +} + +export async function getNoteAccounts({ + graphApi, + subgraphName, + address, + fetchDataOptions, +}: getNoteAccountsParams): Promise { + try { + const { + noteAccounts: events, + _meta: { + block: { number: lastSyncBlock }, + }, + } = await queryGraph({ + graphApi, + subgraphName, + query: GET_NOTE_ACCOUNTS, + variables: { + address: address.toLowerCase(), + }, + fetchDataOptions, + }); + + return { + events, + lastSyncBlock, + }; + } catch (err) { + console.log('Error from getNoteAccounts query'); + console.log(err); + return { + events: [], + lastSyncBlock: null, + }; + } +} + +export interface GraphEchoEvents { + noteAccounts: { + id: string; + blockNumber: string; + address: string; + encryptedAccount: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getGraphEchoEventsParams { + graphApi: string; + subgraphName: string; + fromBlock: number; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +} + +export function getGraphEchoEvents({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, +}: getGraphEchoEventsParams): Promise { + return queryGraph({ + graphApi, + subgraphName, + query: GET_ECHO_EVENTS, + variables: { + first, + fromBlock, + }, + fetchDataOptions, + }); +} + +export async function getAllGraphEchoEvents({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, + onProgress, +}: getGraphEchoEventsParams): Promise> { + try { + const events = []; + let lastSyncBlock = fromBlock; + + // eslint-disable-next-line no-constant-condition + while (true) { + let { + noteAccounts: result, + _meta: { + // eslint-disable-next-line prefer-const + block: { number: currentBlock }, + }, + } = await getGraphEchoEvents({ graphApi, subgraphName, fromBlock, fetchDataOptions }); + + lastSyncBlock = currentBlock; + + if (isEmptyArray(result)) { + break; + } + + const [firstEvent] = result; + const [lastEvent] = result.slice(-1); + + if (typeof onProgress === 'function') { + onProgress({ + type: 'EchoEvents', + fromBlock: Number(firstEvent.blockNumber), + toBlock: Number(lastEvent.blockNumber), + count: result.length, + }); + } + + if (result.length < 900) { + events.push(...result); + break; + } + + result = result.filter(({ blockNumber }) => blockNumber !== lastEvent.blockNumber); + fromBlock = Number(lastEvent.blockNumber); + + events.push(...result); + } + + if (!events.length) { + return { + events: [], + lastSyncBlock, + }; + } + + const result = events.map((e) => { + const [transactionHash, logIndex] = e.id.split('-'); + + return { + blockNumber: Number(e.blockNumber), + logIndex: Number(logIndex), + transactionHash: transactionHash, + address: getAddress(e.address), + encryptedAccount: e.encryptedAccount, + }; + }); + + const [lastEvent] = result.slice(-1); + + return { + events: result, + lastSyncBlock: lastEvent && lastEvent.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + }; + } catch (err) { + console.log('Error from getAllGraphEchoEvents query'); + console.log(err); + return { + events: [], + lastSyncBlock: fromBlock, + }; + } +} + +export interface GraphEncryptedNotes { + encryptedNotes: { + blockNumber: string; + index: string; + transactionHash: string; + encryptedNote: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getEncryptedNotesParams { + graphApi: string; + subgraphName: string; + fromBlock: number; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +} + +export function getEncryptedNotes({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, +}: getEncryptedNotesParams): Promise { + return queryGraph({ + graphApi, + subgraphName, + query: GET_ENCRYPTED_NOTES, + variables: { + first, + fromBlock, + }, + fetchDataOptions, + }); +} + +export async function getAllEncryptedNotes({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, + onProgress, +}: getEncryptedNotesParams): Promise> { + try { + const events = []; + let lastSyncBlock = fromBlock; + + // eslint-disable-next-line no-constant-condition + while (true) { + let { + encryptedNotes: result, + _meta: { + // eslint-disable-next-line prefer-const + block: { number: currentBlock }, + }, + } = await getEncryptedNotes({ graphApi, subgraphName, fromBlock, fetchDataOptions }); + + lastSyncBlock = currentBlock; + + if (isEmptyArray(result)) { + break; + } + + const [firstEvent] = result; + const [lastEvent] = result.slice(-1); + + if (typeof onProgress === 'function') { + onProgress({ + type: 'EncryptedNotes', + fromBlock: Number(firstEvent.blockNumber), + toBlock: Number(lastEvent.blockNumber), + count: result.length, + }); + } + + if (result.length < 900) { + events.push(...result); + break; + } + + result = result.filter(({ blockNumber }) => blockNumber !== lastEvent.blockNumber); + fromBlock = Number(lastEvent.blockNumber); + + events.push(...result); + } + + if (!events.length) { + return { + events: [], + lastSyncBlock, + }; + } + + const result = events.map((e) => ({ + blockNumber: Number(e.blockNumber), + logIndex: Number(e.index), + transactionHash: e.transactionHash, + encryptedNote: e.encryptedNote, + })); + + const [lastEvent] = result.slice(-1); + + return { + events: result, + lastSyncBlock: lastEvent && lastEvent.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + }; + } catch (err) { + console.log('Error from getAllEncryptedNotes query'); + console.log(err); + return { + events: [], + lastSyncBlock: fromBlock, + }; + } +} + +export interface GraphGovernanceEvents { + proposals: { + blockNumber: number; + logIndex: number; + transactionHash: string; + proposalId: number; + proposer: string; + target: string; + startTime: number; + endTime: number; + description: string; + }[]; + votes: { + blockNumber: number; + logIndex: number; + transactionHash: string; + proposalId: number; + voter: string; + support: boolean; + votes: string; + from: string; + input: string; + }[]; + delegates: { + blockNumber: number; + logIndex: number; + transactionHash: string; + account: string; + delegateTo: string; + }[]; + undelegates: { + blockNumber: number; + logIndex: number; + transactionHash: string; + account: string; + delegateFrom: string; + }[]; + _meta: { + block: { + number: number; + }; + hasIndexingErrors: boolean; + }; +} + +export interface getGovernanceEventsParams { + graphApi: string; + subgraphName: string; + fromBlock: number; + fetchDataOptions?: fetchDataOptions; + onProgress?: BatchGraphOnProgress; +} + +export function getGovernanceEvents({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, +}: getGovernanceEventsParams): Promise { + return queryGraph({ + graphApi, + subgraphName, + query: GET_GOVERNANCE_EVENTS, + variables: { + first, + fromBlock, + }, + fetchDataOptions, + }); +} + +export async function getAllGovernanceEvents({ + graphApi, + subgraphName, + fromBlock, + fetchDataOptions, + onProgress, +}: getGovernanceEventsParams): Promise> { + try { + const result = []; + + let lastSyncBlock = fromBlock; + + // eslint-disable-next-line no-constant-condition + while (true) { + const { + proposals, + votes, + delegates, + undelegates, + _meta: { + block: { number: currentBlock }, + }, + } = await getGovernanceEvents({ graphApi, subgraphName, fromBlock, fetchDataOptions }); + + lastSyncBlock = currentBlock; + + const eventsLength = proposals.length + votes.length + delegates.length + undelegates.length; + + if (eventsLength === 0) { + break; + } + + const formattedProposals: GovernanceProposalCreatedEvents[] = proposals.map( + ({ blockNumber, logIndex, transactionHash, proposalId, proposer, target, startTime, endTime, description }) => { + return { + blockNumber: Number(blockNumber), + logIndex: Number(logIndex), + transactionHash, + event: 'ProposalCreated', + id: Number(proposalId), + proposer: getAddress(proposer), + target: getAddress(target), + startTime: Number(startTime), + endTime: Number(endTime), + description, + }; + }, + ); + + const formattedVotes: GovernanceVotedEvents[] = votes.map( + ({ blockNumber, logIndex, transactionHash, proposalId, voter, support, votes, from, input }) => { + // Filter spammy txs + if (!input || input.length > 2048) { + input = ''; + } + + return { + blockNumber: Number(blockNumber), + logIndex: Number(logIndex), + transactionHash, + event: 'Voted', + proposalId: Number(proposalId), + voter: getAddress(voter), + support, + votes, + from: getAddress(from), + input, + }; + }, + ); + + const formattedDelegates: GovernanceDelegatedEvents[] = delegates.map( + ({ blockNumber, logIndex, transactionHash, account, delegateTo }) => { + return { + blockNumber: Number(blockNumber), + logIndex: Number(logIndex), + transactionHash, + event: 'Delegated', + account: getAddress(account), + delegateTo: getAddress(delegateTo), + }; + }, + ); + + const formattedUndelegates: GovernanceUndelegatedEvents[] = undelegates.map( + ({ blockNumber, logIndex, transactionHash, account, delegateFrom }) => { + return { + blockNumber: Number(blockNumber), + logIndex: Number(logIndex), + transactionHash, + event: 'Undelegated', + account: getAddress(account), + delegateFrom: getAddress(delegateFrom), + }; + }, + ); + + let formattedEvents = [ + ...formattedProposals, + ...formattedVotes, + ...formattedDelegates, + ...formattedUndelegates, + ].sort((a, b) => { + if (a.blockNumber === b.blockNumber) { + return a.logIndex - b.logIndex; + } + return a.blockNumber - b.blockNumber; + }); + + if (eventsLength < 900) { + result.push(...formattedEvents); + break; + } + + const [firstEvent] = formattedEvents; + const [lastEvent] = formattedEvents.slice(-1); + + if (typeof onProgress === 'function') { + onProgress({ + type: 'Governance Events', + fromBlock: Number(firstEvent.blockNumber), + toBlock: Number(lastEvent.blockNumber), + count: eventsLength, + }); + } + + formattedEvents = formattedEvents.filter(({ blockNumber }) => blockNumber !== lastEvent.blockNumber); + + fromBlock = Number(lastEvent.blockNumber); + + result.push(...formattedEvents); + } + + const [lastEvent] = result.slice(-1); + + return { + events: result, + lastSyncBlock: lastEvent && lastEvent.blockNumber >= lastSyncBlock ? lastEvent.blockNumber + 1 : lastSyncBlock, + }; + } catch (err) { + console.log('Error from getAllGovernance query'); + console.log(err); + return { + events: [], + lastSyncBlock: fromBlock, + }; + } +} diff --git a/src/graphql/queries.ts b/src/graphql/queries.ts new file mode 100644 index 0000000..eda8189 --- /dev/null +++ b/src/graphql/queries.ts @@ -0,0 +1,197 @@ +export const GET_STATISTIC = ` + query getStatistic($currency: String!, $amount: String!, $first: Int, $orderBy: BigInt, $orderDirection: String) { + deposits(first: $first, orderBy: $orderBy, orderDirection: $orderDirection, where: { currency: $currency, amount: $amount }) { + index + timestamp + blockNumber + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const _META = ` + query getMeta { + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_REGISTERED = ` + query getRegistered($first: Int, $fromBlock: Int) { + relayers(first: $first, orderBy: blockRegistration, orderDirection: asc, where: { + blockRegistration_gte: $fromBlock + }) { + id + address + ensName + blockRegistration + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_DEPOSITS = ` + query getDeposits($currency: String!, $amount: String!, $first: Int, $fromBlock: Int) { + deposits(first: $first, orderBy: index, orderDirection: asc, where: { + amount: $amount, + currency: $currency, + blockNumber_gte: $fromBlock + }) { + id + blockNumber + commitment + index + timestamp + from + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_WITHDRAWALS = ` + query getWithdrawals($currency: String!, $amount: String!, $first: Int, $fromBlock: Int!) { + withdrawals(first: $first, orderBy: blockNumber, orderDirection: asc, where: { + currency: $currency, + amount: $amount, + blockNumber_gte: $fromBlock + }) { + id + blockNumber + nullifier + to + fee + timestamp + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_NOTE_ACCOUNTS = ` + query getNoteAccount($address: String!) { + noteAccounts(where: { address: $address }) { + id + index + address + encryptedAccount + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_ECHO_EVENTS = ` + query getNoteAccounts($first: Int, $fromBlock: Int) { + noteAccounts(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + id + blockNumber + address + encryptedAccount + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_ENCRYPTED_NOTES = ` + query getEncryptedNotes($first: Int, $fromBlock: Int) { + encryptedNotes(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + blockNumber + index + transactionHash + encryptedNote + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_GOVERNANCE_EVENTS = ` + query getGovernanceEvents($first: Int, $fromBlock: Int) { + proposals(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + blockNumber + logIndex + transactionHash + proposalId + proposer + target + startTime + endTime + description + } + votes(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + blockNumber + logIndex + transactionHash + proposalId + voter + support + votes + from + input + } + delegates(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + blockNumber + logIndex + transactionHash + account + delegateTo + } + undelegates(first: $first, orderBy: blockNumber, orderDirection: asc, where: { blockNumber_gte: $fromBlock }) { + blockNumber + logIndex + transactionHash + account + delegateFrom + } + _meta { + block { + number + } + hasIndexingErrors + } + } +`; + +export const GET_GOVERNANCE_APY = ` + stakeDailyBurns(first: 30, orderBy: date, orderDirection: desc) { + id + date + dailyAmountBurned + } +`; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..67793bd --- /dev/null +++ b/src/index.ts @@ -0,0 +1,22 @@ +export * from './events'; +export * from './graphql'; +export * from './schemas'; +export * from './typechain'; +export * from './batch'; +export * from './data'; +export * from './deposits'; +export * from './encryptedNotes'; +export * from './fees'; +export * from './merkleTree'; +export * from './mimc'; +export * from './multicall'; +export * from './networkConfig'; +export * from './parser'; +export * from './pedersen'; +export * from './prices'; +export * from './providers'; +export * from './relayerClient'; +export * from './tokens'; +export * from './treeCache'; +export * from './utils'; +export * from './websnark'; diff --git a/src/merkleTree.ts b/src/merkleTree.ts new file mode 100644 index 0000000..9c4aaaf --- /dev/null +++ b/src/merkleTree.ts @@ -0,0 +1,199 @@ +import { Worker as NodeWorker } from 'worker_threads'; +import { MerkleTree, PartialMerkleTree, Element, TreeEdge } from '@tornado/fixed-merkle-tree'; +import type { Tornado } from '@tornado/contracts'; +import { isNode, toFixedHex } from './utils'; +import { mimc } from './mimc'; +import type { DepositType } from './deposits'; +import type { DepositsEvents } from './events'; +import type { NetIdType } from './networkConfig'; + +export type MerkleTreeConstructor = DepositType & { + Tornado: Tornado; + commitmentHex?: string; + merkleTreeHeight?: number; + emptyElement?: string; + merkleWorkerPath?: string; +}; + +export class MerkleTreeService { + currency: string; + amount: string; + netId: NetIdType; + Tornado: Tornado; + commitmentHex?: string; + instanceName: string; + + merkleTreeHeight: number; + emptyElement: string; + + merkleWorkerPath?: string; + + constructor({ + netId, + amount, + currency, + Tornado, + commitmentHex, + merkleTreeHeight = 20, + emptyElement = '21663839004416932945382355908790599225266501822907911457504978515578255421292', + merkleWorkerPath, + }: MerkleTreeConstructor) { + const instanceName = `${netId}_${currency}_${amount}`; + + this.currency = currency; + this.amount = amount; + this.netId = Number(netId); + + this.Tornado = Tornado; + this.instanceName = instanceName; + this.commitmentHex = commitmentHex; + + this.merkleTreeHeight = merkleTreeHeight; + this.emptyElement = emptyElement; + this.merkleWorkerPath = merkleWorkerPath; + } + + async createTree(events: Element[]) { + const { hash: hashFunction } = await mimc.getHash(); + + if (this.merkleWorkerPath) { + console.log('Using merkleWorker\n'); + + try { + if (isNode) { + const merkleWorkerPromise = new Promise((resolve, reject) => { + const worker = new NodeWorker(this.merkleWorkerPath as string, { + workerData: { + merkleTreeHeight: this.merkleTreeHeight, + elements: events, + zeroElement: this.emptyElement, + }, + }); + worker.on('message', resolve); + worker.on('error', reject); + worker.on('exit', (code) => { + if (code !== 0) { + reject(new Error(`Worker stopped with exit code ${code}`)); + } + }); + }) as Promise; + + return MerkleTree.deserialize(JSON.parse(await merkleWorkerPromise), hashFunction); + } else { + const merkleWorkerPromise = new Promise((resolve, reject) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const worker = new (Worker as any)(this.merkleWorkerPath); + + worker.onmessage = (e: { data: string }) => { + resolve(e.data); + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + worker.onerror = (e: any) => { + reject(e); + }; + + worker.postMessage({ + merkleTreeHeight: this.merkleTreeHeight, + elements: events, + zeroElement: this.emptyElement, + }); + }) as Promise; + + return MerkleTree.deserialize(JSON.parse(await merkleWorkerPromise), hashFunction); + } + } catch (err) { + console.log('merkleWorker failed, falling back to synchronous merkle tree'); + console.log(err); + } + } + + return new MerkleTree(this.merkleTreeHeight, events, { + zeroElement: this.emptyElement, + hashFunction, + }); + } + + async createPartialTree({ edge, elements }: { edge: TreeEdge; elements: Element[] }) { + const { hash: hashFunction } = await mimc.getHash(); + + if (this.merkleWorkerPath) { + console.log('Using merkleWorker\n'); + + try { + if (isNode) { + const merkleWorkerPromise = new Promise((resolve, reject) => { + const worker = new NodeWorker(this.merkleWorkerPath as string, { + workerData: { + merkleTreeHeight: this.merkleTreeHeight, + edge, + elements, + zeroElement: this.emptyElement, + }, + }); + worker.on('message', resolve); + worker.on('error', reject); + worker.on('exit', (code) => { + if (code !== 0) { + reject(new Error(`Worker stopped with exit code ${code}`)); + } + }); + }) as Promise; + + return PartialMerkleTree.deserialize(JSON.parse(await merkleWorkerPromise), hashFunction); + } else { + const merkleWorkerPromise = new Promise((resolve, reject) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const worker = new (Worker as any)(this.merkleWorkerPath); + + worker.onmessage = (e: { data: string }) => { + resolve(e.data); + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + worker.onerror = (e: any) => { + reject(e); + }; + + worker.postMessage({ + merkleTreeHeight: this.merkleTreeHeight, + edge, + elements, + zeroElement: this.emptyElement, + }); + }) as Promise; + + return PartialMerkleTree.deserialize(JSON.parse(await merkleWorkerPromise), hashFunction); + } + } catch (err) { + console.log('merkleWorker failed, falling back to synchronous merkle tree'); + console.log(err); + } + } + + return new PartialMerkleTree(this.merkleTreeHeight, edge, elements, { + zeroElement: this.emptyElement, + hashFunction, + }); + } + + async verifyTree(events: DepositsEvents[]) { + console.log( + `\nCreating deposit tree for ${this.netId} ${this.amount} ${this.currency.toUpperCase()} would take a while\n`, + ); + + console.time('Created tree in'); + const tree = await this.createTree(events.map(({ commitment }) => commitment)); + console.timeEnd('Created tree in'); + console.log(''); + + const isKnownRoot = await this.Tornado.isKnownRoot(toFixedHex(BigInt(tree.root))); + + if (!isKnownRoot) { + const errMsg = `Deposit Event ${this.netId} ${this.amount} ${this.currency} is invalid`; + throw new Error(errMsg); + } + + return tree; + } +} diff --git a/src/merkleTreeWorker.ts b/src/merkleTreeWorker.ts new file mode 100644 index 0000000..1797688 --- /dev/null +++ b/src/merkleTreeWorker.ts @@ -0,0 +1,70 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import workerThreads from 'worker_threads'; +import { MerkleTree, Element, TreeEdge, PartialMerkleTree } from '@tornado/fixed-merkle-tree'; +import { mimc } from './mimc'; +import { isNode } from './utils'; + +interface WorkData { + merkleTreeHeight: number; + edge?: TreeEdge; + elements: Element[]; + zeroElement: string; +} + +async function nodePostWork() { + const { hash: hashFunction } = await mimc.getHash(); + const { merkleTreeHeight, edge, elements, zeroElement } = workerThreads.workerData as WorkData; + + if (edge) { + const merkleTree = new PartialMerkleTree(merkleTreeHeight, edge, elements, { + zeroElement, + hashFunction, + }); + + (workerThreads.parentPort as workerThreads.MessagePort).postMessage(merkleTree.toString()); + return; + } + + const merkleTree = new MerkleTree(merkleTreeHeight, elements, { + zeroElement, + hashFunction, + }); + + (workerThreads.parentPort as workerThreads.MessagePort).postMessage(merkleTree.toString()); +} + +if (isNode && workerThreads) { + nodePostWork(); +} else if (!isNode && typeof addEventListener === 'function' && typeof postMessage === 'function') { + addEventListener('message', async (e: any) => { + let data; + + if (e.data) { + data = e.data; + } else { + data = e; + } + + const { hash: hashFunction } = await mimc.getHash(); + const { merkleTreeHeight, edge, elements, zeroElement } = data as WorkData; + + if (edge) { + const merkleTree = new PartialMerkleTree(merkleTreeHeight, edge, elements, { + zeroElement, + hashFunction, + }); + + postMessage(merkleTree.toString()); + return; + } + + const merkleTree = new MerkleTree(merkleTreeHeight, elements, { + zeroElement, + hashFunction, + }); + + postMessage(merkleTree.toString()); + }); +} else { + throw new Error('This browser / environment does not support workers!'); +} diff --git a/src/mimc.ts b/src/mimc.ts new file mode 100644 index 0000000..e731137 --- /dev/null +++ b/src/mimc.ts @@ -0,0 +1,28 @@ +import { MimcSponge, buildMimcSponge } from 'circomlibjs'; +import type { Element, HashFunction } from '@tornado/fixed-merkle-tree'; + +export class Mimc { + sponge?: MimcSponge; + hash?: HashFunction; + mimcPromise: Promise; + + constructor() { + this.mimcPromise = this.initMimc(); + } + + async initMimc() { + this.sponge = await buildMimcSponge(); + this.hash = (left, right) => this.sponge?.F.toString(this.sponge?.multiHash([BigInt(left), BigInt(right)])); + } + + async getHash() { + await this.mimcPromise; + + return { + sponge: this.sponge, + hash: this.hash, + }; + } +} + +export const mimc = new Mimc(); diff --git a/src/multicall.ts b/src/multicall.ts new file mode 100644 index 0000000..59ea812 --- /dev/null +++ b/src/multicall.ts @@ -0,0 +1,37 @@ +import { BaseContract, Interface } from 'ethers'; +import { Multicall } from './typechain'; + +export interface Call3 { + contract?: BaseContract; + address?: string; + interface?: Interface; + name: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + params?: any[]; + allowFailure?: boolean; +} + +export async function multicall(Multicall: Multicall, calls: Call3[]) { + const calldata = calls.map((call) => { + const target = (call.contract?.target || call.address) as string; + const callInterface = (call.contract?.interface || call.interface) as Interface; + + return { + target, + callData: callInterface.encodeFunctionData(call.name, call.params), + allowFailure: call.allowFailure ?? false, + }; + }); + + const returnData = await Multicall.aggregate3.staticCall(calldata); + + const res = returnData.map((call, i) => { + const callInterface = (calls[i].contract?.interface || calls[i].interface) as Interface; + const [result, data] = call; + const decodeResult = + result && data && data !== '0x' ? callInterface.decodeFunctionResult(calls[i].name, data) : null; + return !decodeResult ? null : decodeResult.length === 1 ? decodeResult[0] : decodeResult; + }); + + return res; +} diff --git a/src/networkConfig.ts b/src/networkConfig.ts new file mode 100644 index 0000000..1b3308a --- /dev/null +++ b/src/networkConfig.ts @@ -0,0 +1,790 @@ +/** + * Type of default supported networks + */ +export enum NetId { + MAINNET = 1, + BSC = 56, + POLYGON = 137, + OPTIMISM = 10, + ARBITRUM = 42161, + GNOSIS = 100, + AVALANCHE = 43114, + SEPOLIA = 11155111, +} + +export type NetIdType = NetId | number; + +export interface RpcUrl { + name: string; + url: string; +} + +export type RpcUrls = { + [key in string]: RpcUrl; +}; + +export interface SubgraphUrl { + name: string; + url: string; +} + +export type SubgraphUrls = { + [key in string]: SubgraphUrl; +}; + +export type TornadoInstance = { + instanceAddress: { + [key in string]: string; + }; + optionalInstances?: string[]; + tokenAddress?: string; + tokenGasLimit?: number; + symbol: string; + decimals: number; + gasLimit?: number; +}; + +export type TokenInstances = { + [key in string]: TornadoInstance; +}; + +export type Config = { + rpcCallRetryAttempt?: number; + // Should be in gwei + gasPrices: { + // fallback gasPrice / maxFeePerGas value + instant: number; + fast?: number; + standard?: number; + low?: number; + // fallback EIP-1559 params + maxPriorityFeePerGas?: number; + }; + nativeCurrency: string; + currencyName: string; + explorerUrl: string; + merkleTreeHeight: number; + emptyElement: string; + networkName: string; + deployedBlock: number; + rpcUrls: RpcUrls; + multicallContract: string; + routerContract: string; + echoContract: string; + offchainOracleContract?: string; + tornContract?: string; + governanceContract?: string; + stakingRewardsContract?: string; + registryContract?: string; + aggregatorContract?: string; + reverseRecordsContract?: string; + gasPriceOracleContract?: string; + gasStationApi?: string; + ovmGasPriceOracleContract?: string; + tornadoSubgraph: string; + registrySubgraph?: string; + governanceSubgraph?: string; + subgraphs: SubgraphUrls; + tokens: TokenInstances; + optionalTokens?: string[]; + ensSubdomainKey: string; + // Should be in seconds + pollInterval: number; + constants: { + GOVERNANCE_BLOCK?: number; + NOTE_ACCOUNT_BLOCK?: number; + ENCRYPTED_NOTES_BLOCK?: number; + REGISTRY_BLOCK?: number; + // Should be in seconds + MINING_BLOCK_TIME?: number; + }; +}; + +export type networkConfig = { + [key in NetIdType]: Config; +}; + +const theGraph = { + name: 'Hosted Graph', + url: 'https://api.thegraph.com', +}; +const tornado = { + name: 'Tornado Subgraphs', + url: 'https://tornadocash-rpc.com', +}; + +export const defaultConfig: networkConfig = { + [NetId.MAINNET]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 80, + fast: 50, + standard: 25, + low: 8, + }, + nativeCurrency: 'eth', + currencyName: 'ETH', + explorerUrl: 'https://etherscan.io', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Ethereum Mainnet', + deployedBlock: 9116966, + rpcUrls: { + tornado: { + name: 'Tornado RPC', + url: 'https://tornadocash-rpc.com', + }, + chainnodes: { + name: 'Chainnodes RPC', + url: 'https://mainnet.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + mevblockerRPC: { + name: 'MevblockerRPC', + url: 'https://rpc.mevblocker.io', + }, + stackup: { + name: 'Stackup RPC', + url: 'https://public.stackup.sh/api/v1/node/ethereum-mainnet', + }, + noderealRPC: { + name: 'NodeReal RPC', + url: 'https://eth-mainnet.nodereal.io/v1/1659dfb40aa24bbb8153a677b98064d7', + }, + notadegenRPC: { + name: 'NotADegen RPC', + url: 'https://rpc.notadegen.com/eth', + }, + keydonixRPC: { + name: 'Keydonix RPC', + url: 'https://ethereum.keydonix.com/v1/mainnet', + }, + oneRPC: { + name: '1RPC', + url: 'https://1rpc.io/eth', + }, + }, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b', + echoContract: '0x9B27DD5Bb15d42DC224FCD0B7caEbBe16161Df42', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + tornContract: '0x77777FeDdddFfC19Ff86DB637967013e6C6A116C', + governanceContract: '0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce', + stakingRewardsContract: '0x5B3f656C80E8ddb9ec01Dd9018815576E9238c29', + registryContract: '0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2', + aggregatorContract: '0xE8F47A78A6D52D317D0D2FFFac56739fE14D1b49', + reverseRecordsContract: '0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C', + tornadoSubgraph: 'tornadocash/mainnet-tornado-subgraph', + registrySubgraph: 'tornadocash/tornado-relayer-registry', + governanceSubgraph: 'tornadocash/tornado-governance', + subgraphs: { + tornado, + theGraph, + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc', + '1': '0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936', + '10': '0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF', + '100': '0xA160cdAB225685dA1d56aa342Ad8841c3b53f291', + }, + symbol: 'ETH', + decimals: 18, + }, + dai: { + instanceAddress: { + '100': '0xD4B88Df4D29F5CedD6857912842cff3b20C8Cfa3', + '1000': '0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144', + '10000': '0x07687e702b410Fa43f4cB4Af7FA097918ffD2730', + '100000': '0x23773E65ed146A459791799d01336DB287f25334', + }, + tokenAddress: '0x6B175474E89094C44Da98b954EedeAC495271d0F', + tokenGasLimit: 70_000, + symbol: 'DAI', + decimals: 18, + gasLimit: 700_000, + }, + cdai: { + instanceAddress: { + '5000': '0x22aaA7720ddd5388A3c0A3333430953C68f1849b', + '50000': '0x03893a7c7463AE47D46bc7f091665f1893656003', + '500000': '0x2717c5e28cf931547B621a5dddb772Ab6A35B701', + '5000000': '0xD21be7248e0197Ee08E0c20D4a96DEBdaC3D20Af', + }, + tokenAddress: '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', + tokenGasLimit: 200_000, + symbol: 'cDAI', + decimals: 8, + gasLimit: 700_000, + }, + usdc: { + instanceAddress: { + '100': '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307', + '1000': '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D', + }, + tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + tokenGasLimit: 70_000, + symbol: 'USDC', + decimals: 6, + gasLimit: 700_000, + }, + usdt: { + instanceAddress: { + '100': '0x169AD27A470D064DEDE56a2D3ff727986b15D52B', + '1000': '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f', + }, + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + tokenGasLimit: 70_000, + symbol: 'USDT', + decimals: 6, + gasLimit: 700_000, + }, + wbtc: { + instanceAddress: { + '0.1': '0x178169B423a011fff22B9e3F3abeA13414dDD0F1', + '1': '0x610B717796ad172B316836AC95a2ffad065CeaB4', + '10': '0xbB93e510BbCD0B7beb5A853875f9eC60275CF498', + }, + tokenAddress: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', + tokenGasLimit: 70_000, + symbol: 'WBTC', + decimals: 8, + gasLimit: 700_000, + }, + }, + ensSubdomainKey: 'mainnet-tornado', + pollInterval: 15, + constants: { + GOVERNANCE_BLOCK: 11474695, + NOTE_ACCOUNT_BLOCK: 11842486, + ENCRYPTED_NOTES_BLOCK: 12143762, + REGISTRY_BLOCK: 14173129, + MINING_BLOCK_TIME: 15, + }, + }, + [NetId.BSC]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 5, + fast: 5, + standard: 5, + low: 5, + }, + nativeCurrency: 'bnb', + currencyName: 'BNB', + explorerUrl: 'https://bscscan.com', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Binance Smart Chain', + deployedBlock: 8158799, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x0D5550d52428E7e3175bfc9550207e4ad3859b17', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + tornadoSubgraph: 'tornadocash/bsc-tornado-subgraph', + subgraphs: { + tornado, + theGraph, + }, + rpcUrls: { + tornado: { + name: 'Tornado RPC', + url: 'https://tornadocash-rpc.com/bsc', + }, + chainnodes: { + name: 'Chainnodes RPC', + url: 'https://bsc-mainnet.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + stackup: { + name: 'Stackup RPC', + url: 'https://public.stackup.sh/api/v1/node/bsc-mainnet', + }, + noderealRPC: { + name: 'NodeReal RPC', + url: 'https://bsc-mainnet.nodereal.io/v1/64a9df0874fb4a93b9d0a3849de012d3', + }, + oneRPC: { + name: '1RPC', + url: 'https://1rpc.io/bnb', + }, + }, + tokens: { + bnb: { + instanceAddress: { + '0.1': '0x84443CFd09A48AF6eF360C6976C5392aC5023a1F', + '1': '0xd47438C816c9E7f2E2888E060936a499Af9582b3', + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + }, + symbol: 'BNB', + decimals: 18, + }, + }, + ensSubdomainKey: 'bsc-tornado', + pollInterval: 10, + constants: { + NOTE_ACCOUNT_BLOCK: 8159269, + ENCRYPTED_NOTES_BLOCK: 8159269, + }, + }, + [NetId.POLYGON]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 100, + fast: 75, + standard: 50, + low: 30, + }, + nativeCurrency: 'matic', + currencyName: 'MATIC', + explorerUrl: 'https://polygonscan.com', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Polygon (Matic) Network', + deployedBlock: 16257962, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x0D5550d52428E7e3175bfc9550207e4ad3859b17', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + gasPriceOracleContract: '0xF81A8D8D3581985D3969fe53bFA67074aDFa8F3C', + tornadoSubgraph: 'tornadocash/matic-tornado-subgraph', + subgraphs: { + tornado, + theGraph, + }, + rpcUrls: { + chainnodes: { + name: 'Tornado RPC', + url: 'https://polygon-mainnet.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + stackup: { + name: 'Stackup RPC', + url: 'https://public.stackup.sh/api/v1/node/polygon-mainnet', + }, + oneRpc: { + name: '1RPC', + url: 'https://1rpc.io/matic', + }, + }, + tokens: { + matic: { + instanceAddress: { + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + '1000': '0xdf231d99Ff8b6c6CBF4E9B9a945CBAcEF9339178', + '10000': '0xaf4c0B70B2Ea9FB7487C7CbB37aDa259579fe040', + '100000': '0xa5C2254e4253490C54cef0a4347fddb8f75A4998', + }, + symbol: 'MATIC', + decimals: 18, + }, + }, + ensSubdomainKey: 'polygon-tornado', + pollInterval: 10, + constants: { + NOTE_ACCOUNT_BLOCK: 16257996, + ENCRYPTED_NOTES_BLOCK: 16257996, + }, + }, + [NetId.OPTIMISM]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 0.001, + fast: 0.001, + standard: 0.001, + low: 0.001, + }, + nativeCurrency: 'eth', + currencyName: 'ETH', + explorerUrl: 'https://optimistic.etherscan.io', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Optimism', + deployedBlock: 2243689, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x0D5550d52428E7e3175bfc9550207e4ad3859b17', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + ovmGasPriceOracleContract: '0x420000000000000000000000000000000000000F', + tornadoSubgraph: 'tornadocash/optimism-tornado-subgraph', + subgraphs: { + tornado, + theGraph, + }, + rpcUrls: { + tornado: { + name: 'Tornado RPC', + url: 'https://tornadocash-rpc.com/op', + }, + chainnodes: { + name: 'Chainnodes RPC', + url: 'https://optimism-mainnet.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + optimism: { + name: 'Optimism RPC', + url: 'https://mainnet.optimism.io', + }, + stackup: { + name: 'Stackup RPC', + url: 'https://public.stackup.sh/api/v1/node/optimism-mainnet', + }, + oneRpc: { + name: '1RPC', + url: 'https://1rpc.io/op', + }, + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x84443CFd09A48AF6eF360C6976C5392aC5023a1F', + '1': '0xd47438C816c9E7f2E2888E060936a499Af9582b3', + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + }, + symbol: 'ETH', + decimals: 18, + }, + }, + ensSubdomainKey: 'optimism-tornado', + pollInterval: 15, + constants: { + NOTE_ACCOUNT_BLOCK: 2243694, + ENCRYPTED_NOTES_BLOCK: 2243694, + }, + }, + [NetId.ARBITRUM]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 4, + fast: 3, + standard: 2.52, + low: 2.29, + }, + nativeCurrency: 'eth', + currencyName: 'ETH', + explorerUrl: 'https://arbiscan.io', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Arbitrum One', + deployedBlock: 3430648, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x0D5550d52428E7e3175bfc9550207e4ad3859b17', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + tornadoSubgraph: 'tornadocash/arbitrum-tornado-subgraph', + subgraphs: { + tornado, + theGraph, + }, + rpcUrls: { + tornado: { + name: 'Tornado RPC', + url: 'https://tornadocash-rpc.com/arbitrum', + }, + chainnodes: { + name: 'Chainnodes RPC', + url: 'https://arbitrum-one.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + arbitrum: { + name: 'Arbitrum RPC', + url: 'https://arb1.arbitrum.io/rpc', + }, + stackup: { + name: 'Stackup RPC', + url: 'https://public.stackup.sh/api/v1/node/arbitrum-one', + }, + oneRpc: { + name: '1rpc', + url: 'https://1rpc.io/arb', + }, + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x84443CFd09A48AF6eF360C6976C5392aC5023a1F', + '1': '0xd47438C816c9E7f2E2888E060936a499Af9582b3', + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + }, + symbol: 'ETH', + decimals: 18, + }, + }, + ensSubdomainKey: 'arbitrum-tornado', + pollInterval: 15, + constants: { + NOTE_ACCOUNT_BLOCK: 3430605, + ENCRYPTED_NOTES_BLOCK: 3430605, + }, + }, + [NetId.GNOSIS]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 6, + fast: 5, + standard: 4, + low: 1, + }, + nativeCurrency: 'xdai', + currencyName: 'xDAI', + explorerUrl: 'https://gnosisscan.io', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Gnosis Chain', + deployedBlock: 17754561, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x0D5550d52428E7e3175bfc9550207e4ad3859b17', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + tornadoSubgraph: 'tornadocash/xdai-tornado-subgraph', + subgraphs: { + tornado, + theGraph, + }, + rpcUrls: { + tornado: { + name: 'Tornado RPC', + url: 'https://tornadocash-rpc.com/gnosis', + }, + chainnodes: { + name: 'Chainnodes RPC', + url: 'https://gnosis-mainnet.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + gnosis: { + name: 'Gnosis RPC', + url: 'https://rpc.gnosischain.com', + }, + stackup: { + name: 'Stackup RPC', + url: 'https://public.stackup.sh/api/v1/node/arbitrum-one', + }, + blockPi: { + name: 'BlockPi', + url: 'https://gnosis.blockpi.network/v1/rpc/public', + }, + }, + tokens: { + xdai: { + instanceAddress: { + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + '1000': '0xdf231d99Ff8b6c6CBF4E9B9a945CBAcEF9339178', + '10000': '0xaf4c0B70B2Ea9FB7487C7CbB37aDa259579fe040', + '100000': '0xa5C2254e4253490C54cef0a4347fddb8f75A4998', + }, + symbol: 'xDAI', + decimals: 18, + }, + }, + ensSubdomainKey: 'gnosis-tornado', + pollInterval: 15, + constants: { + NOTE_ACCOUNT_BLOCK: 17754564, + ENCRYPTED_NOTES_BLOCK: 17754564, + }, + }, + [NetId.AVALANCHE]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 225, + fast: 35, + standard: 25, + low: 25, + }, + nativeCurrency: 'avax', + currencyName: 'AVAX', + explorerUrl: 'https://snowtrace.io', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Avalanche Mainnet', + deployedBlock: 4429818, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x0D5550d52428E7e3175bfc9550207e4ad3859b17', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + offchainOracleContract: '0x0AdDd25a91563696D8567Df78D5A01C9a991F9B8', + tornadoSubgraph: 'tornadocash/avalanche-tornado-subgraph', + subgraphs: { + theGraph, + }, + rpcUrls: { + oneRPC: { + name: 'OneRPC', + url: 'https://1rpc.io/avax/c', + }, + avalancheRPC: { + name: 'Avalanche RPC', + url: 'https://api.avax.network/ext/bc/C/rpc', + }, + meowRPC: { + name: 'Meow RPC', + url: 'https://avax.meowrpc.com', + }, + }, + tokens: { + avax: { + instanceAddress: { + '10': '0x330bdFADE01eE9bF63C209Ee33102DD334618e0a', + '100': '0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD', + '500': '0xaf8d1839c3c67cf571aa74B5c12398d4901147B3', + }, + symbol: 'AVAX', + decimals: 18, + }, + }, + ensSubdomainKey: 'avalanche-tornado', + pollInterval: 10, + constants: { + NOTE_ACCOUNT_BLOCK: 4429813, + ENCRYPTED_NOTES_BLOCK: 4429813, + }, + }, + [NetId.SEPOLIA]: { + rpcCallRetryAttempt: 15, + gasPrices: { + instant: 2, + fast: 2, + standard: 2, + low: 2, + }, + nativeCurrency: 'eth', + currencyName: 'SepoliaETH', + explorerUrl: 'https://sepolia.etherscan.io', + merkleTreeHeight: 20, + emptyElement: '21663839004416932945382355908790599225266501822907911457504978515578255421292', + networkName: 'Ethereum Sepolia', + deployedBlock: 5594395, + multicallContract: '0xcA11bde05977b3631167028862bE2a173976CA11', + routerContract: '0x1572AFE6949fdF51Cb3E0856216670ae9Ee160Ee', + echoContract: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', + tornContract: '0x3AE6667167C0f44394106E197904519D808323cA', + governanceContract: '0xe5324cD7602eeb387418e594B87aCADee08aeCAD', + stakingRewardsContract: '0x6d0018890751Efd31feb8166711B16732E2b496b', + registryContract: '0x1428e5d2356b13778A13108b10c440C83011dfB8', + aggregatorContract: '0x4088712AC9fad39ea133cdb9130E465d235e9642', + reverseRecordsContract: '0xEc29700C0283e5Be64AcdFe8077d6cC95dE23C23', + tornadoSubgraph: 'tornadocash/sepolia-tornado-subgraph', + subgraphs: { + tornado, + }, + rpcUrls: { + tornado: { + name: 'Tornado RPC', + url: 'https://tornadocash-rpc.com/sepolia', + }, + sepolia: { + name: 'Sepolia RPC', + url: 'https://rpc.sepolia.org', + }, + chainnodes: { + name: 'Chainnodes RPC', + url: 'https://sepolia.chainnodes.org/d692ae63-0a7e-43e0-9da9-fe4f4cc6c607', + }, + }, + tokens: { + eth: { + instanceAddress: { + '0.1': '0x8C4A04d872a6C1BE37964A21ba3a138525dFF50b', + '1': '0x8cc930096B4Df705A007c4A039BDFA1320Ed2508', + '10': '0x8D10d506D29Fc62ABb8A290B99F66dB27Fc43585', + '100': '0x44c5C92ed73dB43888210264f0C8b36Fd68D8379', + }, + symbol: 'ETH', + decimals: 18, + }, + dai: { + instanceAddress: { + '100': '0x6921fd1a97441dd603a997ED6DDF388658daf754', + '1000': '0x50a637770F5d161999420F7d70d888DE47207145', + '10000': '0xecD649870407cD43923A816Cc6334a5bdf113621', + '100000': '0x73B4BD04bF83206B6e979BE2507098F92EDf4F90', + }, + tokenAddress: '0xFF34B3d4Aee8ddCd6F9AFFFB6Fe49bD371b8a357', + tokenGasLimit: 70_000, + symbol: 'DAI', + decimals: 18, + gasLimit: 700_000, + }, + }, + ensSubdomainKey: 'sepolia-tornado', + pollInterval: 15, + constants: { + GOVERNANCE_BLOCK: 5594395, + NOTE_ACCOUNT_BLOCK: 5594395, + ENCRYPTED_NOTES_BLOCK: 5594395, + MINING_BLOCK_TIME: 15, + }, + }, +}; + +export const enabledChains = Object.values(NetId).filter((n) => typeof n === 'number') as NetIdType[]; + +/** + * Custom config object to extend default config + * + * Inspired by getUrlFunc from ethers.js + * https://github.com/ethers-io/ethers.js/blob/v6/src.ts/utils/fetch.ts#L59 + */ +export let customConfig: networkConfig = {}; + +/** + * Add or override existing network config object + * + * Could be also called on the UI hook so that the UI could allow people to use custom privacy pools + */ +export function addNetwork(newConfig: networkConfig) { + enabledChains.push( + ...Object.keys(newConfig) + .map((netId) => Number(netId)) + .filter((netId) => !enabledChains.includes(netId)), + ); + + customConfig = { + ...customConfig, + ...newConfig, + }; +} + +export function getNetworkConfig(): networkConfig { + // customConfig object + const allConfig = { + ...defaultConfig, + ...customConfig, + }; + + return enabledChains.reduce((acc, curr) => { + acc[curr] = allConfig[curr]; + return acc; + }, {} as networkConfig); +} + +export function getConfig(netId: NetIdType) { + const allConfig = getNetworkConfig(); + + const chainConfig = allConfig[netId]; + + if (!chainConfig) { + const errMsg = `No config found for network ${netId}!`; + throw new Error(errMsg); + } + + return chainConfig; +} + +export function getInstanceByAddress({ netId, address }: { netId: NetIdType; address: string }) { + const { tokens } = getConfig(netId); + + for (const [currency, { instanceAddress }] of Object.entries(tokens)) { + for (const [amount, instance] of Object.entries(instanceAddress)) { + if (instance === address) { + return { + amount, + currency, + }; + } + } + } +} + +export function getSubdomains() { + const allConfig = getNetworkConfig(); + + return enabledChains.map((chain) => allConfig[chain].ensSubdomainKey); +} diff --git a/src/parser.ts b/src/parser.ts new file mode 100644 index 0000000..d54d65a --- /dev/null +++ b/src/parser.ts @@ -0,0 +1,77 @@ +import { InvalidArgumentError } from 'commander'; +import { computeAddress, getAddress, Mnemonic } from 'ethers'; +import { validateUrl } from './utils'; + +export function parseNumber(value?: string | number): number { + if (!value || isNaN(Number(value))) { + throw new InvalidArgumentError('Invalid Number'); + } + return Number(value); +} + +export function parseUrl(value?: string): string { + if (!value || !validateUrl(value, ['http:', 'https:'])) { + throw new InvalidArgumentError('Invalid URL'); + } + return value; +} + +export function parseRelayer(value?: string): string { + if (!value || !(value.endsWith('.eth') || validateUrl(value, ['http:', 'https:']))) { + throw new InvalidArgumentError('Invalid Relayer ETH address or URL'); + } + return value; +} + +export function parseAddress(value?: string): string { + if (!value) { + throw new InvalidArgumentError('Invalid Address'); + } + try { + return getAddress(value); + } catch { + throw new InvalidArgumentError('Invalid Address'); + } +} + +export function parseMnemonic(value?: string): string { + if (!value) { + throw new InvalidArgumentError('Invalid Mnemonic'); + } + try { + Mnemonic.fromPhrase(value); + } catch { + throw new InvalidArgumentError('Invalid Mnemonic'); + } + return value; +} + +export function parseKey(value?: string): string { + if (!value) { + throw new InvalidArgumentError('Invalid Private Key'); + } + if (value.length === 64) { + value = '0x' + value; + } + try { + computeAddress(value); + } catch { + throw new InvalidArgumentError('Invalid Private Key'); + } + return value; +} + +/** + * Recovery key shouldn't have a 0x prefix (Also this is how the UI generates) + */ +export function parseRecoveryKey(value?: string): string { + if (!value) { + throw new InvalidArgumentError('Invalid Recovery Key'); + } + try { + computeAddress('0x' + value); + } catch { + throw new InvalidArgumentError('Invalid Recovery Key'); + } + return value; +} diff --git a/src/pedersen.ts b/src/pedersen.ts new file mode 100644 index 0000000..8440621 --- /dev/null +++ b/src/pedersen.ts @@ -0,0 +1,32 @@ +import { BabyJub, PedersenHash, Point, buildPedersenHash } from 'circomlibjs'; + +export class Pedersen { + pedersenHash?: PedersenHash; + babyJub?: BabyJub; + pedersenPromise: Promise; + + constructor() { + this.pedersenPromise = this.initPedersen(); + } + + async initPedersen() { + this.pedersenHash = await buildPedersenHash(); + this.babyJub = this.pedersenHash.babyJub; + } + + async unpackPoint(buffer: Uint8Array) { + await this.pedersenPromise; + return this.babyJub?.unpackPoint(this.pedersenHash?.hash(buffer) as Uint8Array); + } + + toStringBuffer(buffer: Uint8Array): string { + return this.babyJub?.F.toString(buffer); + } +} + +export const pedersen = new Pedersen(); + +export async function buffPedersenHash(buffer: Uint8Array): Promise { + const [hash] = (await pedersen.unpackPoint(buffer)) as Point; + return pedersen.toStringBuffer(hash); +} diff --git a/src/prices.ts b/src/prices.ts new file mode 100644 index 0000000..e022c85 --- /dev/null +++ b/src/prices.ts @@ -0,0 +1,31 @@ +import { parseEther, type Provider } from 'ethers'; +import type { OffchainOracle, Multicall } from './typechain'; +import { multicall } from './multicall'; + +export class TokenPriceOracle { + oracle?: OffchainOracle; + multicall: Multicall; + provider: Provider; + + constructor(provider: Provider, multicall: Multicall, oracle?: OffchainOracle) { + this.provider = provider; + this.multicall = multicall; + this.oracle = oracle; + } + + fetchPrices(tokens: string[]): Promise { + // setup mock price for testnets + if (!this.oracle) { + return new Promise((resolve) => resolve(tokens.map(() => parseEther('0.0001')))); + } + + return multicall( + this.multicall, + tokens.map((token) => ({ + contract: this.oracle, + name: 'getRateToEth', + params: [token, true], + })), + ); + } +} diff --git a/src/providers.ts b/src/providers.ts new file mode 100644 index 0000000..6326ec6 --- /dev/null +++ b/src/providers.ts @@ -0,0 +1,645 @@ +import type { EventEmitter } from 'stream'; +import type { RequestOptions } from 'http'; +import crossFetch from 'cross-fetch'; +import { HttpProxyAgent } from 'http-proxy-agent'; +import { HttpsProxyAgent } from 'https-proxy-agent'; +import { SocksProxyAgent } from 'socks-proxy-agent'; +import { + FetchRequest, + JsonRpcApiProvider, + JsonRpcProvider, + Wallet, + HDNodeWallet, + FetchGetUrlFunc, + Provider, + SigningKey, + TransactionRequest, + JsonRpcSigner, + BrowserProvider, + Networkish, + Eip1193Provider, + VoidSigner, + Network, + parseUnits, + FetchUrlFeeDataNetworkPlugin, + FeeData, + EnsPlugin, + GasCostPlugin, +} from 'ethers'; +import type { RequestInfo, RequestInit, Response, HeadersInit } from 'node-fetch'; +import { GasPriceOracle, GasPriceOracle__factory, Multicall, Multicall__factory } from './typechain'; +import { isNode, sleep } from './utils'; +import type { Config, NetIdType } from './networkConfig'; +import { multicall } from './multicall'; + +declare global { + interface Window { + ethereum?: Eip1193Provider & EventEmitter; + } +} + +// Update this for every Tor Browser release +export const defaultUserAgent = 'Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/115.0'; + +export const fetch = crossFetch as unknown as nodeFetch; + +export type nodeFetch = (url: RequestInfo, init?: RequestInit) => Promise; + +export type fetchDataOptions = RequestInit & { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + headers?: HeadersInit | any; + maxRetry?: number; + retryOn?: number; + userAgent?: string; + timeout?: number; + proxy?: string; + torPort?: number; + // eslint-disable-next-line @typescript-eslint/ban-types + debug?: Function; + returnResponse?: boolean; +}; + +export type NodeAgent = RequestOptions['agent'] | ((parsedUrl: URL) => RequestOptions['agent']); + +export function getHttpAgent({ + fetchUrl, + proxyUrl, + torPort, + retry, +}: { + fetchUrl: string; + proxyUrl?: string; + torPort?: number; + retry: number; +}): NodeAgent | undefined { + if (torPort) { + return new SocksProxyAgent(`socks5h://tor${retry}@127.0.0.1:${torPort}`); + } + + if (!proxyUrl) { + return; + } + + const isHttps = fetchUrl.includes('https://'); + + if (proxyUrl.includes('socks://') || proxyUrl.includes('socks4://') || proxyUrl.includes('socks5://')) { + return new SocksProxyAgent(proxyUrl); + } + + if (proxyUrl.includes('http://') || proxyUrl.includes('https://')) { + if (isHttps) { + return new HttpsProxyAgent(proxyUrl); + } + return new HttpProxyAgent(proxyUrl); + } +} + +export async function fetchData(url: string, options: fetchDataOptions = {}) { + const MAX_RETRY = options.maxRetry ?? 3; + const RETRY_ON = options.retryOn ?? 500; + const userAgent = options.userAgent ?? defaultUserAgent; + + let retry = 0; + let errorObject; + + if (!options.method) { + if (!options.body) { + options.method = 'GET'; + } else { + options.method = 'POST'; + } + } + + if (!options.headers) { + options.headers = {}; + } + + if (isNode && !options.headers['User-Agent']) { + options.headers['User-Agent'] = userAgent; + } + + while (retry < MAX_RETRY + 1) { + let timeout; + + // Define promise timeout when the options.timeout is available + if (!options.signal && options.timeout) { + const controller = new AbortController(); + + options.signal = controller.signal; + + // Define timeout in seconds + timeout = setTimeout(() => { + controller.abort(); + }, options.timeout); + } + + if (!options.agent && isNode && (options.proxy || options.torPort)) { + options.agent = getHttpAgent({ + fetchUrl: url, + proxyUrl: options.proxy, + torPort: options.torPort, + retry, + }); + } + + if (options.debug && typeof options.debug === 'function') { + options.debug('request', { + url, + retry, + errorObject, + options, + }); + } + + try { + const resp = await fetch(url, { + method: options.method, + headers: options.headers, + body: options.body, + redirect: options.redirect, + signal: options.signal, + agent: options.agent, + }); + + if (options.debug && typeof options.debug === 'function') { + options.debug('response', resp); + } + + if (!resp.ok) { + const errMsg = `Request to ${url} failed with error code ${resp.status}:\n` + (await resp.text()); + throw new Error(errMsg); + } + + if (options.returnResponse) { + return resp; + } + + const contentType = resp.headers.get('content-type'); + + // If server returns JSON object, parse it and return as an object + if (contentType?.includes('application/json')) { + return await resp.json(); + } + + // Else if the server returns text parse it as a string + if (contentType?.includes('text')) { + return await resp.text(); + } + + // Return as a response object https://developer.mozilla.org/en-US/docs/Web/API/Response + return resp; + } catch (error) { + if (timeout) { + clearTimeout(timeout); + } + + errorObject = error; + + retry++; + + await sleep(RETRY_ON); + } finally { + if (timeout) { + clearTimeout(timeout); + } + } + } + + if (options.debug && typeof options.debug === 'function') { + options.debug('error', errorObject); + } + + throw errorObject; +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export const fetchGetUrlFunc = + (options: fetchDataOptions = {}): FetchGetUrlFunc => + async (req, _signal) => { + let signal; + + if (_signal) { + const controller = new AbortController(); + signal = controller.signal; + _signal.addListener(() => { + controller.abort(); + }); + } + + const init = { + ...options, + method: req.method || 'POST', + headers: req.headers, + body: req.body || undefined, + signal, + returnResponse: true, + }; + + const resp = await fetchData(req.url, init); + + const headers = {} as { [key in string]: any }; + resp.headers.forEach((value: any, key: string) => { + headers[key.toLowerCase()] = value; + }); + + const respBody = await resp.arrayBuffer(); + const body = respBody == null ? null : new Uint8Array(respBody); + + return { + statusCode: resp.status, + statusMessage: resp.statusText, + headers, + body, + }; + }; +/* eslint-enable @typescript-eslint/no-explicit-any */ + +// caching to improve performance +const oracleMapper = new Map(); +const multicallMapper = new Map(); + +export type getProviderOptions = fetchDataOptions & { + pollingInterval?: number; + gasPriceOracle?: string; + gasStationApi?: string; +}; + +export function getGasOraclePlugin(networkKey: string, fetchOptions?: getProviderOptions) { + const gasStationApi = fetchOptions?.gasStationApi || 'https://gasstation.polygon.technology/v2'; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + return new FetchUrlFeeDataNetworkPlugin(gasStationApi, async (fetchFeeData, provider, request) => { + if (!oracleMapper.has(networkKey)) { + oracleMapper.set(networkKey, GasPriceOracle__factory.connect(fetchOptions?.gasPriceOracle as string, provider)); + } + if (!multicallMapper.has(networkKey)) { + multicallMapper.set( + networkKey, + Multicall__factory.connect('0xcA11bde05977b3631167028862bE2a173976CA11', provider), + ); + } + const Oracle = oracleMapper.get(networkKey) as GasPriceOracle; + const Multicall = multicallMapper.get(networkKey) as Multicall; + + const [timestamp, heartbeat, feePerGas, priorityFeePerGas] = await multicall(Multicall, [ + { + contract: Oracle, + name: 'timestamp', + }, + { + contract: Oracle, + name: 'heartbeat', + }, + { + contract: Oracle, + name: 'maxFeePerGas', + }, + { + contract: Oracle, + name: 'maxPriorityFeePerGas', + }, + ]); + + const isOutdated = Number(timestamp) <= Date.now() / 1000 - Number(heartbeat); + + if (!isOutdated) { + const maxPriorityFeePerGas = (priorityFeePerGas * BigInt(13)) / BigInt(10); + const maxFeePerGas = feePerGas * BigInt(2) + maxPriorityFeePerGas; + + return { + gasPrice: maxFeePerGas, + maxFeePerGas, + maxPriorityFeePerGas, + }; + } + + const fetchReq = new FetchRequest(gasStationApi); + fetchReq.getUrlFunc = fetchGetUrlFunc(fetchOptions); + if (isNode) { + // Prevent Cloudflare from blocking our request in node.js + fetchReq.setHeader('User-Agent', 'ethers'); + } + + const [ + { + bodyJson: { fast }, + }, + { gasPrice }, + ] = await Promise.all([fetchReq.send(), fetchFeeData()]); + + return { + gasPrice, + maxFeePerGas: parseUnits(`${fast.maxFee}`, 9), + maxPriorityFeePerGas: parseUnits(`${fast.maxPriorityFee}`, 9), + }; + }); +} + +export async function getProvider(rpcUrl: string, fetchOptions?: getProviderOptions): Promise { + const fetchReq = new FetchRequest(rpcUrl); + fetchReq.getUrlFunc = fetchGetUrlFunc(fetchOptions); + // omit network plugins and mimic registerEth function (required for polygon) + const _staticNetwork = await new JsonRpcProvider(fetchReq).getNetwork(); + const ensPlugin = _staticNetwork.getPlugin('org.ethers.plugins.network.Ens'); + const gasCostPlugin = _staticNetwork.getPlugin('org.ethers.plugins.network.GasCost'); + const gasStationPlugin = ( + _staticNetwork.getPlugin('org.ethers.plugins.network.FetchUrlFeeDataPlugin') + ); + const staticNetwork = new Network(_staticNetwork.name, _staticNetwork.chainId); + if (ensPlugin) { + staticNetwork.attachPlugin(ensPlugin); + } + if (gasCostPlugin) { + staticNetwork.attachPlugin(gasCostPlugin); + } + if (fetchOptions?.gasPriceOracle) { + staticNetwork.attachPlugin(getGasOraclePlugin(`${_staticNetwork.chainId}_${rpcUrl}`, fetchOptions)); + } else if (gasStationPlugin) { + staticNetwork.attachPlugin(gasStationPlugin); + } + const provider = new JsonRpcProvider(fetchReq, staticNetwork, { + staticNetwork, + }); + provider.pollingInterval = fetchOptions?.pollingInterval || 1000; + return provider; +} + +export function getProviderWithNetId( + netId: NetIdType, + rpcUrl: string, + config: Config, + fetchOptions?: getProviderOptions, +): JsonRpcProvider { + const { networkName, reverseRecordsContract, gasPriceOracleContract, gasStationApi, pollInterval } = config; + const hasEns = Boolean(reverseRecordsContract); + + const fetchReq = new FetchRequest(rpcUrl); + fetchReq.getUrlFunc = fetchGetUrlFunc(fetchOptions); + const staticNetwork = new Network(networkName, netId); + if (hasEns) { + staticNetwork.attachPlugin(new EnsPlugin(null, Number(netId))); + } + + staticNetwork.attachPlugin(new GasCostPlugin()); + + if (gasPriceOracleContract) { + staticNetwork.attachPlugin( + getGasOraclePlugin(`${netId}_${rpcUrl}`, { + gasPriceOracle: gasPriceOracleContract, + gasStationApi, + }), + ); + } + + const provider = new JsonRpcProvider(fetchReq, staticNetwork, { + staticNetwork, + }); + + provider.pollingInterval = fetchOptions?.pollingInterval || pollInterval * 1000; + + return provider; +} + +export const populateTransaction = async ( + signer: TornadoWallet | TornadoVoidSigner | TornadoRpcSigner, + tx: TransactionRequest, +) => { + const provider = signer.provider as Provider; + + if (!tx.from) { + tx.from = signer.address; + } else if (tx.from !== signer.address) { + const errMsg = `populateTransaction: signer mismatch for tx, wants ${tx.from} have ${signer.address}`; + throw new Error(errMsg); + } + + const [feeData, nonce] = await Promise.all([ + (async () => { + if (tx.maxFeePerGas && tx.maxPriorityFeePerGas) { + return new FeeData(null, BigInt(tx.maxFeePerGas), BigInt(tx.maxPriorityFeePerGas)); + } + + if (tx.gasPrice) { + return new FeeData(BigInt(tx.gasPrice), null, null); + } + + const fetchedFeeData = await provider.getFeeData(); + + if (fetchedFeeData.maxFeePerGas && fetchedFeeData.maxPriorityFeePerGas) { + return new FeeData( + null, + (fetchedFeeData.maxFeePerGas * (BigInt(10000) + BigInt(signer.gasPriceBump))) / BigInt(10000), + fetchedFeeData.maxPriorityFeePerGas, + ); + } else { + return new FeeData( + ((fetchedFeeData.gasPrice as bigint) * (BigInt(10000) + BigInt(signer.gasPriceBump))) / BigInt(10000), + null, + null, + ); + } + })(), + (async () => { + if (tx.nonce) { + return tx.nonce; + } + + let fetchedNonce = await provider.getTransactionCount(signer.address, 'pending'); + + // Deal with cached nonce results + if (signer.bumpNonce && signer.nonce && signer.nonce >= fetchedNonce) { + console.log( + `populateTransaction: bumping nonce from ${fetchedNonce} to ${fetchedNonce + 1} for ${signer.address}`, + ); + fetchedNonce++; + } + + return fetchedNonce; + })(), + ]); + + tx.nonce = nonce; + + // EIP-1559 + if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) { + tx.maxFeePerGas = feeData.maxFeePerGas; + tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas; + if (!tx.type) { + tx.type = 2; + } + delete tx.gasPrice; + } else if (feeData.gasPrice) { + tx.gasPrice = feeData.gasPrice; + if (!tx.type) { + tx.type = 0; + } + delete tx.maxFeePerGas; + delete tx.maxPriorityFeePerGas; + } + + // gasLimit + tx.gasLimit = + tx.gasLimit || + (await (async () => { + try { + const gasLimit = await provider.estimateGas(tx); + return gasLimit === BigInt(21000) + ? gasLimit + : (gasLimit * (BigInt(10000) + BigInt(signer.gasLimitBump))) / BigInt(10000); + } catch (err) { + if (signer.gasFailover) { + console.log('populateTransaction: warning gas estimation failed falling back to 3M gas'); + // Gas failover + return BigInt('3000000'); + } + throw err; + } + })()); + + return tx; +}; + +export type TornadoWalletOptions = { + gasPriceBump?: number; + gasLimitBump?: number; + gasFailover?: boolean; + bumpNonce?: boolean; +}; + +export class TornadoWallet extends Wallet { + nonce?: number | null; + gasPriceBump: number; + gasLimitBump: number; + gasFailover: boolean; + bumpNonce: boolean; + constructor( + key: string | SigningKey, + provider?: null | Provider, + { gasPriceBump, gasLimitBump, gasFailover, bumpNonce }: TornadoWalletOptions = {}, + ) { + super(key, provider); + // 10% bump from the recommended fee + this.gasPriceBump = gasPriceBump ?? 1000; + // 30% bump from the recommended gaslimit + this.gasLimitBump = gasLimitBump ?? 3000; + this.gasFailover = gasFailover ?? false; + // Disable bump nonce feature unless being used by the server environment + this.bumpNonce = bumpNonce ?? false; + } + + static fromMnemonic(mneomnic: string, provider: Provider, index = 0, options?: TornadoWalletOptions) { + const defaultPath = `m/44'/60'/0'/0/${index}`; + const { privateKey } = HDNodeWallet.fromPhrase(mneomnic, undefined, defaultPath); + return new TornadoWallet(privateKey as unknown as SigningKey, provider, options); + } + + async populateTransaction(tx: TransactionRequest) { + const txObject = await populateTransaction(this, tx); + this.nonce = txObject.nonce; + + return super.populateTransaction(txObject); + } +} + +export class TornadoVoidSigner extends VoidSigner { + nonce?: number | null; + gasPriceBump: number; + gasLimitBump: number; + gasFailover: boolean; + bumpNonce: boolean; + constructor( + address: string, + provider?: null | Provider, + { gasPriceBump, gasLimitBump, gasFailover, bumpNonce }: TornadoWalletOptions = {}, + ) { + super(address, provider); + // 10% bump from the recommended fee + this.gasPriceBump = gasPriceBump ?? 1000; + // 30% bump from the recommended gaslimit + this.gasLimitBump = gasLimitBump ?? 3000; + this.gasFailover = gasFailover ?? false; + // turn off bumpNonce feature for view only wallet + this.bumpNonce = bumpNonce ?? false; + } + + async populateTransaction(tx: TransactionRequest) { + const txObject = await populateTransaction(this, tx); + this.nonce = txObject.nonce; + + return super.populateTransaction(txObject); + } +} + +export class TornadoRpcSigner extends JsonRpcSigner { + nonce?: number | null; + gasPriceBump: number; + gasLimitBump: number; + gasFailover: boolean; + bumpNonce: boolean; + constructor( + provider: JsonRpcApiProvider, + address: string, + { gasPriceBump, gasLimitBump, gasFailover, bumpNonce }: TornadoWalletOptions = {}, + ) { + super(provider, address); + // 10% bump from the recommended fee + this.gasPriceBump = gasPriceBump ?? 1000; + // 30% bump from the recommended gaslimit + this.gasLimitBump = gasLimitBump ?? 3000; + this.gasFailover = gasFailover ?? false; + // turn off bumpNonce feature for browser wallet + this.bumpNonce = bumpNonce ?? false; + } + + async sendUncheckedTransaction(tx: TransactionRequest) { + return super.sendUncheckedTransaction(await populateTransaction(this, tx)); + } +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type connectWalletFunc = (...args: any[]) => Promise; + +export type handleWalletFunc = (...args: any[]) => void; +/* eslint-enable @typescript-eslint/no-explicit-any */ + +export type TornadoBrowserProviderOptions = TornadoWalletOptions & { + webChainId?: NetIdType; + connectWallet?: connectWalletFunc; + handleNetworkChanges?: handleWalletFunc; + handleAccountChanges?: handleWalletFunc; + handleAccountDisconnect?: handleWalletFunc; +}; + +export class TornadoBrowserProvider extends BrowserProvider { + options?: TornadoBrowserProviderOptions; + constructor(ethereum: Eip1193Provider, network?: Networkish, options?: TornadoBrowserProviderOptions) { + super(ethereum, network); + this.options = options; + } + + async getSigner(address: string): Promise { + const signerAddress = (await super.getSigner(address)).address; + + if ( + this.options?.webChainId && + this.options?.connectWallet && + Number(await super.send('eth_chainId', [])) !== Number(this.options?.webChainId) + ) { + await this.options.connectWallet(); + } + + if (this.options?.handleNetworkChanges) { + window?.ethereum?.on('chainChanged', this.options.handleNetworkChanges); + } + + if (this.options?.handleAccountChanges) { + window?.ethereum?.on('accountsChanged', this.options.handleAccountChanges); + } + + if (this.options?.handleAccountDisconnect) { + window?.ethereum?.on('disconnect', this.options.handleAccountDisconnect); + } + + return new TornadoRpcSigner(this, signerAddress, this.options); + } +} diff --git a/src/relayerClient.ts b/src/relayerClient.ts new file mode 100644 index 0000000..5326891 --- /dev/null +++ b/src/relayerClient.ts @@ -0,0 +1,434 @@ +import { getAddress, namehash, parseEther } from 'ethers'; +import type { Aggregator } from '@tornado/contracts'; +import type { RelayerStructOutput } from '@tornado/contracts/dist/contracts/Governance/Aggregator/Aggregator'; +import { sleep } from './utils'; +import { NetId, NetIdType, Config } from './networkConfig'; +import { fetchData, fetchDataOptions } from './providers'; +import { ajv, jobsSchema, getStatusSchema } from './schemas'; +import type { snarkProofs } from './websnark'; + +export const MIN_STAKE_BALANCE = parseEther('500'); + +export interface RelayerParams { + ensName: string; + relayerAddress?: string; +} + +export interface Relayer { + netId: NetIdType; + url: string; + hostname: string; + rewardAccount: string; + instances: string[]; + gasPrice?: number; + ethPrices?: { + [key in string]: string; + }; + currentQueue: number; + tornadoServiceFee: number; +} + +export type RelayerInfo = Relayer & { + ensName: string; + stakeBalance: bigint; + relayerAddress: string; +}; + +export type RelayerError = { + hostname: string; + relayerAddress?: string; + errorMessage?: string; +}; + +export interface RelayerStatus { + url: string; + rewardAccount: string; + instances: { + [key in string]: { + instanceAddress: { + [key in string]: string; + }; + tokenAddress?: string; + symbol: string; + decimals: number; + }; + }; + gasPrices?: { + fast: number; + additionalProperties?: number; + }; + netId: NetIdType; + ethPrices?: { + [key in string]: string; + }; + tornadoServiceFee: number; + latestBlock?: number; + version: string; + health: { + status: string; + error: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + errorsLog: any[]; + }; + currentQueue: number; +} + +export interface RelayerTornadoWithdraw { + id?: string; + error?: string; +} + +export interface RelayerTornadoJobs { + error?: string; + id: string; + type?: string; + status: string; + contract?: string; + proof?: string; + args?: string[]; + txHash?: string; + confirmations?: number; + failedReason?: string; +} + +const semVerRegex = + /^(?0|[1-9]\d*)\.(?0|[1-9]\d*)\.(?0|[1-9]\d*)(?:-(?(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; + +export interface semanticVersion { + major: string; + minor: string; + patch: string; + prerelease?: string; + buildmetadata?: string; +} + +export function parseSemanticVersion(version: string) { + const { groups } = semVerRegex.exec(version) as RegExpExecArray; + return groups as unknown as semanticVersion; +} + +export function isRelayerUpdated(relayerVersion: string, netId: NetIdType) { + const { major, patch, prerelease } = parseSemanticVersion(relayerVersion); + // Save backwards compatibility with V4 relayers for Ethereum Mainnet + const requiredMajor = netId === NetId.MAINNET ? '4' : '5'; + const isUpdatedMajor = major === requiredMajor; + + if (prerelease) return false; + return isUpdatedMajor && (Number(patch) >= 5 || netId !== NetId.MAINNET); // Patch checking - also backwards compatibility for Mainnet +} + +export function calculateScore({ stakeBalance, tornadoServiceFee }: RelayerInfo, minFee = 0.33, maxFee = 0.53) { + if (tornadoServiceFee < minFee) { + tornadoServiceFee = minFee; + } else if (tornadoServiceFee >= maxFee) { + return BigInt(0); + } + + const serviceFeeCoefficient = (tornadoServiceFee - minFee) ** 2; + const feeDiffCoefficient = 1 / (maxFee - minFee) ** 2; + const coefficientsMultiplier = 1 - feeDiffCoefficient * serviceFeeCoefficient; + + return BigInt(Math.floor(Number(stakeBalance) * coefficientsMultiplier)); +} + +export function getWeightRandom(weightsScores: bigint[], random: bigint) { + for (let i = 0; i < weightsScores.length; i++) { + if (random < weightsScores[i]) { + return i; + } + random = random - weightsScores[i]; + } + return Math.floor(Math.random() * weightsScores.length); +} + +export type RelayerInstanceList = { + [key in string]: { + instanceAddress: { + [key in string]: string; + }; + }; +}; + +export function getSupportedInstances(instanceList: RelayerInstanceList) { + const rawList = Object.values(instanceList) + .map(({ instanceAddress }) => { + return Object.values(instanceAddress); + }) + .flat(); + + return rawList.map((l) => getAddress(l)); +} + +export function pickWeightedRandomRelayer(relayers: RelayerInfo[], netId: NetIdType) { + let minFee: number, maxFee: number; + + if (netId !== NetId.MAINNET) { + minFee = 0.01; + maxFee = 0.3; + } + + const weightsScores = relayers.map((el) => calculateScore(el, minFee, maxFee)); + const totalWeight = weightsScores.reduce((acc, curr) => { + return (acc = acc + curr); + }, BigInt('0')); + + const random = BigInt(Number(totalWeight) * Math.random()); + const weightRandomIndex = getWeightRandom(weightsScores, random); + + return relayers[weightRandomIndex]; +} + +export interface RelayerClientConstructor { + netId: NetIdType; + config: Config; + Aggregator: Aggregator; + fetchDataOptions?: fetchDataOptions; +} + +export type RelayerClientWithdraw = snarkProofs & { + contract: string; +}; + +export class RelayerClient { + netId: NetIdType; + config: Config; + Aggregator: Aggregator; + selectedRelayer?: Relayer; + fetchDataOptions?: fetchDataOptions; + + constructor({ netId, config, Aggregator, fetchDataOptions }: RelayerClientConstructor) { + this.netId = netId; + this.config = config; + this.Aggregator = Aggregator; + this.fetchDataOptions = fetchDataOptions; + } + + async askRelayerStatus({ + hostname, + relayerAddress, + }: { + hostname: string; + relayerAddress?: string; + }): Promise { + const url = `https://${!hostname.endsWith('/') ? hostname + '/' : hostname}`; + + const rawStatus = (await fetchData(`${url}status`, { + ...this.fetchDataOptions, + headers: { + 'Content-Type': 'application/json, application/x-www-form-urlencoded', + }, + timeout: this.fetchDataOptions?.torPort ? 10000 : 3000, + maxRetry: this.fetchDataOptions?.torPort ? 2 : 0, + })) as object; + + const statusValidator = ajv.compile(getStatusSchema(this.netId, this.config)); + + if (!statusValidator(rawStatus)) { + throw new Error('Invalid status schema'); + } + + const status = { + ...rawStatus, + url, + } as RelayerStatus; + + if (status.currentQueue > 5) { + throw new Error('Withdrawal queue is overloaded'); + } + + if (status.netId !== this.netId) { + throw new Error('This relayer serves a different network'); + } + + if (relayerAddress && this.netId === NetId.MAINNET && status.rewardAccount !== relayerAddress) { + throw new Error('The Relayer reward address must match registered address'); + } + + if (!isRelayerUpdated(status.version, this.netId)) { + throw new Error('Outdated version.'); + } + + return status; + } + + async filterRelayer( + curr: RelayerStructOutput, + relayer: RelayerParams, + subdomains: string[], + debugRelayer: boolean = false, + ): Promise { + const { ensSubdomainKey } = this.config; + const subdomainIndex = subdomains.indexOf(ensSubdomainKey); + const mainnetSubdomain = curr.records[0]; + const hostname = curr.records[subdomainIndex]; + const isHostWithProtocol = hostname.includes('http'); + + const { owner, balance: stakeBalance, isRegistered } = curr; + const { ensName, relayerAddress } = relayer; + + const isOwner = !relayerAddress || relayerAddress === owner; + const hasMinBalance = stakeBalance >= MIN_STAKE_BALANCE; + + const preCondition = + hostname && isOwner && mainnetSubdomain && isRegistered && hasMinBalance && !isHostWithProtocol; + + if (preCondition || debugRelayer) { + try { + const status = await this.askRelayerStatus({ hostname, relayerAddress }); + + return { + netId: status.netId, + url: status.url, + hostname, + ensName, + stakeBalance, + relayerAddress, + rewardAccount: getAddress(status.rewardAccount), + instances: getSupportedInstances(status.instances), + gasPrice: status.gasPrices?.fast, + ethPrices: status.ethPrices, + currentQueue: status.currentQueue, + tornadoServiceFee: status.tornadoServiceFee, + } as RelayerInfo; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (err: any) { + if (debugRelayer) { + throw err; + } + return { + hostname, + relayerAddress, + errorMessage: err.message, + } as RelayerError; + } + } else { + if (debugRelayer) { + const errMsg = `Relayer ${hostname} condition not met`; + throw new Error(errMsg); + } + return { + hostname, + relayerAddress, + errorMessage: `Relayer ${hostname} condition not met`, + }; + } + } + + async getValidRelayers( + // this should be ascending order of events + relayers: RelayerParams[], + subdomains: string[], + debugRelayer: boolean = false, + ): Promise<{ + validRelayers: RelayerInfo[]; + invalidRelayers: RelayerError[]; + }> { + const relayersSet = new Set(); + + const uniqueRelayers = relayers.reverse().filter(({ ensName }) => { + if (!relayersSet.has(ensName)) { + relayersSet.add(ensName); + return true; + } + return false; + }); + + const relayerNameHashes = uniqueRelayers.map((r) => namehash(r.ensName)); + + const relayersData = await this.Aggregator.relayersData.staticCall(relayerNameHashes, subdomains); + + const invalidRelayers: RelayerError[] = []; + + const validRelayers = ( + await Promise.all( + relayersData.map((curr, index) => this.filterRelayer(curr, uniqueRelayers[index], subdomains, debugRelayer)), + ) + ).filter((r) => { + if ((r as RelayerError).errorMessage) { + invalidRelayers.push(r); + return false; + } + return true; + }) as RelayerInfo[]; + + return { + validRelayers, + invalidRelayers, + }; + } + + pickWeightedRandomRelayer(relayers: RelayerInfo[]) { + return pickWeightedRandomRelayer(relayers, this.netId); + } + + async tornadoWithdraw({ contract, proof, args }: RelayerClientWithdraw) { + const { url } = this.selectedRelayer as Relayer; + + const withdrawResponse = (await fetchData(`${url}v1/tornadoWithdraw`, { + ...this.fetchDataOptions, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + contract, + proof, + args, + }), + })) as RelayerTornadoWithdraw; + + const { id, error } = withdrawResponse; + + if (error) { + throw new Error(error); + } + + let relayerStatus: string | undefined; + + const jobUrl = `${url}v1/jobs/${id}`; + + console.log(`Job submitted: ${jobUrl}\n`); + + while (!relayerStatus || !['FAILED', 'CONFIRMED'].includes(relayerStatus)) { + const jobResponse = await fetchData(jobUrl, { + ...this.fetchDataOptions, + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (jobResponse.error) { + throw new Error(error); + } + + const jobValidator = ajv.compile(jobsSchema); + + if (!jobValidator(jobResponse)) { + const errMsg = `${jobUrl} has an invalid job response`; + throw new Error(errMsg); + } + + const { status, txHash, confirmations, failedReason } = jobResponse as unknown as RelayerTornadoJobs; + + if (relayerStatus !== status) { + if (status === 'FAILED') { + const errMsg = `Job ${status}: ${jobUrl} failed reason: ${failedReason}`; + throw new Error(errMsg); + } else if (status === 'SENT') { + console.log(`Job ${status}: ${jobUrl}, txhash: ${txHash}\n`); + } else if (status === 'MINED') { + console.log(`Job ${status}: ${jobUrl}, txhash: ${txHash}, confirmations: ${confirmations}\n`); + } else if (status === 'CONFIRMED') { + console.log(`Job ${status}: ${jobUrl}, txhash: ${txHash}, confirmations: ${confirmations}\n`); + } else { + console.log(`Job ${status}: ${jobUrl}\n`); + } + + relayerStatus = status; + } + + await sleep(3000); + } + } +} diff --git a/src/schemas/index.ts b/src/schemas/index.ts new file mode 100644 index 0000000..b7059a2 --- /dev/null +++ b/src/schemas/index.ts @@ -0,0 +1,21 @@ +import Ajv from 'ajv'; +import type { BigNumberish } from 'ethers'; + +export const ajv = new Ajv({ allErrors: true }); + +ajv.addKeyword({ + keyword: 'BN', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + validate: (schema: any, data: BigNumberish) => { + try { + BigInt(data); + return true; + } catch (e) { + return false; + } + }, + errors: true, +}); + +export * from './status'; +export * from './jobs'; diff --git a/src/schemas/jobs.ts b/src/schemas/jobs.ts new file mode 100644 index 0000000..30624a1 --- /dev/null +++ b/src/schemas/jobs.ts @@ -0,0 +1,59 @@ +export type jobsSchema = { + type: string; + properties: { + error: { + type: string; + }; + id: { + type: string; + }; + type: { + type: string; + }; + status: { + type: string; + }; + contract: { + type: string; + }; + proof: { + type: string; + }; + args: { + type: string; + items: { + type: string; + }; + }; + txHash: { + type: string; + }; + confirmations: { + type: string; + }; + failedReason: { + type: string; + }; + }; + required: string[]; +}; + +export const jobsSchema: jobsSchema = { + type: 'object', + properties: { + error: { type: 'string' }, + id: { type: 'string' }, + type: { type: 'string' }, + status: { type: 'string' }, + contract: { type: 'string' }, + proof: { type: 'string' }, + args: { + type: 'array', + items: { type: 'string' }, + }, + txHash: { type: 'string' }, + confirmations: { type: 'number' }, + failedReason: { type: 'string' }, + }, + required: ['id', 'status'], +}; diff --git a/src/schemas/status.ts b/src/schemas/status.ts new file mode 100644 index 0000000..4a0a516 --- /dev/null +++ b/src/schemas/status.ts @@ -0,0 +1,181 @@ +import { Config, NetId, NetIdType } from '../networkConfig'; + +export type statusInstanceType = { + type: string; + properties: { + instanceAddress: { + type: string; + properties: { + [key in string]: typeof addressType; + }; + required: string[]; + }; + tokenAddress?: typeof addressType; + symbol?: { enum: string[] }; + decimals: { enum: number[] }; + }; + required: string[]; +}; + +export type statusInstancesType = { + type: string; + properties: { + [key in string]: statusInstanceType; + }; + required: string[]; +}; + +export type statusEthPricesType = { + type: string; + properties: { + [key in string]: typeof bnType; + }; + required?: string[]; +}; + +export type statusSchema = { + type: string; + properties: { + rewardAccount: typeof addressType; + instances?: statusInstancesType; + gasPrices: { + type: string; + properties: { + [key in string]: { + type: string; + }; + }; + required: string[]; + }; + netId: { + type: string; + }; + ethPrices?: statusEthPricesType; + tornadoServiceFee?: { + type: string; + maximum: number; + minimum: number; + }; + latestBlock?: { + type: string; + }; + version: { + type: string; + }; + health: { + type: string; + properties: { + status: { const: string }; + error: { type: string }; + }; + required: string[]; + }; + currentQueue: { + type: string; + }; + }; + required: string[]; +}; + +const addressType = { type: 'string', pattern: '^0x[a-fA-F0-9]{40}$' }; + +const bnType = { type: 'string', BN: true }; + +const statusSchema: statusSchema = { + type: 'object', + properties: { + rewardAccount: addressType, + gasPrices: { + type: 'object', + properties: { + fast: { type: 'number' }, + additionalProperties: { type: 'number' }, + }, + required: ['fast'], + }, + netId: { type: 'integer' }, + tornadoServiceFee: { type: 'number', maximum: 20, minimum: 0 }, + latestBlock: { type: 'number' }, + version: { type: 'string' }, + health: { + type: 'object', + properties: { + status: { const: 'true' }, + error: { type: 'string' }, + }, + required: ['status'], + }, + currentQueue: { type: 'number' }, + }, + required: ['rewardAccount', 'instances', 'netId', 'tornadoServiceFee', 'version', 'health'], +}; + +export function getStatusSchema(netId: NetIdType, config: Config) { + const { tokens, optionalTokens = [], nativeCurrency } = config; + + // deep copy schema + const schema = JSON.parse(JSON.stringify(statusSchema)) as statusSchema; + + const instances = Object.keys(tokens).reduce( + (acc: statusInstancesType, token) => { + const { instanceAddress, tokenAddress, symbol, decimals, optionalInstances = [] } = tokens[token]; + const amounts = Object.keys(instanceAddress); + + const instanceProperties: statusInstanceType = { + type: 'object', + properties: { + instanceAddress: { + type: 'object', + properties: amounts.reduce((acc: { [key in string]: typeof addressType }, cur) => { + acc[cur] = addressType; + return acc; + }, {}), + required: amounts.filter((amount) => !optionalInstances.includes(amount)), + }, + decimals: { enum: [decimals] }, + }, + required: ['instanceAddress', 'decimals'].concat( + tokenAddress ? ['tokenAddress'] : [], + symbol ? ['symbol'] : [], + ), + }; + + if (tokenAddress) { + instanceProperties.properties.tokenAddress = addressType; + } + if (symbol) { + instanceProperties.properties.symbol = { enum: [symbol] }; + } + + acc.properties[token] = instanceProperties; + if (!optionalTokens.includes(token)) { + acc.required.push(token); + } + return acc; + }, + { + type: 'object', + properties: {}, + required: [], + }, + ); + + schema.properties.instances = instances; + + if (netId === NetId.MAINNET) { + const _tokens = Object.keys(tokens).filter((t) => t !== nativeCurrency); + + const ethPrices: statusEthPricesType = { + type: 'object', + properties: _tokens.reduce((acc: { [key in string]: typeof bnType }, token: string) => { + acc[token] = bnType; + return acc; + }, {}), + // required: _tokens + }; + schema.properties.ethPrices = ethPrices; + // schema.required.push('ethPrices') + } + + return schema; +} diff --git a/src/tokens.ts b/src/tokens.ts new file mode 100644 index 0000000..b5eac82 --- /dev/null +++ b/src/tokens.ts @@ -0,0 +1,90 @@ +import { Provider, ZeroAddress } from 'ethers'; +import { ERC20__factory, Multicall } from './typechain'; +import { chunk } from './utils'; +import { Call3, multicall } from './multicall'; + +export interface tokenBalances { + address: string; + name: string; + symbol: string; + decimals: number; + balance: bigint; +} + +export async function getTokenBalances({ + provider, + Multicall, + currencyName, + userAddress, + tokenAddresses = [], +}: { + provider: Provider; + Multicall: Multicall; + currencyName: string; + userAddress: string; + tokenAddresses: string[]; +}): Promise { + const tokenCalls = tokenAddresses + .map((tokenAddress) => { + const Token = ERC20__factory.connect(tokenAddress, provider); + + return [ + { + contract: Token, + name: 'balanceOf', + params: [userAddress], + }, + { + contract: Token, + name: 'name', + }, + { + contract: Token, + name: 'symbol', + }, + { + contract: Token, + name: 'decimals', + }, + ]; + }) + .flat() as Call3[]; + + const multicallResults = await multicall(Multicall, [ + { + contract: Multicall, + name: 'getEthBalance', + params: [userAddress], + }, + ...(tokenCalls.length ? tokenCalls : []), + ]); + + const ethResults = multicallResults[0]; + const tokenResults = multicallResults.slice(1).length + ? chunk(multicallResults.slice(1), tokenCalls.length / tokenAddresses.length) + : []; + + const tokenBalances = tokenResults.map((tokenResult, index) => { + const [tokenBalance, tokenName, tokenSymbol, tokenDecimals] = tokenResult; + const tokenAddress = tokenAddresses[index]; + + return { + address: tokenAddress, + name: tokenName, + symbol: tokenSymbol, + decimals: Number(tokenDecimals), + balance: tokenBalance, + }; + }); + + return [ + { + address: ZeroAddress, + name: currencyName, + symbol: currencyName, + decimals: 18, + balance: ethResults, + }, + ...tokenBalances, + ]; +} diff --git a/src/treeCache.ts b/src/treeCache.ts new file mode 100644 index 0000000..bff46c2 --- /dev/null +++ b/src/treeCache.ts @@ -0,0 +1,113 @@ +/** + * Create tree cache file from node.js + * + * Only works for node.js, modified from https://github.com/tornadocash/tornado-classic-ui/blob/master/scripts/updateTree.js + */ +import { MerkleTree } from '@tornado/fixed-merkle-tree'; +import BloomFilter from 'bloomfilter.js'; +import { saveUserFile } from './data'; +import { DepositsEvents } from './events'; +import type { NetIdType } from './networkConfig'; + +export interface TreeCacheConstructor { + netId: NetIdType; + amount: string; + currency: string; + userDirectory: string; + PARTS_COUNT?: number; + LEAVES?: number; + zeroElement?: string; +} + +export interface treeMetadata { + blockNumber: number; + logIndex: number; + transactionHash: string; + timestamp: number; + from: string; + leafIndex: number; +} + +export class TreeCache { + netId: NetIdType; + amount: string; + currency: string; + userDirectory: string; + + PARTS_COUNT: number; + + constructor({ netId, amount, currency, userDirectory, PARTS_COUNT = 4 }: TreeCacheConstructor) { + this.netId = netId; + this.amount = amount; + this.currency = currency; + this.userDirectory = userDirectory; + + this.PARTS_COUNT = PARTS_COUNT; + } + + getInstanceName(): string { + return `deposits_${this.netId}_${this.currency}_${this.amount}`; + } + + async createTree(events: DepositsEvents[], tree: MerkleTree) { + const bloom = new BloomFilter(events.length); + + console.log(`Creating cached tree for ${this.getInstanceName()}\n`); + + // events indexed by commitment + const eventsData = events.reduce( + (acc, { leafIndex, commitment, ...rest }, i) => { + if (leafIndex !== i) { + throw new Error(`leafIndex (${leafIndex}) !== i (${i})`); + } + + acc[commitment] = { ...rest, leafIndex }; + + return acc; + }, + {} as { [key in string]: treeMetadata }, + ); + + const slices = tree.getTreeSlices(this.PARTS_COUNT); + + await Promise.all( + slices.map(async (slice, index) => { + const metadata = slice.elements.reduce((acc, curr) => { + if (index < this.PARTS_COUNT - 1) { + bloom.add(curr); + } + acc.push(eventsData[curr]); + return acc; + }, [] as treeMetadata[]); + + const dataString = + JSON.stringify( + { + ...slice, + metadata, + }, + null, + 2, + ) + '\n'; + + const fileName = `${this.getInstanceName()}_slice${index + 1}.json`; + + await saveUserFile({ + fileName, + userDirectory: this.userDirectory, + dataString, + }); + }), + ); + + const dataString = bloom.serialize() + '\n'; + + const fileName = `${this.getInstanceName()}_bloom.json`; + + await saveUserFile({ + fileName, + userDirectory: this.userDirectory, + dataString, + }); + } +} diff --git a/src/typechain/ENS.ts b/src/typechain/ENS.ts new file mode 100644 index 0000000..2f0a964 --- /dev/null +++ b/src/typechain/ENS.ts @@ -0,0 +1,756 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export interface ENSInterface extends Interface { + getFunction( + nameOrSignature: + | "supportsInterface" + | "setText" + | "interfaceImplementer" + | "ABI" + | "setPubkey" + | "setContenthash" + | "addr(bytes32)" + | "addr(bytes32,uint256)" + | "setAuthorisation" + | "text" + | "setABI" + | "name" + | "setName" + | "setAddr(bytes32,uint256,bytes)" + | "setAddr(bytes32,address)" + | "contenthash" + | "pubkey" + | "setInterface" + | "authorisations" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "AuthorisationChanged" + | "TextChanged" + | "PubkeyChanged" + | "NameChanged" + | "InterfaceChanged" + | "ContenthashChanged" + | "AddrChanged" + | "AddressChanged" + | "ABIChanged" + ): EventFragment; + + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setText", + values: [BytesLike, string, string] + ): string; + encodeFunctionData( + functionFragment: "interfaceImplementer", + values: [BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "ABI", + values: [BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setPubkey", + values: [BytesLike, BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setContenthash", + values: [BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "addr(bytes32)", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "addr(bytes32,uint256)", + values: [BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setAuthorisation", + values: [BytesLike, AddressLike, boolean] + ): string; + encodeFunctionData( + functionFragment: "text", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "setABI", + values: [BytesLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData(functionFragment: "name", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "setName", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "setAddr(bytes32,uint256,bytes)", + values: [BytesLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setAddr(bytes32,address)", + values: [BytesLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "contenthash", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "pubkey", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "setInterface", + values: [BytesLike, BytesLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "authorisations", + values: [BytesLike, AddressLike, AddressLike] + ): string; + + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setText", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "interfaceImplementer", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "ABI", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "setPubkey", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setContenthash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addr(bytes32)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addr(bytes32,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setAuthorisation", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "text", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "setABI", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "setName", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setAddr(bytes32,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setAddr(bytes32,address)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contenthash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "pubkey", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "authorisations", + data: BytesLike + ): Result; +} + +export namespace AuthorisationChangedEvent { + export type InputTuple = [ + node: BytesLike, + owner: AddressLike, + target: AddressLike, + isAuthorised: boolean + ]; + export type OutputTuple = [ + node: string, + owner: string, + target: string, + isAuthorised: boolean + ]; + export interface OutputObject { + node: string; + owner: string; + target: string; + isAuthorised: boolean; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TextChangedEvent { + export type InputTuple = [node: BytesLike, indexedKey: string, key: string]; + export type OutputTuple = [node: string, indexedKey: string, key: string]; + export interface OutputObject { + node: string; + indexedKey: string; + key: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace PubkeyChangedEvent { + export type InputTuple = [node: BytesLike, x: BytesLike, y: BytesLike]; + export type OutputTuple = [node: string, x: string, y: string]; + export interface OutputObject { + node: string; + x: string; + y: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace NameChangedEvent { + export type InputTuple = [node: BytesLike, name: string]; + export type OutputTuple = [node: string, name: string]; + export interface OutputObject { + node: string; + name: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace InterfaceChangedEvent { + export type InputTuple = [ + node: BytesLike, + interfaceID: BytesLike, + implementer: AddressLike + ]; + export type OutputTuple = [ + node: string, + interfaceID: string, + implementer: string + ]; + export interface OutputObject { + node: string; + interfaceID: string; + implementer: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ContenthashChangedEvent { + export type InputTuple = [node: BytesLike, hash: BytesLike]; + export type OutputTuple = [node: string, hash: string]; + export interface OutputObject { + node: string; + hash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace AddrChangedEvent { + export type InputTuple = [node: BytesLike, a: AddressLike]; + export type OutputTuple = [node: string, a: string]; + export interface OutputObject { + node: string; + a: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace AddressChangedEvent { + export type InputTuple = [ + node: BytesLike, + coinType: BigNumberish, + newAddress: BytesLike + ]; + export type OutputTuple = [ + node: string, + coinType: bigint, + newAddress: string + ]; + export interface OutputObject { + node: string; + coinType: bigint; + newAddress: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ABIChangedEvent { + export type InputTuple = [node: BytesLike, contentType: BigNumberish]; + export type OutputTuple = [node: string, contentType: bigint]; + export interface OutputObject { + node: string; + contentType: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface ENS extends BaseContract { + connect(runner?: ContractRunner | null): ENS; + waitForDeployment(): Promise; + + interface: ENSInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + supportsInterface: TypedContractMethod< + [interfaceID: BytesLike], + [boolean], + "view" + >; + + setText: TypedContractMethod< + [node: BytesLike, key: string, value: string], + [void], + "nonpayable" + >; + + interfaceImplementer: TypedContractMethod< + [node: BytesLike, interfaceID: BytesLike], + [string], + "view" + >; + + ABI: TypedContractMethod< + [node: BytesLike, contentTypes: BigNumberish], + [[bigint, string]], + "view" + >; + + setPubkey: TypedContractMethod< + [node: BytesLike, x: BytesLike, y: BytesLike], + [void], + "nonpayable" + >; + + setContenthash: TypedContractMethod< + [node: BytesLike, hash: BytesLike], + [void], + "nonpayable" + >; + + "addr(bytes32)": TypedContractMethod<[node: BytesLike], [string], "view">; + + "addr(bytes32,uint256)": TypedContractMethod< + [node: BytesLike, coinType: BigNumberish], + [string], + "view" + >; + + setAuthorisation: TypedContractMethod< + [node: BytesLike, target: AddressLike, isAuthorised: boolean], + [void], + "nonpayable" + >; + + text: TypedContractMethod<[node: BytesLike, key: string], [string], "view">; + + setABI: TypedContractMethod< + [node: BytesLike, contentType: BigNumberish, data: BytesLike], + [void], + "nonpayable" + >; + + name: TypedContractMethod<[node: BytesLike], [string], "view">; + + setName: TypedContractMethod< + [node: BytesLike, name: string], + [void], + "nonpayable" + >; + + "setAddr(bytes32,uint256,bytes)": TypedContractMethod< + [node: BytesLike, coinType: BigNumberish, a: BytesLike], + [void], + "nonpayable" + >; + + "setAddr(bytes32,address)": TypedContractMethod< + [node: BytesLike, a: AddressLike], + [void], + "nonpayable" + >; + + contenthash: TypedContractMethod<[node: BytesLike], [string], "view">; + + pubkey: TypedContractMethod< + [node: BytesLike], + [[string, string] & { x: string; y: string }], + "view" + >; + + setInterface: TypedContractMethod< + [node: BytesLike, interfaceID: BytesLike, implementer: AddressLike], + [void], + "nonpayable" + >; + + authorisations: TypedContractMethod< + [arg0: BytesLike, arg1: AddressLike, arg2: AddressLike], + [boolean], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "supportsInterface" + ): TypedContractMethod<[interfaceID: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "setText" + ): TypedContractMethod< + [node: BytesLike, key: string, value: string], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "interfaceImplementer" + ): TypedContractMethod< + [node: BytesLike, interfaceID: BytesLike], + [string], + "view" + >; + getFunction( + nameOrSignature: "ABI" + ): TypedContractMethod< + [node: BytesLike, contentTypes: BigNumberish], + [[bigint, string]], + "view" + >; + getFunction( + nameOrSignature: "setPubkey" + ): TypedContractMethod< + [node: BytesLike, x: BytesLike, y: BytesLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "setContenthash" + ): TypedContractMethod< + [node: BytesLike, hash: BytesLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "addr(bytes32)" + ): TypedContractMethod<[node: BytesLike], [string], "view">; + getFunction( + nameOrSignature: "addr(bytes32,uint256)" + ): TypedContractMethod< + [node: BytesLike, coinType: BigNumberish], + [string], + "view" + >; + getFunction( + nameOrSignature: "setAuthorisation" + ): TypedContractMethod< + [node: BytesLike, target: AddressLike, isAuthorised: boolean], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "text" + ): TypedContractMethod<[node: BytesLike, key: string], [string], "view">; + getFunction( + nameOrSignature: "setABI" + ): TypedContractMethod< + [node: BytesLike, contentType: BigNumberish, data: BytesLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "name" + ): TypedContractMethod<[node: BytesLike], [string], "view">; + getFunction( + nameOrSignature: "setName" + ): TypedContractMethod<[node: BytesLike, name: string], [void], "nonpayable">; + getFunction( + nameOrSignature: "setAddr(bytes32,uint256,bytes)" + ): TypedContractMethod< + [node: BytesLike, coinType: BigNumberish, a: BytesLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "setAddr(bytes32,address)" + ): TypedContractMethod< + [node: BytesLike, a: AddressLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "contenthash" + ): TypedContractMethod<[node: BytesLike], [string], "view">; + getFunction( + nameOrSignature: "pubkey" + ): TypedContractMethod< + [node: BytesLike], + [[string, string] & { x: string; y: string }], + "view" + >; + getFunction( + nameOrSignature: "setInterface" + ): TypedContractMethod< + [node: BytesLike, interfaceID: BytesLike, implementer: AddressLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "authorisations" + ): TypedContractMethod< + [arg0: BytesLike, arg1: AddressLike, arg2: AddressLike], + [boolean], + "view" + >; + + getEvent( + key: "AuthorisationChanged" + ): TypedContractEvent< + AuthorisationChangedEvent.InputTuple, + AuthorisationChangedEvent.OutputTuple, + AuthorisationChangedEvent.OutputObject + >; + getEvent( + key: "TextChanged" + ): TypedContractEvent< + TextChangedEvent.InputTuple, + TextChangedEvent.OutputTuple, + TextChangedEvent.OutputObject + >; + getEvent( + key: "PubkeyChanged" + ): TypedContractEvent< + PubkeyChangedEvent.InputTuple, + PubkeyChangedEvent.OutputTuple, + PubkeyChangedEvent.OutputObject + >; + getEvent( + key: "NameChanged" + ): TypedContractEvent< + NameChangedEvent.InputTuple, + NameChangedEvent.OutputTuple, + NameChangedEvent.OutputObject + >; + getEvent( + key: "InterfaceChanged" + ): TypedContractEvent< + InterfaceChangedEvent.InputTuple, + InterfaceChangedEvent.OutputTuple, + InterfaceChangedEvent.OutputObject + >; + getEvent( + key: "ContenthashChanged" + ): TypedContractEvent< + ContenthashChangedEvent.InputTuple, + ContenthashChangedEvent.OutputTuple, + ContenthashChangedEvent.OutputObject + >; + getEvent( + key: "AddrChanged" + ): TypedContractEvent< + AddrChangedEvent.InputTuple, + AddrChangedEvent.OutputTuple, + AddrChangedEvent.OutputObject + >; + getEvent( + key: "AddressChanged" + ): TypedContractEvent< + AddressChangedEvent.InputTuple, + AddressChangedEvent.OutputTuple, + AddressChangedEvent.OutputObject + >; + getEvent( + key: "ABIChanged" + ): TypedContractEvent< + ABIChangedEvent.InputTuple, + ABIChangedEvent.OutputTuple, + ABIChangedEvent.OutputObject + >; + + filters: { + "AuthorisationChanged(bytes32,address,address,bool)": TypedContractEvent< + AuthorisationChangedEvent.InputTuple, + AuthorisationChangedEvent.OutputTuple, + AuthorisationChangedEvent.OutputObject + >; + AuthorisationChanged: TypedContractEvent< + AuthorisationChangedEvent.InputTuple, + AuthorisationChangedEvent.OutputTuple, + AuthorisationChangedEvent.OutputObject + >; + + "TextChanged(bytes32,string,string)": TypedContractEvent< + TextChangedEvent.InputTuple, + TextChangedEvent.OutputTuple, + TextChangedEvent.OutputObject + >; + TextChanged: TypedContractEvent< + TextChangedEvent.InputTuple, + TextChangedEvent.OutputTuple, + TextChangedEvent.OutputObject + >; + + "PubkeyChanged(bytes32,bytes32,bytes32)": TypedContractEvent< + PubkeyChangedEvent.InputTuple, + PubkeyChangedEvent.OutputTuple, + PubkeyChangedEvent.OutputObject + >; + PubkeyChanged: TypedContractEvent< + PubkeyChangedEvent.InputTuple, + PubkeyChangedEvent.OutputTuple, + PubkeyChangedEvent.OutputObject + >; + + "NameChanged(bytes32,string)": TypedContractEvent< + NameChangedEvent.InputTuple, + NameChangedEvent.OutputTuple, + NameChangedEvent.OutputObject + >; + NameChanged: TypedContractEvent< + NameChangedEvent.InputTuple, + NameChangedEvent.OutputTuple, + NameChangedEvent.OutputObject + >; + + "InterfaceChanged(bytes32,bytes4,address)": TypedContractEvent< + InterfaceChangedEvent.InputTuple, + InterfaceChangedEvent.OutputTuple, + InterfaceChangedEvent.OutputObject + >; + InterfaceChanged: TypedContractEvent< + InterfaceChangedEvent.InputTuple, + InterfaceChangedEvent.OutputTuple, + InterfaceChangedEvent.OutputObject + >; + + "ContenthashChanged(bytes32,bytes)": TypedContractEvent< + ContenthashChangedEvent.InputTuple, + ContenthashChangedEvent.OutputTuple, + ContenthashChangedEvent.OutputObject + >; + ContenthashChanged: TypedContractEvent< + ContenthashChangedEvent.InputTuple, + ContenthashChangedEvent.OutputTuple, + ContenthashChangedEvent.OutputObject + >; + + "AddrChanged(bytes32,address)": TypedContractEvent< + AddrChangedEvent.InputTuple, + AddrChangedEvent.OutputTuple, + AddrChangedEvent.OutputObject + >; + AddrChanged: TypedContractEvent< + AddrChangedEvent.InputTuple, + AddrChangedEvent.OutputTuple, + AddrChangedEvent.OutputObject + >; + + "AddressChanged(bytes32,uint256,bytes)": TypedContractEvent< + AddressChangedEvent.InputTuple, + AddressChangedEvent.OutputTuple, + AddressChangedEvent.OutputObject + >; + AddressChanged: TypedContractEvent< + AddressChangedEvent.InputTuple, + AddressChangedEvent.OutputTuple, + AddressChangedEvent.OutputObject + >; + + "ABIChanged(bytes32,uint256)": TypedContractEvent< + ABIChangedEvent.InputTuple, + ABIChangedEvent.OutputTuple, + ABIChangedEvent.OutputObject + >; + ABIChanged: TypedContractEvent< + ABIChangedEvent.InputTuple, + ABIChangedEvent.OutputTuple, + ABIChangedEvent.OutputObject + >; + }; +} diff --git a/src/typechain/ERC20.ts b/src/typechain/ERC20.ts new file mode 100644 index 0000000..d8c716a --- /dev/null +++ b/src/typechain/ERC20.ts @@ -0,0 +1,351 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export interface ERC20Interface extends Interface { + getFunction( + nameOrSignature: + | "totalSupply" + | "_totalSupply" + | "balanceOf" + | "name" + | "symbol" + | "decimals" + | "transfer" + | "allowance" + | "transferFrom" + | "approve" + | "nonces" + | "permit" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Approval" | "Transfer"): EventFragment; + + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "balanceOf", + values: [AddressLike] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( + functionFragment: "transfer", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "allowance", + values: [AddressLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "nonces", values: [AddressLike]): string; + encodeFunctionData( + functionFragment: "permit", + values: [ + AddressLike, + AddressLike, + BigNumberish, + BigNumberish, + BigNumberish, + BytesLike, + BytesLike + ] + ): string; + + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "nonces", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "permit", data: BytesLike): Result; +} + +export namespace ApprovalEvent { + export type InputTuple = [ + owner: AddressLike, + spender: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [owner: string, spender: string, value: bigint]; + export interface OutputObject { + owner: string; + spender: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TransferEvent { + export type InputTuple = [ + from: AddressLike, + to: AddressLike, + value: BigNumberish + ]; + export type OutputTuple = [from: string, to: string, value: bigint]; + export interface OutputObject { + from: string; + to: string; + value: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface ERC20 extends BaseContract { + connect(runner?: ContractRunner | null): ERC20; + waitForDeployment(): Promise; + + interface: ERC20Interface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + totalSupply: TypedContractMethod<[], [bigint], "view">; + + _totalSupply: TypedContractMethod<[], [bigint], "view">; + + balanceOf: TypedContractMethod<[who: AddressLike], [bigint], "view">; + + name: TypedContractMethod<[], [string], "view">; + + symbol: TypedContractMethod<[], [string], "view">; + + decimals: TypedContractMethod<[], [bigint], "view">; + + transfer: TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [void], + "nonpayable" + >; + + allowance: TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + + transferFrom: TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [void], + "nonpayable" + >; + + approve: TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [void], + "nonpayable" + >; + + nonces: TypedContractMethod<[owner: AddressLike], [bigint], "view">; + + permit: TypedContractMethod< + [ + owner: AddressLike, + spender: AddressLike, + amount: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike + ], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "totalSupply" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "_totalSupply" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "balanceOf" + ): TypedContractMethod<[who: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "name" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "symbol" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "decimals" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "transfer" + ): TypedContractMethod< + [to: AddressLike, value: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "allowance" + ): TypedContractMethod< + [owner: AddressLike, spender: AddressLike], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "transferFrom" + ): TypedContractMethod< + [from: AddressLike, to: AddressLike, value: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "approve" + ): TypedContractMethod< + [spender: AddressLike, value: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "nonces" + ): TypedContractMethod<[owner: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "permit" + ): TypedContractMethod< + [ + owner: AddressLike, + spender: AddressLike, + amount: BigNumberish, + deadline: BigNumberish, + v: BigNumberish, + r: BytesLike, + s: BytesLike + ], + [void], + "nonpayable" + >; + + getEvent( + key: "Approval" + ): TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + getEvent( + key: "Transfer" + ): TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + + filters: { + "Approval(address,address,uint256)": TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + Approval: TypedContractEvent< + ApprovalEvent.InputTuple, + ApprovalEvent.OutputTuple, + ApprovalEvent.OutputObject + >; + + "Transfer(address,address,uint256)": TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + Transfer: TypedContractEvent< + TransferEvent.InputTuple, + TransferEvent.OutputTuple, + TransferEvent.OutputObject + >; + }; +} diff --git a/src/typechain/GasPriceOracle.ts b/src/typechain/GasPriceOracle.ts new file mode 100644 index 0000000..081c93d --- /dev/null +++ b/src/typechain/GasPriceOracle.ts @@ -0,0 +1,271 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "./common"; + +export interface GasPriceOracleInterface extends Interface { + getFunction( + nameOrSignature: + | "GAS_UNIT" + | "changeDerivationThresold" + | "changeGasUnit" + | "changeHeartbeat" + | "changeOwnership" + | "derivationThresold" + | "gasPrice" + | "heartbeat" + | "maxFeePerGas" + | "maxPriorityFeePerGas" + | "owner" + | "pastGasPrice" + | "setGasPrice" + | "timestamp" + ): FunctionFragment; + + encodeFunctionData(functionFragment: "GAS_UNIT", values?: undefined): string; + encodeFunctionData( + functionFragment: "changeDerivationThresold", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "changeGasUnit", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "changeHeartbeat", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "changeOwnership", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "derivationThresold", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "gasPrice", values?: undefined): string; + encodeFunctionData(functionFragment: "heartbeat", values?: undefined): string; + encodeFunctionData( + functionFragment: "maxFeePerGas", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "maxPriorityFeePerGas", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "pastGasPrice", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setGasPrice", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "timestamp", values?: undefined): string; + + decodeFunctionResult(functionFragment: "GAS_UNIT", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "changeDerivationThresold", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "changeGasUnit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "changeHeartbeat", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "changeOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "derivationThresold", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "gasPrice", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "heartbeat", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "maxFeePerGas", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "maxPriorityFeePerGas", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pastGasPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setGasPrice", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "timestamp", data: BytesLike): Result; +} + +export interface GasPriceOracle extends BaseContract { + connect(runner?: ContractRunner | null): GasPriceOracle; + waitForDeployment(): Promise; + + interface: GasPriceOracleInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + GAS_UNIT: TypedContractMethod<[], [bigint], "view">; + + changeDerivationThresold: TypedContractMethod< + [_derivationThresold: BigNumberish], + [void], + "nonpayable" + >; + + changeGasUnit: TypedContractMethod< + [_gasUnit: BigNumberish], + [void], + "nonpayable" + >; + + changeHeartbeat: TypedContractMethod< + [_heartbeat: BigNumberish], + [void], + "nonpayable" + >; + + changeOwnership: TypedContractMethod< + [_owner: AddressLike], + [void], + "nonpayable" + >; + + derivationThresold: TypedContractMethod<[], [bigint], "view">; + + gasPrice: TypedContractMethod<[], [bigint], "view">; + + heartbeat: TypedContractMethod<[], [bigint], "view">; + + maxFeePerGas: TypedContractMethod<[], [bigint], "view">; + + maxPriorityFeePerGas: TypedContractMethod<[], [bigint], "view">; + + owner: TypedContractMethod<[], [string], "view">; + + pastGasPrice: TypedContractMethod<[], [bigint], "view">; + + setGasPrice: TypedContractMethod< + [_gasPrice: BigNumberish], + [void], + "nonpayable" + >; + + timestamp: TypedContractMethod<[], [bigint], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "GAS_UNIT" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "changeDerivationThresold" + ): TypedContractMethod< + [_derivationThresold: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "changeGasUnit" + ): TypedContractMethod<[_gasUnit: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "changeHeartbeat" + ): TypedContractMethod<[_heartbeat: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "changeOwnership" + ): TypedContractMethod<[_owner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "derivationThresold" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "gasPrice" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "heartbeat" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "maxFeePerGas" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "maxPriorityFeePerGas" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "pastGasPrice" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "setGasPrice" + ): TypedContractMethod<[_gasPrice: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "timestamp" + ): TypedContractMethod<[], [bigint], "view">; + + filters: {}; +} diff --git a/src/typechain/Multicall.ts b/src/typechain/Multicall.ts new file mode 100644 index 0000000..7488ef9 --- /dev/null +++ b/src/typechain/Multicall.ts @@ -0,0 +1,416 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "./common"; + +export declare namespace Multicall3 { + export type CallStruct = { target: AddressLike; callData: BytesLike }; + + export type CallStructOutput = [target: string, callData: string] & { + target: string; + callData: string; + }; + + export type Call3Struct = { + target: AddressLike; + allowFailure: boolean; + callData: BytesLike; + }; + + export type Call3StructOutput = [ + target: string, + allowFailure: boolean, + callData: string + ] & { target: string; allowFailure: boolean; callData: string }; + + export type ResultStruct = { success: boolean; returnData: BytesLike }; + + export type ResultStructOutput = [success: boolean, returnData: string] & { + success: boolean; + returnData: string; + }; + + export type Call3ValueStruct = { + target: AddressLike; + allowFailure: boolean; + value: BigNumberish; + callData: BytesLike; + }; + + export type Call3ValueStructOutput = [ + target: string, + allowFailure: boolean, + value: bigint, + callData: string + ] & { + target: string; + allowFailure: boolean; + value: bigint; + callData: string; + }; +} + +export interface MulticallInterface extends Interface { + getFunction( + nameOrSignature: + | "aggregate" + | "aggregate3" + | "aggregate3Value" + | "blockAndAggregate" + | "getBasefee" + | "getBlockHash" + | "getBlockNumber" + | "getChainId" + | "getCurrentBlockCoinbase" + | "getCurrentBlockDifficulty" + | "getCurrentBlockGasLimit" + | "getCurrentBlockTimestamp" + | "getEthBalance" + | "getLastBlockHash" + | "tryAggregate" + | "tryBlockAndAggregate" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "aggregate", + values: [Multicall3.CallStruct[]] + ): string; + encodeFunctionData( + functionFragment: "aggregate3", + values: [Multicall3.Call3Struct[]] + ): string; + encodeFunctionData( + functionFragment: "aggregate3Value", + values: [Multicall3.Call3ValueStruct[]] + ): string; + encodeFunctionData( + functionFragment: "blockAndAggregate", + values: [Multicall3.CallStruct[]] + ): string; + encodeFunctionData( + functionFragment: "getBasefee", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getBlockHash", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getBlockNumber", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getChainId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getCurrentBlockCoinbase", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getCurrentBlockDifficulty", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getCurrentBlockGasLimit", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getCurrentBlockTimestamp", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getEthBalance", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "getLastBlockHash", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "tryAggregate", + values: [boolean, Multicall3.CallStruct[]] + ): string; + encodeFunctionData( + functionFragment: "tryBlockAndAggregate", + values: [boolean, Multicall3.CallStruct[]] + ): string; + + decodeFunctionResult(functionFragment: "aggregate", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "aggregate3", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "aggregate3Value", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "blockAndAggregate", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getBasefee", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getBlockHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getBlockNumber", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getChainId", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getCurrentBlockCoinbase", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCurrentBlockDifficulty", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCurrentBlockGasLimit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCurrentBlockTimestamp", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEthBalance", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastBlockHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tryAggregate", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tryBlockAndAggregate", + data: BytesLike + ): Result; +} + +export interface Multicall extends BaseContract { + connect(runner?: ContractRunner | null): Multicall; + waitForDeployment(): Promise; + + interface: MulticallInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + aggregate: TypedContractMethod< + [calls: Multicall3.CallStruct[]], + [[bigint, string[]] & { blockNumber: bigint; returnData: string[] }], + "payable" + >; + + aggregate3: TypedContractMethod< + [calls: Multicall3.Call3Struct[]], + [Multicall3.ResultStructOutput[]], + "payable" + >; + + aggregate3Value: TypedContractMethod< + [calls: Multicall3.Call3ValueStruct[]], + [Multicall3.ResultStructOutput[]], + "payable" + >; + + blockAndAggregate: TypedContractMethod< + [calls: Multicall3.CallStruct[]], + [ + [bigint, string, Multicall3.ResultStructOutput[]] & { + blockNumber: bigint; + blockHash: string; + returnData: Multicall3.ResultStructOutput[]; + } + ], + "payable" + >; + + getBasefee: TypedContractMethod<[], [bigint], "view">; + + getBlockHash: TypedContractMethod< + [blockNumber: BigNumberish], + [string], + "view" + >; + + getBlockNumber: TypedContractMethod<[], [bigint], "view">; + + getChainId: TypedContractMethod<[], [bigint], "view">; + + getCurrentBlockCoinbase: TypedContractMethod<[], [string], "view">; + + getCurrentBlockDifficulty: TypedContractMethod<[], [bigint], "view">; + + getCurrentBlockGasLimit: TypedContractMethod<[], [bigint], "view">; + + getCurrentBlockTimestamp: TypedContractMethod<[], [bigint], "view">; + + getEthBalance: TypedContractMethod<[addr: AddressLike], [bigint], "view">; + + getLastBlockHash: TypedContractMethod<[], [string], "view">; + + tryAggregate: TypedContractMethod< + [requireSuccess: boolean, calls: Multicall3.CallStruct[]], + [Multicall3.ResultStructOutput[]], + "payable" + >; + + tryBlockAndAggregate: TypedContractMethod< + [requireSuccess: boolean, calls: Multicall3.CallStruct[]], + [ + [bigint, string, Multicall3.ResultStructOutput[]] & { + blockNumber: bigint; + blockHash: string; + returnData: Multicall3.ResultStructOutput[]; + } + ], + "payable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "aggregate" + ): TypedContractMethod< + [calls: Multicall3.CallStruct[]], + [[bigint, string[]] & { blockNumber: bigint; returnData: string[] }], + "payable" + >; + getFunction( + nameOrSignature: "aggregate3" + ): TypedContractMethod< + [calls: Multicall3.Call3Struct[]], + [Multicall3.ResultStructOutput[]], + "payable" + >; + getFunction( + nameOrSignature: "aggregate3Value" + ): TypedContractMethod< + [calls: Multicall3.Call3ValueStruct[]], + [Multicall3.ResultStructOutput[]], + "payable" + >; + getFunction( + nameOrSignature: "blockAndAggregate" + ): TypedContractMethod< + [calls: Multicall3.CallStruct[]], + [ + [bigint, string, Multicall3.ResultStructOutput[]] & { + blockNumber: bigint; + blockHash: string; + returnData: Multicall3.ResultStructOutput[]; + } + ], + "payable" + >; + getFunction( + nameOrSignature: "getBasefee" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getBlockHash" + ): TypedContractMethod<[blockNumber: BigNumberish], [string], "view">; + getFunction( + nameOrSignature: "getBlockNumber" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getChainId" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getCurrentBlockCoinbase" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getCurrentBlockDifficulty" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getCurrentBlockGasLimit" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getCurrentBlockTimestamp" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getEthBalance" + ): TypedContractMethod<[addr: AddressLike], [bigint], "view">; + getFunction( + nameOrSignature: "getLastBlockHash" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "tryAggregate" + ): TypedContractMethod< + [requireSuccess: boolean, calls: Multicall3.CallStruct[]], + [Multicall3.ResultStructOutput[]], + "payable" + >; + getFunction( + nameOrSignature: "tryBlockAndAggregate" + ): TypedContractMethod< + [requireSuccess: boolean, calls: Multicall3.CallStruct[]], + [ + [bigint, string, Multicall3.ResultStructOutput[]] & { + blockNumber: bigint; + blockHash: string; + returnData: Multicall3.ResultStructOutput[]; + } + ], + "payable" + >; + + filters: {}; +} diff --git a/src/typechain/OffchainOracle.ts b/src/typechain/OffchainOracle.ts new file mode 100644 index 0000000..6729f68 --- /dev/null +++ b/src/typechain/OffchainOracle.ts @@ -0,0 +1,622 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export interface OffchainOracleInterface extends Interface { + getFunction( + nameOrSignature: + | "addConnector" + | "addOracle" + | "connectors" + | "getRate" + | "getRateToEth" + | "getRateToEthWithCustomConnectors" + | "getRateToEthWithThreshold" + | "getRateWithCustomConnectors" + | "getRateWithThreshold" + | "multiWrapper" + | "oracles" + | "owner" + | "removeConnector" + | "removeOracle" + | "renounceOwnership" + | "setMultiWrapper" + | "transferOwnership" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "ConnectorAdded" + | "ConnectorRemoved" + | "MultiWrapperUpdated" + | "OracleAdded" + | "OracleRemoved" + | "OwnershipTransferred" + ): EventFragment; + + encodeFunctionData( + functionFragment: "addConnector", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "addOracle", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "connectors", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getRate", + values: [AddressLike, AddressLike, boolean] + ): string; + encodeFunctionData( + functionFragment: "getRateToEth", + values: [AddressLike, boolean] + ): string; + encodeFunctionData( + functionFragment: "getRateToEthWithCustomConnectors", + values: [AddressLike, boolean, AddressLike[], BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRateToEthWithThreshold", + values: [AddressLike, boolean, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRateWithCustomConnectors", + values: [AddressLike, AddressLike, boolean, AddressLike[], BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRateWithThreshold", + values: [AddressLike, AddressLike, boolean, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "multiWrapper", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "oracles", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "removeConnector", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "removeOracle", + values: [AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setMultiWrapper", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + + decodeFunctionResult( + functionFragment: "addConnector", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "addOracle", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "connectors", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "getRate", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getRateToEth", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRateToEthWithCustomConnectors", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRateToEthWithThreshold", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRateWithCustomConnectors", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRateWithThreshold", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "multiWrapper", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "oracles", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeConnector", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeOracle", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMultiWrapper", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; +} + +export namespace ConnectorAddedEvent { + export type InputTuple = [connector: AddressLike]; + export type OutputTuple = [connector: string]; + export interface OutputObject { + connector: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ConnectorRemovedEvent { + export type InputTuple = [connector: AddressLike]; + export type OutputTuple = [connector: string]; + export interface OutputObject { + connector: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace MultiWrapperUpdatedEvent { + export type InputTuple = [multiWrapper: AddressLike]; + export type OutputTuple = [multiWrapper: string]; + export interface OutputObject { + multiWrapper: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OracleAddedEvent { + export type InputTuple = [oracle: AddressLike, oracleType: BigNumberish]; + export type OutputTuple = [oracle: string, oracleType: bigint]; + export interface OutputObject { + oracle: string; + oracleType: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OracleRemovedEvent { + export type InputTuple = [oracle: AddressLike, oracleType: BigNumberish]; + export type OutputTuple = [oracle: string, oracleType: bigint]; + export interface OutputObject { + oracle: string; + oracleType: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface OffchainOracle extends BaseContract { + connect(runner?: ContractRunner | null): OffchainOracle; + waitForDeployment(): Promise; + + interface: OffchainOracleInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + addConnector: TypedContractMethod< + [connector: AddressLike], + [void], + "nonpayable" + >; + + addOracle: TypedContractMethod< + [oracle: AddressLike, oracleKind: BigNumberish], + [void], + "nonpayable" + >; + + connectors: TypedContractMethod<[], [string[]], "view">; + + getRate: TypedContractMethod< + [srcToken: AddressLike, dstToken: AddressLike, useWrappers: boolean], + [bigint], + "view" + >; + + getRateToEth: TypedContractMethod< + [srcToken: AddressLike, useSrcWrappers: boolean], + [bigint], + "view" + >; + + getRateToEthWithCustomConnectors: TypedContractMethod< + [ + srcToken: AddressLike, + useSrcWrappers: boolean, + customConnectors: AddressLike[], + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + + getRateToEthWithThreshold: TypedContractMethod< + [ + srcToken: AddressLike, + useSrcWrappers: boolean, + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + + getRateWithCustomConnectors: TypedContractMethod< + [ + srcToken: AddressLike, + dstToken: AddressLike, + useWrappers: boolean, + customConnectors: AddressLike[], + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + + getRateWithThreshold: TypedContractMethod< + [ + srcToken: AddressLike, + dstToken: AddressLike, + useWrappers: boolean, + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + + multiWrapper: TypedContractMethod<[], [string], "view">; + + oracles: TypedContractMethod< + [], + [[string[], bigint[]] & { allOracles: string[]; oracleTypes: bigint[] }], + "view" + >; + + owner: TypedContractMethod<[], [string], "view">; + + removeConnector: TypedContractMethod< + [connector: AddressLike], + [void], + "nonpayable" + >; + + removeOracle: TypedContractMethod< + [oracle: AddressLike, oracleKind: BigNumberish], + [void], + "nonpayable" + >; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + setMultiWrapper: TypedContractMethod< + [_multiWrapper: AddressLike], + [void], + "nonpayable" + >; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "addConnector" + ): TypedContractMethod<[connector: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "addOracle" + ): TypedContractMethod< + [oracle: AddressLike, oracleKind: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "connectors" + ): TypedContractMethod<[], [string[]], "view">; + getFunction( + nameOrSignature: "getRate" + ): TypedContractMethod< + [srcToken: AddressLike, dstToken: AddressLike, useWrappers: boolean], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "getRateToEth" + ): TypedContractMethod< + [srcToken: AddressLike, useSrcWrappers: boolean], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "getRateToEthWithCustomConnectors" + ): TypedContractMethod< + [ + srcToken: AddressLike, + useSrcWrappers: boolean, + customConnectors: AddressLike[], + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "getRateToEthWithThreshold" + ): TypedContractMethod< + [ + srcToken: AddressLike, + useSrcWrappers: boolean, + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "getRateWithCustomConnectors" + ): TypedContractMethod< + [ + srcToken: AddressLike, + dstToken: AddressLike, + useWrappers: boolean, + customConnectors: AddressLike[], + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "getRateWithThreshold" + ): TypedContractMethod< + [ + srcToken: AddressLike, + dstToken: AddressLike, + useWrappers: boolean, + thresholdFilter: BigNumberish + ], + [bigint], + "view" + >; + getFunction( + nameOrSignature: "multiWrapper" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "oracles" + ): TypedContractMethod< + [], + [[string[], bigint[]] & { allOracles: string[]; oracleTypes: bigint[] }], + "view" + >; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "removeConnector" + ): TypedContractMethod<[connector: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "removeOracle" + ): TypedContractMethod< + [oracle: AddressLike, oracleKind: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "setMultiWrapper" + ): TypedContractMethod<[_multiWrapper: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + + getEvent( + key: "ConnectorAdded" + ): TypedContractEvent< + ConnectorAddedEvent.InputTuple, + ConnectorAddedEvent.OutputTuple, + ConnectorAddedEvent.OutputObject + >; + getEvent( + key: "ConnectorRemoved" + ): TypedContractEvent< + ConnectorRemovedEvent.InputTuple, + ConnectorRemovedEvent.OutputTuple, + ConnectorRemovedEvent.OutputObject + >; + getEvent( + key: "MultiWrapperUpdated" + ): TypedContractEvent< + MultiWrapperUpdatedEvent.InputTuple, + MultiWrapperUpdatedEvent.OutputTuple, + MultiWrapperUpdatedEvent.OutputObject + >; + getEvent( + key: "OracleAdded" + ): TypedContractEvent< + OracleAddedEvent.InputTuple, + OracleAddedEvent.OutputTuple, + OracleAddedEvent.OutputObject + >; + getEvent( + key: "OracleRemoved" + ): TypedContractEvent< + OracleRemovedEvent.InputTuple, + OracleRemovedEvent.OutputTuple, + OracleRemovedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + filters: { + "ConnectorAdded(address)": TypedContractEvent< + ConnectorAddedEvent.InputTuple, + ConnectorAddedEvent.OutputTuple, + ConnectorAddedEvent.OutputObject + >; + ConnectorAdded: TypedContractEvent< + ConnectorAddedEvent.InputTuple, + ConnectorAddedEvent.OutputTuple, + ConnectorAddedEvent.OutputObject + >; + + "ConnectorRemoved(address)": TypedContractEvent< + ConnectorRemovedEvent.InputTuple, + ConnectorRemovedEvent.OutputTuple, + ConnectorRemovedEvent.OutputObject + >; + ConnectorRemoved: TypedContractEvent< + ConnectorRemovedEvent.InputTuple, + ConnectorRemovedEvent.OutputTuple, + ConnectorRemovedEvent.OutputObject + >; + + "MultiWrapperUpdated(address)": TypedContractEvent< + MultiWrapperUpdatedEvent.InputTuple, + MultiWrapperUpdatedEvent.OutputTuple, + MultiWrapperUpdatedEvent.OutputObject + >; + MultiWrapperUpdated: TypedContractEvent< + MultiWrapperUpdatedEvent.InputTuple, + MultiWrapperUpdatedEvent.OutputTuple, + MultiWrapperUpdatedEvent.OutputObject + >; + + "OracleAdded(address,uint8)": TypedContractEvent< + OracleAddedEvent.InputTuple, + OracleAddedEvent.OutputTuple, + OracleAddedEvent.OutputObject + >; + OracleAdded: TypedContractEvent< + OracleAddedEvent.InputTuple, + OracleAddedEvent.OutputTuple, + OracleAddedEvent.OutputObject + >; + + "OracleRemoved(address,uint8)": TypedContractEvent< + OracleRemovedEvent.InputTuple, + OracleRemovedEvent.OutputTuple, + OracleRemovedEvent.OutputObject + >; + OracleRemoved: TypedContractEvent< + OracleRemovedEvent.InputTuple, + OracleRemovedEvent.OutputTuple, + OracleRemovedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + }; +} diff --git a/src/typechain/OvmGasPriceOracle.ts b/src/typechain/OvmGasPriceOracle.ts new file mode 100644 index 0000000..9da1e9b --- /dev/null +++ b/src/typechain/OvmGasPriceOracle.ts @@ -0,0 +1,460 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export interface OvmGasPriceOracleInterface extends Interface { + getFunction( + nameOrSignature: + | "decimals" + | "gasPrice" + | "getL1Fee" + | "getL1GasUsed" + | "l1BaseFee" + | "overhead" + | "owner" + | "renounceOwnership" + | "scalar" + | "setDecimals" + | "setGasPrice" + | "setL1BaseFee" + | "setOverhead" + | "setScalar" + | "transferOwnership" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "DecimalsUpdated" + | "GasPriceUpdated" + | "L1BaseFeeUpdated" + | "OverheadUpdated" + | "OwnershipTransferred" + | "ScalarUpdated" + ): EventFragment; + + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "gasPrice", values?: undefined): string; + encodeFunctionData(functionFragment: "getL1Fee", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "getL1GasUsed", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "l1BaseFee", values?: undefined): string; + encodeFunctionData(functionFragment: "overhead", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "scalar", values?: undefined): string; + encodeFunctionData( + functionFragment: "setDecimals", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setGasPrice", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setL1BaseFee", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setOverhead", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setScalar", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "gasPrice", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "getL1Fee", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getL1GasUsed", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "l1BaseFee", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "overhead", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "scalar", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setDecimals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setGasPrice", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setL1BaseFee", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOverhead", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setScalar", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; +} + +export namespace DecimalsUpdatedEvent { + export type InputTuple = [arg0: BigNumberish]; + export type OutputTuple = [arg0: bigint]; + export interface OutputObject { + arg0: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace GasPriceUpdatedEvent { + export type InputTuple = [arg0: BigNumberish]; + export type OutputTuple = [arg0: bigint]; + export interface OutputObject { + arg0: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace L1BaseFeeUpdatedEvent { + export type InputTuple = [arg0: BigNumberish]; + export type OutputTuple = [arg0: bigint]; + export interface OutputObject { + arg0: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OverheadUpdatedEvent { + export type InputTuple = [arg0: BigNumberish]; + export type OutputTuple = [arg0: bigint]; + export interface OutputObject { + arg0: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ScalarUpdatedEvent { + export type InputTuple = [arg0: BigNumberish]; + export type OutputTuple = [arg0: bigint]; + export interface OutputObject { + arg0: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface OvmGasPriceOracle extends BaseContract { + connect(runner?: ContractRunner | null): OvmGasPriceOracle; + waitForDeployment(): Promise; + + interface: OvmGasPriceOracleInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + decimals: TypedContractMethod<[], [bigint], "view">; + + gasPrice: TypedContractMethod<[], [bigint], "view">; + + getL1Fee: TypedContractMethod<[_data: BytesLike], [bigint], "view">; + + getL1GasUsed: TypedContractMethod<[_data: BytesLike], [bigint], "view">; + + l1BaseFee: TypedContractMethod<[], [bigint], "view">; + + overhead: TypedContractMethod<[], [bigint], "view">; + + owner: TypedContractMethod<[], [string], "view">; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + scalar: TypedContractMethod<[], [bigint], "view">; + + setDecimals: TypedContractMethod< + [_decimals: BigNumberish], + [void], + "nonpayable" + >; + + setGasPrice: TypedContractMethod< + [_gasPrice: BigNumberish], + [void], + "nonpayable" + >; + + setL1BaseFee: TypedContractMethod< + [_baseFee: BigNumberish], + [void], + "nonpayable" + >; + + setOverhead: TypedContractMethod< + [_overhead: BigNumberish], + [void], + "nonpayable" + >; + + setScalar: TypedContractMethod<[_scalar: BigNumberish], [void], "nonpayable">; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "decimals" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "gasPrice" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "getL1Fee" + ): TypedContractMethod<[_data: BytesLike], [bigint], "view">; + getFunction( + nameOrSignature: "getL1GasUsed" + ): TypedContractMethod<[_data: BytesLike], [bigint], "view">; + getFunction( + nameOrSignature: "l1BaseFee" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "overhead" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "scalar" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "setDecimals" + ): TypedContractMethod<[_decimals: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "setGasPrice" + ): TypedContractMethod<[_gasPrice: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "setL1BaseFee" + ): TypedContractMethod<[_baseFee: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "setOverhead" + ): TypedContractMethod<[_overhead: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "setScalar" + ): TypedContractMethod<[_scalar: BigNumberish], [void], "nonpayable">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + + getEvent( + key: "DecimalsUpdated" + ): TypedContractEvent< + DecimalsUpdatedEvent.InputTuple, + DecimalsUpdatedEvent.OutputTuple, + DecimalsUpdatedEvent.OutputObject + >; + getEvent( + key: "GasPriceUpdated" + ): TypedContractEvent< + GasPriceUpdatedEvent.InputTuple, + GasPriceUpdatedEvent.OutputTuple, + GasPriceUpdatedEvent.OutputObject + >; + getEvent( + key: "L1BaseFeeUpdated" + ): TypedContractEvent< + L1BaseFeeUpdatedEvent.InputTuple, + L1BaseFeeUpdatedEvent.OutputTuple, + L1BaseFeeUpdatedEvent.OutputObject + >; + getEvent( + key: "OverheadUpdated" + ): TypedContractEvent< + OverheadUpdatedEvent.InputTuple, + OverheadUpdatedEvent.OutputTuple, + OverheadUpdatedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + getEvent( + key: "ScalarUpdated" + ): TypedContractEvent< + ScalarUpdatedEvent.InputTuple, + ScalarUpdatedEvent.OutputTuple, + ScalarUpdatedEvent.OutputObject + >; + + filters: { + "DecimalsUpdated(uint256)": TypedContractEvent< + DecimalsUpdatedEvent.InputTuple, + DecimalsUpdatedEvent.OutputTuple, + DecimalsUpdatedEvent.OutputObject + >; + DecimalsUpdated: TypedContractEvent< + DecimalsUpdatedEvent.InputTuple, + DecimalsUpdatedEvent.OutputTuple, + DecimalsUpdatedEvent.OutputObject + >; + + "GasPriceUpdated(uint256)": TypedContractEvent< + GasPriceUpdatedEvent.InputTuple, + GasPriceUpdatedEvent.OutputTuple, + GasPriceUpdatedEvent.OutputObject + >; + GasPriceUpdated: TypedContractEvent< + GasPriceUpdatedEvent.InputTuple, + GasPriceUpdatedEvent.OutputTuple, + GasPriceUpdatedEvent.OutputObject + >; + + "L1BaseFeeUpdated(uint256)": TypedContractEvent< + L1BaseFeeUpdatedEvent.InputTuple, + L1BaseFeeUpdatedEvent.OutputTuple, + L1BaseFeeUpdatedEvent.OutputObject + >; + L1BaseFeeUpdated: TypedContractEvent< + L1BaseFeeUpdatedEvent.InputTuple, + L1BaseFeeUpdatedEvent.OutputTuple, + L1BaseFeeUpdatedEvent.OutputObject + >; + + "OverheadUpdated(uint256)": TypedContractEvent< + OverheadUpdatedEvent.InputTuple, + OverheadUpdatedEvent.OutputTuple, + OverheadUpdatedEvent.OutputObject + >; + OverheadUpdated: TypedContractEvent< + OverheadUpdatedEvent.InputTuple, + OverheadUpdatedEvent.OutputTuple, + OverheadUpdatedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + "ScalarUpdated(uint256)": TypedContractEvent< + ScalarUpdatedEvent.InputTuple, + ScalarUpdatedEvent.OutputTuple, + ScalarUpdatedEvent.OutputObject + >; + ScalarUpdated: TypedContractEvent< + ScalarUpdatedEvent.InputTuple, + ScalarUpdatedEvent.OutputTuple, + ScalarUpdatedEvent.OutputObject + >; + }; +} diff --git a/src/typechain/ReverseRecords.ts b/src/typechain/ReverseRecords.ts new file mode 100644 index 0000000..ad39633 --- /dev/null +++ b/src/typechain/ReverseRecords.ts @@ -0,0 +1,88 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "./common"; + +export interface ReverseRecordsInterface extends Interface { + getFunction(nameOrSignature: "getNames"): FunctionFragment; + + encodeFunctionData( + functionFragment: "getNames", + values: [AddressLike[]] + ): string; + + decodeFunctionResult(functionFragment: "getNames", data: BytesLike): Result; +} + +export interface ReverseRecords extends BaseContract { + connect(runner?: ContractRunner | null): ReverseRecords; + waitForDeployment(): Promise; + + interface: ReverseRecordsInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getNames: TypedContractMethod<[addresses: AddressLike[]], [string[]], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "getNames" + ): TypedContractMethod<[addresses: AddressLike[]], [string[]], "view">; + + filters: {}; +} diff --git a/src/typechain/common.ts b/src/typechain/common.ts new file mode 100644 index 0000000..56b5f21 --- /dev/null +++ b/src/typechain/common.ts @@ -0,0 +1,131 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + FunctionFragment, + Typed, + EventFragment, + ContractTransaction, + ContractTransactionResponse, + DeferredTopicFilter, + EventLog, + TransactionRequest, + LogDescription, +} from "ethers"; + +export interface TypedDeferredTopicFilter<_TCEvent extends TypedContractEvent> + extends DeferredTopicFilter {} + +export interface TypedContractEvent< + InputTuple extends Array = any, + OutputTuple extends Array = any, + OutputObject = any +> { + (...args: Partial): TypedDeferredTopicFilter< + TypedContractEvent + >; + name: string; + fragment: EventFragment; + getFragment(...args: Partial): EventFragment; +} + +type __TypechainAOutputTuple = T extends TypedContractEvent< + infer _U, + infer W +> + ? W + : never; +type __TypechainOutputObject = T extends TypedContractEvent< + infer _U, + infer _W, + infer V +> + ? V + : never; + +export interface TypedEventLog + extends Omit { + args: __TypechainAOutputTuple & __TypechainOutputObject; +} + +export interface TypedLogDescription + extends Omit { + args: __TypechainAOutputTuple & __TypechainOutputObject; +} + +export type TypedListener = ( + ...listenerArg: [ + ...__TypechainAOutputTuple, + TypedEventLog, + ...undefined[] + ] +) => void; + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; + +export type StateMutability = "nonpayable" | "payable" | "view"; + +export type BaseOverrides = Omit; +export type NonPayableOverrides = Omit< + BaseOverrides, + "value" | "blockTag" | "enableCcipRead" +>; +export type PayableOverrides = Omit< + BaseOverrides, + "blockTag" | "enableCcipRead" +>; +export type ViewOverrides = Omit; +export type Overrides = S extends "nonpayable" + ? NonPayableOverrides + : S extends "payable" + ? PayableOverrides + : ViewOverrides; + +export type PostfixOverrides, S extends StateMutability> = + | A + | [...A, Overrides]; +export type ContractMethodArgs< + A extends Array, + S extends StateMutability +> = PostfixOverrides<{ [I in keyof A]-?: A[I] | Typed }, S>; + +export type DefaultReturnType = R extends Array ? R[0] : R; + +// export interface ContractMethod = Array, R = any, D extends R | ContractTransactionResponse = R | ContractTransactionResponse> { +export interface TypedContractMethod< + A extends Array = Array, + R = any, + S extends StateMutability = "payable" +> { + (...args: ContractMethodArgs): S extends "view" + ? Promise> + : Promise; + + name: string; + + fragment: FunctionFragment; + + getFragment(...args: ContractMethodArgs): FunctionFragment; + + populateTransaction( + ...args: ContractMethodArgs + ): Promise; + staticCall( + ...args: ContractMethodArgs + ): Promise>; + send(...args: ContractMethodArgs): Promise; + estimateGas(...args: ContractMethodArgs): Promise; + staticCallResult(...args: ContractMethodArgs): Promise; +} diff --git a/src/typechain/factories/ENS__factory.ts b/src/typechain/factories/ENS__factory.ts new file mode 100644 index 0000000..3e1bb65 --- /dev/null +++ b/src/typechain/factories/ENS__factory.ts @@ -0,0 +1,698 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { ENS, ENSInterface } from "../ENS"; + +const _abi = [ + { + constant: true, + inputs: [ + { + internalType: "bytes4", + name: "interfaceID", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + payable: false, + stateMutability: "pure", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "string", + name: "key", + type: "string", + }, + { + internalType: "string", + name: "value", + type: "string", + }, + ], + name: "setText", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "bytes4", + name: "interfaceID", + type: "bytes4", + }, + ], + name: "interfaceImplementer", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "uint256", + name: "contentTypes", + type: "uint256", + }, + ], + name: "ABI", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "x", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "y", + type: "bytes32", + }, + ], + name: "setPubkey", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "bytes", + name: "hash", + type: "bytes", + }, + ], + name: "setContenthash", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + ], + name: "addr", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bool", + name: "isAuthorised", + type: "bool", + }, + ], + name: "setAuthorisation", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "string", + name: "key", + type: "string", + }, + ], + name: "text", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "uint256", + name: "contentType", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "setABI", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + ], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + ], + name: "setName", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "uint256", + name: "coinType", + type: "uint256", + }, + { + internalType: "bytes", + name: "a", + type: "bytes", + }, + ], + name: "setAddr", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + ], + name: "contenthash", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + ], + name: "pubkey", + outputs: [ + { + internalType: "bytes32", + name: "x", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "y", + type: "bytes32", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "address", + name: "a", + type: "address", + }, + ], + name: "setAddr", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "bytes4", + name: "interfaceID", + type: "bytes4", + }, + { + internalType: "address", + name: "implementer", + type: "address", + }, + ], + name: "setInterface", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + internalType: "uint256", + name: "coinType", + type: "uint256", + }, + ], + name: "addr", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "authorisations", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract ENS", + name: "_ens", + type: "address", + }, + ], + payable: false, + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "target", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "isAuthorised", + type: "bool", + }, + ], + name: "AuthorisationChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: false, + internalType: "string", + name: "indexedKey", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "key", + type: "string", + }, + ], + name: "TextChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "x", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "y", + type: "bytes32", + }, + ], + name: "PubkeyChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: false, + internalType: "string", + name: "name", + type: "string", + }, + ], + name: "NameChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes4", + name: "interfaceID", + type: "bytes4", + }, + { + indexed: false, + internalType: "address", + name: "implementer", + type: "address", + }, + ], + name: "InterfaceChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes", + name: "hash", + type: "bytes", + }, + ], + name: "ContenthashChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: false, + internalType: "address", + name: "a", + type: "address", + }, + ], + name: "AddrChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: false, + internalType: "uint256", + name: "coinType", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "newAddress", + type: "bytes", + }, + ], + name: "AddressChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "node", + type: "bytes32", + }, + { + indexed: true, + internalType: "uint256", + name: "contentType", + type: "uint256", + }, + ], + name: "ABIChanged", + type: "event", + }, +] as const; + +export class ENS__factory { + static readonly abi = _abi; + static createInterface(): ENSInterface { + return new Interface(_abi) as ENSInterface; + } + static connect(address: string, runner?: ContractRunner | null): ENS { + return new Contract(address, _abi, runner) as unknown as ENS; + } +} diff --git a/src/typechain/factories/ERC20__factory.ts b/src/typechain/factories/ERC20__factory.ts new file mode 100644 index 0000000..e42e7a2 --- /dev/null +++ b/src/typechain/factories/ERC20__factory.ts @@ -0,0 +1,318 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { ERC20, ERC20Interface } from "../ERC20"; + +const _abi = [ + { + constant: true, + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [], + name: "_totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [ + { + internalType: "address", + name: "who", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: true, + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transfer", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + constant: true, + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: false, + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "approve", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class ERC20__factory { + static readonly abi = _abi; + static createInterface(): ERC20Interface { + return new Interface(_abi) as ERC20Interface; + } + static connect(address: string, runner?: ContractRunner | null): ERC20 { + return new Contract(address, _abi, runner) as unknown as ERC20; + } +} diff --git a/src/typechain/factories/GasPriceOracle__factory.ts b/src/typechain/factories/GasPriceOracle__factory.ts new file mode 100644 index 0000000..d09ba98 --- /dev/null +++ b/src/typechain/factories/GasPriceOracle__factory.ts @@ -0,0 +1,212 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + GasPriceOracle, + GasPriceOracleInterface, +} from "../GasPriceOracle"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "GAS_UNIT", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "_derivationThresold", + type: "uint32", + }, + ], + name: "changeDerivationThresold", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "_gasUnit", + type: "uint32", + }, + ], + name: "changeGasUnit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "_heartbeat", + type: "uint32", + }, + ], + name: "changeHeartbeat", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "changeOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "derivationThresold", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "gasPrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "heartbeat", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "maxFeePerGas", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "maxPriorityFeePerGas", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pastGasPrice", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "_gasPrice", + type: "uint32", + }, + ], + name: "setGasPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "timestamp", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class GasPriceOracle__factory { + static readonly abi = _abi; + static createInterface(): GasPriceOracleInterface { + return new Interface(_abi) as GasPriceOracleInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): GasPriceOracle { + return new Contract(address, _abi, runner) as unknown as GasPriceOracle; + } +} diff --git a/src/typechain/factories/Multicall__factory.ts b/src/typechain/factories/Multicall__factory.ts new file mode 100644 index 0000000..36664f2 --- /dev/null +++ b/src/typechain/factories/Multicall__factory.ts @@ -0,0 +1,457 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { Multicall, MulticallInterface } from "../Multicall"; + +const _abi = [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Call[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "aggregate", + outputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + internalType: "bytes[]", + name: "returnData", + type: "bytes[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bool", + name: "allowFailure", + type: "bool", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Call3[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "aggregate3", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returnData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Result[]", + name: "returnData", + type: "tuple[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bool", + name: "allowFailure", + type: "bool", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Call3Value[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "aggregate3Value", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returnData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Result[]", + name: "returnData", + type: "tuple[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Call[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "blockAndAggregate", + outputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + components: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returnData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Result[]", + name: "returnData", + type: "tuple[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "getBasefee", + outputs: [ + { + internalType: "uint256", + name: "basefee", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + ], + name: "getBlockHash", + outputs: [ + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getBlockNumber", + outputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getChainId", + outputs: [ + { + internalType: "uint256", + name: "chainid", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getCurrentBlockCoinbase", + outputs: [ + { + internalType: "address", + name: "coinbase", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getCurrentBlockDifficulty", + outputs: [ + { + internalType: "uint256", + name: "difficulty", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getCurrentBlockGasLimit", + outputs: [ + { + internalType: "uint256", + name: "gaslimit", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getCurrentBlockTimestamp", + outputs: [ + { + internalType: "uint256", + name: "timestamp", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "addr", + type: "address", + }, + ], + name: "getEthBalance", + outputs: [ + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getLastBlockHash", + outputs: [ + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "requireSuccess", + type: "bool", + }, + { + components: [ + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Call[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "tryAggregate", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returnData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Result[]", + name: "returnData", + type: "tuple[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "requireSuccess", + type: "bool", + }, + { + components: [ + { + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Call[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "tryBlockAndAggregate", + outputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + components: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returnData", + type: "bytes", + }, + ], + internalType: "struct Multicall3.Result[]", + name: "returnData", + type: "tuple[]", + }, + ], + stateMutability: "payable", + type: "function", + }, +] as const; + +export class Multicall__factory { + static readonly abi = _abi; + static createInterface(): MulticallInterface { + return new Interface(_abi) as MulticallInterface; + } + static connect(address: string, runner?: ContractRunner | null): Multicall { + return new Contract(address, _abi, runner) as unknown as Multicall; + } +} diff --git a/src/typechain/factories/OffchainOracle__factory.ts b/src/typechain/factories/OffchainOracle__factory.ts new file mode 100644 index 0000000..351c5db --- /dev/null +++ b/src/typechain/factories/OffchainOracle__factory.ts @@ -0,0 +1,538 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + OffchainOracle, + OffchainOracleInterface, +} from "../OffchainOracle"; + +const _abi = [ + { + inputs: [ + { + internalType: "contract MultiWrapper", + name: "_multiWrapper", + type: "address", + }, + { + internalType: "contract IOracle[]", + name: "existingOracles", + type: "address[]", + }, + { + internalType: "enum OffchainOracle.OracleType[]", + name: "oracleTypes", + type: "uint8[]", + }, + { + internalType: "contract IERC20[]", + name: "existingConnectors", + type: "address[]", + }, + { + internalType: "contract IERC20", + name: "wBase", + type: "address", + }, + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "ArraysLengthMismatch", + type: "error", + }, + { + inputs: [], + name: "ConnectorAlreadyAdded", + type: "error", + }, + { + inputs: [], + name: "InvalidOracleTokenKind", + type: "error", + }, + { + inputs: [], + name: "OracleAlreadyAdded", + type: "error", + }, + { + inputs: [], + name: "SameTokens", + type: "error", + }, + { + inputs: [], + name: "TooBigThreshold", + type: "error", + }, + { + inputs: [], + name: "UnknownConnector", + type: "error", + }, + { + inputs: [], + name: "UnknownOracle", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20", + name: "connector", + type: "address", + }, + ], + name: "ConnectorAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20", + name: "connector", + type: "address", + }, + ], + name: "ConnectorRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract MultiWrapper", + name: "multiWrapper", + type: "address", + }, + ], + name: "MultiWrapperUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IOracle", + name: "oracle", + type: "address", + }, + { + indexed: false, + internalType: "enum OffchainOracle.OracleType", + name: "oracleType", + type: "uint8", + }, + ], + name: "OracleAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IOracle", + name: "oracle", + type: "address", + }, + { + indexed: false, + internalType: "enum OffchainOracle.OracleType", + name: "oracleType", + type: "uint8", + }, + ], + name: "OracleRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "connector", + type: "address", + }, + ], + name: "addConnector", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracle", + name: "oracle", + type: "address", + }, + { + internalType: "enum OffchainOracle.OracleType", + name: "oracleKind", + type: "uint8", + }, + ], + name: "addOracle", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "connectors", + outputs: [ + { + internalType: "contract IERC20[]", + name: "allConnectors", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "srcToken", + type: "address", + }, + { + internalType: "contract IERC20", + name: "dstToken", + type: "address", + }, + { + internalType: "bool", + name: "useWrappers", + type: "bool", + }, + ], + name: "getRate", + outputs: [ + { + internalType: "uint256", + name: "weightedRate", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "srcToken", + type: "address", + }, + { + internalType: "bool", + name: "useSrcWrappers", + type: "bool", + }, + ], + name: "getRateToEth", + outputs: [ + { + internalType: "uint256", + name: "weightedRate", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "srcToken", + type: "address", + }, + { + internalType: "bool", + name: "useSrcWrappers", + type: "bool", + }, + { + internalType: "contract IERC20[]", + name: "customConnectors", + type: "address[]", + }, + { + internalType: "uint256", + name: "thresholdFilter", + type: "uint256", + }, + ], + name: "getRateToEthWithCustomConnectors", + outputs: [ + { + internalType: "uint256", + name: "weightedRate", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "srcToken", + type: "address", + }, + { + internalType: "bool", + name: "useSrcWrappers", + type: "bool", + }, + { + internalType: "uint256", + name: "thresholdFilter", + type: "uint256", + }, + ], + name: "getRateToEthWithThreshold", + outputs: [ + { + internalType: "uint256", + name: "weightedRate", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "srcToken", + type: "address", + }, + { + internalType: "contract IERC20", + name: "dstToken", + type: "address", + }, + { + internalType: "bool", + name: "useWrappers", + type: "bool", + }, + { + internalType: "contract IERC20[]", + name: "customConnectors", + type: "address[]", + }, + { + internalType: "uint256", + name: "thresholdFilter", + type: "uint256", + }, + ], + name: "getRateWithCustomConnectors", + outputs: [ + { + internalType: "uint256", + name: "weightedRate", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "srcToken", + type: "address", + }, + { + internalType: "contract IERC20", + name: "dstToken", + type: "address", + }, + { + internalType: "bool", + name: "useWrappers", + type: "bool", + }, + { + internalType: "uint256", + name: "thresholdFilter", + type: "uint256", + }, + ], + name: "getRateWithThreshold", + outputs: [ + { + internalType: "uint256", + name: "weightedRate", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "multiWrapper", + outputs: [ + { + internalType: "contract MultiWrapper", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "oracles", + outputs: [ + { + internalType: "contract IOracle[]", + name: "allOracles", + type: "address[]", + }, + { + internalType: "enum OffchainOracle.OracleType[]", + name: "oracleTypes", + type: "uint8[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "connector", + type: "address", + }, + ], + name: "removeConnector", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracle", + name: "oracle", + type: "address", + }, + { + internalType: "enum OffchainOracle.OracleType", + name: "oracleKind", + type: "uint8", + }, + ], + name: "removeOracle", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract MultiWrapper", + name: "_multiWrapper", + type: "address", + }, + ], + name: "setMultiWrapper", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class OffchainOracle__factory { + static readonly abi = _abi; + static createInterface(): OffchainOracleInterface { + return new Interface(_abi) as OffchainOracleInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): OffchainOracle { + return new Contract(address, _abi, runner) as unknown as OffchainOracle; + } +} diff --git a/src/typechain/factories/OvmGasPriceOracle__factory.ts b/src/typechain/factories/OvmGasPriceOracle__factory.ts new file mode 100644 index 0000000..b1c141d --- /dev/null +++ b/src/typechain/factories/OvmGasPriceOracle__factory.ts @@ -0,0 +1,321 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + OvmGasPriceOracle, + OvmGasPriceOracleInterface, +} from "../OvmGasPriceOracle"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "DecimalsUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "GasPriceUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "L1BaseFeeUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "OverheadUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "ScalarUpdated", + type: "event", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "gasPrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_data", + type: "bytes", + }, + ], + name: "getL1Fee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "_data", + type: "bytes", + }, + ], + name: "getL1GasUsed", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "l1BaseFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "overhead", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "scalar", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_decimals", + type: "uint256", + }, + ], + name: "setDecimals", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_gasPrice", + type: "uint256", + }, + ], + name: "setGasPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_baseFee", + type: "uint256", + }, + ], + name: "setL1BaseFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_overhead", + type: "uint256", + }, + ], + name: "setOverhead", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_scalar", + type: "uint256", + }, + ], + name: "setScalar", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class OvmGasPriceOracle__factory { + static readonly abi = _abi; + static createInterface(): OvmGasPriceOracleInterface { + return new Interface(_abi) as OvmGasPriceOracleInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): OvmGasPriceOracle { + return new Contract(address, _abi, runner) as unknown as OvmGasPriceOracle; + } +} diff --git a/src/typechain/factories/ReverseRecords__factory.ts b/src/typechain/factories/ReverseRecords__factory.ts new file mode 100644 index 0000000..c594a24 --- /dev/null +++ b/src/typechain/factories/ReverseRecords__factory.ts @@ -0,0 +1,55 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + ReverseRecords, + ReverseRecordsInterface, +} from "../ReverseRecords"; + +const _abi = [ + { + inputs: [ + { + internalType: "contract ENS", + name: "_ens", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address[]", + name: "addresses", + type: "address[]", + }, + ], + name: "getNames", + outputs: [ + { + internalType: "string[]", + name: "r", + type: "string[]", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class ReverseRecords__factory { + static readonly abi = _abi; + static createInterface(): ReverseRecordsInterface { + return new Interface(_abi) as ReverseRecordsInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): ReverseRecords { + return new Contract(address, _abi, runner) as unknown as ReverseRecords; + } +} diff --git a/src/typechain/factories/index.ts b/src/typechain/factories/index.ts new file mode 100644 index 0000000..b959d05 --- /dev/null +++ b/src/typechain/factories/index.ts @@ -0,0 +1,10 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { ENS__factory } from "./ENS__factory"; +export { ERC20__factory } from "./ERC20__factory"; +export { GasPriceOracle__factory } from "./GasPriceOracle__factory"; +export { Multicall__factory } from "./Multicall__factory"; +export { OffchainOracle__factory } from "./OffchainOracle__factory"; +export { OvmGasPriceOracle__factory } from "./OvmGasPriceOracle__factory"; +export { ReverseRecords__factory } from "./ReverseRecords__factory"; diff --git a/src/typechain/index.ts b/src/typechain/index.ts new file mode 100644 index 0000000..7267d3c --- /dev/null +++ b/src/typechain/index.ts @@ -0,0 +1,18 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { ENS } from "./ENS"; +export type { ERC20 } from "./ERC20"; +export type { GasPriceOracle } from "./GasPriceOracle"; +export type { Multicall } from "./Multicall"; +export type { OffchainOracle } from "./OffchainOracle"; +export type { OvmGasPriceOracle } from "./OvmGasPriceOracle"; +export type { ReverseRecords } from "./ReverseRecords"; +export * as factories from "./factories"; +export { ENS__factory } from "./factories/ENS__factory"; +export { ERC20__factory } from "./factories/ERC20__factory"; +export { GasPriceOracle__factory } from "./factories/GasPriceOracle__factory"; +export { Multicall__factory } from "./factories/Multicall__factory"; +export { OffchainOracle__factory } from "./factories/OffchainOracle__factory"; +export { OvmGasPriceOracle__factory } from "./factories/OvmGasPriceOracle__factory"; +export { ReverseRecords__factory } from "./factories/ReverseRecords__factory"; diff --git a/src/types/bloomfilter.js.d.ts b/src/types/bloomfilter.js.d.ts new file mode 100644 index 0000000..925515d --- /dev/null +++ b/src/types/bloomfilter.js.d.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +declare module 'bloomfilter.js' { + export default class BloomFilter { + m: number; + k: number; + size: number; + bitview: any; + + constructor(n: number, false_postive_tolerance?: number); + + calculateHash(x: number, m: number, i: number): number; + + test(data: any): boolean; + + add(data: any): void; + + bytelength(): number; + + view(): Uint8Array; + + serialize(): string; + + deserialize(serialized: string): BloomFilter; + } +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..5c550d1 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,145 @@ +import { webcrypto } from 'crypto'; +import BN from 'bn.js'; +import type { BigNumberish } from 'ethers'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(BigInt.prototype as any).toJSON = function () { + return this.toString(); +}; + +type bnInput = number | string | number[] | Uint8Array | Buffer | BN; + +export const isNode = + !( + process as typeof process & { + browser?: boolean; + } + ).browser && typeof globalThis.window === 'undefined'; + +export const crypto = isNode ? webcrypto : (globalThis.crypto as typeof webcrypto); + +export const chunk = (arr: T[], size: number): T[][] => + [...Array(Math.ceil(arr.length / size))].map((_, i) => arr.slice(size * i, size + size * i)); + +export function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +export function validateUrl(url: string, protocols?: string[]) { + try { + const parsedUrl = new URL(url); + if (protocols && protocols.length) { + return protocols.map((p) => p.toLowerCase()).includes(parsedUrl.protocol); + } + return true; + } catch { + return false; + } +} + +export function concatBytes(...arrays: Uint8Array[]): Uint8Array { + const totalSize = arrays.reduce((acc, e) => acc + e.length, 0); + const merged = new Uint8Array(totalSize); + + arrays.forEach((array, i, arrays) => { + const offset = arrays.slice(0, i).reduce((acc, e) => acc + e.length, 0); + merged.set(array, offset); + }); + + return merged; +} + +export function bufferToBytes(b: Buffer) { + return new Uint8Array(b.buffer); +} + +export function bytesToBase64(bytes: Uint8Array) { + return btoa(String.fromCharCode.apply(null, Array.from(bytes))); +} + +export function base64ToBytes(base64: string) { + return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)); +} + +export function bytesToHex(bytes: Uint8Array) { + return ( + '0x' + + Array.from(bytes) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + ); +} + +export function hexToBytes(hexString: string) { + if (hexString.slice(0, 2) === '0x') { + hexString = hexString.replace('0x', ''); + } + if (hexString.length % 2 !== 0) { + hexString = '0' + hexString; + } + return Uint8Array.from((hexString.match(/.{1,2}/g) as string[]).map((byte) => parseInt(byte, 16))); +} + +// Convert BE encoded bytes (Buffer | Uint8Array) array to BigInt +export function bytesToBN(bytes: Uint8Array) { + return BigInt(bytesToHex(bytes)); +} + +// Convert BigInt to BE encoded Uint8Array type +export function bnToBytes(bigint: bigint | string) { + // Parse bigint to hex string + let hexString: string = typeof bigint === 'bigint' ? bigint.toString(16) : bigint; + // Remove hex string prefix if exists + if (hexString.startsWith('0x')) { + hexString = hexString.replace('0x', ''); + } + // Hex string length should be a multiplier of two (To make correct bytes) + if (hexString.length % 2 !== 0) { + hexString = '0' + hexString; + } + return Uint8Array.from((hexString.match(/.{1,2}/g) as string[]).map((byte) => parseInt(byte, 16))); +} + +// Convert LE encoded bytes (Buffer | Uint8Array) array to BigInt +export function leBuff2Int(bytes: Uint8Array) { + return new BN(bytes, 16, 'le'); +} + +// Convert BigInt to LE encoded Uint8Array type +export function leInt2Buff(bigint: bnInput | bigint) { + return Uint8Array.from(new BN(bigint as bnInput).toArray('le', 31)); +} + +// Inherited from tornado-core and tornado-cli +export function toFixedHex(numberish: BigNumberish, length = 32) { + return ( + '0x' + + BigInt(numberish) + .toString(16) + .padStart(length * 2, '0') + ); +} + +export function toFixedLength(string: string, length: number = 32) { + string = string.replace('0x', ''); + return '0x' + string.padStart(length * 2, '0'); +} + +// Random BigInt in a range of bytes +export function rBigInt(nbytes: number = 31) { + return bytesToBN(crypto.getRandomValues(new Uint8Array(nbytes))); +} + +// Used for JSON.stringify(value, bigIntReplacer, space) +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function bigIntReplacer(key: any, value: any) { + return typeof value === 'bigint' ? value.toString() : value; +} + +export function substring(str: string, length: number = 10) { + if (str.length < length * 2) { + return str; + } + + return `${str.substring(0, length)}...${str.substring(str.length - length)}`; +} diff --git a/src/websnark.ts b/src/websnark.ts new file mode 100644 index 0000000..99cb49a --- /dev/null +++ b/src/websnark.ts @@ -0,0 +1,85 @@ +// @ts-expect-error no-websnark-types +import * as websnarkUtils from '@tornado/websnark/src/utils'; +// @ts-expect-error no-websnark-types +import websnarkGroth from '@tornado/websnark/src/groth16'; +import type { Element } from '@tornado/fixed-merkle-tree'; +import type { AddressLike, BytesLike, BigNumberish } from 'ethers'; +import { toFixedHex } from './utils'; + +export type snarkInputs = { + // Public snark inputs + root: Element; + nullifierHex: string; + recipient: AddressLike; + relayer: AddressLike; + fee: bigint; + refund: bigint; + + // Private snark inputs + nullifier: bigint; + secret: bigint; + pathElements: Element[]; + pathIndices: Element[]; +}; + +export type snarkArgs = [ + _root: BytesLike, + _nullifierHash: BytesLike, + _recipient: AddressLike, + _relayer: AddressLike, + _fee: BigNumberish, + _refund: BigNumberish, +]; + +export type snarkProofs = { + proof: BytesLike; + args: snarkArgs; +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +let groth16: any; + +const groth16Promise = (async () => { + if (!groth16) { + groth16 = await websnarkGroth({ wasmInitialMemory: 2000 }); + } +})(); + +export async function calculateSnarkProof( + input: snarkInputs, + circuit: object, + provingKey: ArrayBuffer, +): Promise { + await groth16Promise; + + const snarkInput = { + root: input.root, + nullifierHash: BigInt(input.nullifierHex).toString(), + recipient: BigInt(input.recipient as string), + relayer: BigInt(input.relayer as string), + fee: input.fee, + refund: input.refund, + + nullifier: input.nullifier, + secret: input.secret, + pathElements: input.pathElements, + pathIndices: input.pathIndices, + }; + + console.log('Start generating SNARK proof', snarkInput); + console.time('SNARK proof time'); + const proofData = await websnarkUtils.genWitnessAndProve(groth16, snarkInput, circuit, provingKey); + const proof = websnarkUtils.toSolidityInput(proofData).proof as BytesLike; + console.timeEnd('SNARK proof time'); + + const args = [ + toFixedHex(input.root, 32) as BytesLike, + toFixedHex(input.nullifierHex, 32) as BytesLike, + input.recipient, + input.relayer, + toFixedHex(input.fee, 32) as BigNumberish, + toFixedHex(input.refund, 32) as BigNumberish, + ] as snarkArgs; + + return { proof, args }; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8fd0f0f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,114 @@ +{ + "compilerOptions": { + "typeRoots": [ + "./node_modules/@types", + "./src/types", + ], + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "./src", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["./src/**/*"] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..6a148d6 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,80 @@ +const esbuild = require('esbuild'); +const path = require('path'); +const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); + +const esbuildLoader = { + test: /\.ts?$/, + loader: 'esbuild-loader', + options: { + loader: 'ts', + target: 'es2016', + implementation: esbuild + } +} + +const commonAlias = { + fs: false, + 'fs/promises': false, + 'path': false, + 'url': false, + 'worker_threads': false, + 'fflate': 'fflate/browser', + '@colors/colors': false, + 'cli-table3': false, + 'commander': false, + 'http-proxy-agent': false, + 'https-proxy-agent': false, + 'socks-proxy-agent': false, +} + +module.exports = [ + { + mode: 'production', + module: { + rules: [esbuildLoader] + }, + entry: './src/index.ts', + output: { + filename: 'index.umd.js', + path: path.resolve(__dirname, './dist'), + library: 'Tornado', + libraryTarget: 'umd' + }, + plugins: [ + new NodePolyfillPlugin(), + ], + resolve: { + extensions: ['.tsx', '.ts', '.js'], + alias: { + ...commonAlias, + } + }, + optimization: { + minimize: false, + } + }, + { + mode: 'production', + module: { + rules: [esbuildLoader] + }, + entry: './src/merkleTreeWorker.ts', + output: { + filename: 'merkleTreeWorker.umd.js', + path: path.resolve(__dirname, './dist'), + libraryTarget: 'umd' + }, + plugins: [ + new NodePolyfillPlugin(), + ], + resolve: { + extensions: ['.tsx', '.ts', '.js'], + alias: { + ...commonAlias, + } + }, + optimization: { + minimize: false, + } + } +]; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..8f98f3e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5472 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@babel/code-frame@^7.0.0": + 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.24.2" + picocolors "^1.0.0" + +"@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/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" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@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== + +"@ethereumjs/common@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" + integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== + dependencies: + "@ethereumjs/util" "^8.1.0" + crc-32 "^1.2.0" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" + integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== + dependencies: + "@ethereumjs/common" "^3.2.0" + "@ethereumjs/rlp" "^4.0.1" + "@ethereumjs/util" "^8.1.0" + ethereum-cryptography "^2.0.0" + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@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.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@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== + +"@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.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + 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.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/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + 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.20", "@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" + +"@metamask/abi-utils@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@metamask/abi-utils/-/abi-utils-2.0.2.tgz#ad394e9cb8a95ac177cad942daadd88a246c0de8" + integrity sha512-B/A1dY/w4F/t6cDHUscklO6ovb/ztFsrsTXFd8QlqSByk/vyy+QbPE3VVpmmyI/7RX+PA1AJcvBdzCIz+r9dVQ== + dependencies: + "@metamask/utils" "^8.0.0" + superstruct "^1.0.3" + +"@metamask/eth-sig-util@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-7.0.1.tgz#ad3227d6120f15f9293478de7dd9685a5c329586" + integrity sha512-59GSrMyFH2fPfu7nKeIQdZ150zxXNNhAQIUaFRUW+MGtVA4w/ONbiQobcRBLi+jQProfIyss51G8pfLPcQ0ylg== + dependencies: + "@ethereumjs/util" "^8.1.0" + "@metamask/abi-utils" "^2.0.2" + "@metamask/utils" "^8.1.0" + ethereum-cryptography "^2.1.2" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@metamask/utils@^8.0.0", "@metamask/utils@^8.1.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.4.0.tgz#f44812c96467a4e1b70b2edff6ee89a9caa4e354" + integrity sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + superstruct "^1.0.3" + uuid "^9.0.1" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.3.0", "@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@noble/hashes@^1.3.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@openzeppelin/contracts-v3@npm:@openzeppelin/contracts@3.2.0-rc.0": + version "3.2.0-rc.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.2.0-rc.0.tgz#1f39e49df5f7a7b42fd49343ac1d758bbd24b826" + integrity sha512-EcEho5UFNZN1ZUHuD5ka38qgs+XWlzBM1FFfpu4YNVoo0xtwWeg7X52jm8pK+NYq8tJAI8ySjGYPM+4S5+N8iA== + +"@openzeppelin/contracts@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" + integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== + +"@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== + +"@rollup/plugin-commonjs@^25.0.7": + version "25.0.7" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" + integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.30.3" + +"@rollup/plugin-json@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" + integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== + dependencies: + "@rollup/pluginutils" "^5.1.0" + +"@rollup/plugin-node-resolve@^15.2.3": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.5", "@rollup/pluginutils@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz#ca0501dd836894216cb9572848c5dde4bfca3bec" + integrity sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA== + +"@rollup/rollup-android-arm64@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz#154ca7e4f815d2e442ffc62ee7f64aee8b2547b0" + integrity sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ== + +"@rollup/rollup-darwin-arm64@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz#02b522ab6ccc2c504634651985ff8e657b42c055" + integrity sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q== + +"@rollup/rollup-darwin-x64@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz#217737f9f73de729fdfd7d529afebb6c8283f554" + integrity sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA== + +"@rollup/rollup-linux-arm-gnueabihf@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz#a87e478ab3f697c7f4e74c8b1cac1e0667f8f4be" + integrity sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g== + +"@rollup/rollup-linux-arm64-gnu@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz#4da6830eca27e5f4ca15f9197e5660952ca185c6" + integrity sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w== + +"@rollup/rollup-linux-arm64-musl@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz#0b0ed35720aebc8f5e501d370a9ea0f686ead1e0" + integrity sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz#024ad04d162726f25e62915851f7df69a9677c17" + integrity sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw== + +"@rollup/rollup-linux-riscv64-gnu@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz#180694d1cd069ddbe22022bb5b1bead3b7de581c" + integrity sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw== + +"@rollup/rollup-linux-s390x-gnu@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz#f7b4e2b0ca49be4e34f9ef0b548c926d94edee87" + integrity sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA== + +"@rollup/rollup-linux-x64-gnu@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz#0aaf79e5b9ccf7db3084fe6c3f2d2873a27d5af4" + integrity sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA== + +"@rollup/rollup-linux-x64-musl@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz#38f0a37ca5015eb07dff86a1b6f94279c179f4ed" + integrity sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g== + +"@rollup/rollup-win32-arm64-msvc@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz#84d48c55740ede42c77373f76e85f368633a0cc3" + integrity sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA== + +"@rollup/rollup-win32-ia32-msvc@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz#c1e0bc39e20e760f0a526ddf14ae0543af796605" + integrity sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg== + +"@rollup/rollup-win32-x64-msvc@4.14.1": + version "4.14.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz#299eee74b7d87e116083ac5b1ce8dd9434668294" + integrity sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew== + +"@scure/base@^1.1.3", "@scure/base@~1.1.4": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" + integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== + +"@scure/bip32@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" + integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@scure/bip39@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" + integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== + dependencies: + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@tornado/contracts@^1.0.0": + version "1.0.0" + resolved "https://git.tornado.ws/api/packages/tornado-packages/npm/%40tornado%2Fcontracts/-/1.0.0/contracts-1.0.0.tgz#4ee8aada3d12bca94b641fbb3d6f552ec3838cbe" + integrity sha512-kdYoEV+9Wm6sTpY4x4I1AB1cNYZ5yS/DehDxzv0cq06a6/80vncnpG22gM9CxkKqqsQb40O8yDSPxIDEFFwi3w== + dependencies: + "@openzeppelin/contracts" "5.0.2" + "@openzeppelin/contracts-v3" "npm:@openzeppelin/contracts@3.2.0-rc.0" + ethers "^6.4.0" + +"@tornado/fixed-merkle-tree@^0.7.3": + version "0.7.3" + resolved "https://git.tornado.ws/api/packages/tornado-packages/npm/%40tornado%2Ffixed-merkle-tree/-/0.7.3/fixed-merkle-tree-0.7.3.tgz#6636ce9d334553c5f17e5a564fd22f2e9ec04472" + integrity sha512-8UWvIzz0/rMGBkzXACwmCv/5I1VJmnshAKc4C+nkTfOdmnX8Pf1bBa0GlxUIZ25ZFGiU/h2IKEHYckmHovwzEA== + +"@tornado/snarkjs@^0.1.20": + version "0.1.20" + resolved "https://git.tornado.ws/api/packages/tornado-packages/npm/%40tornado%2Fsnarkjs/-/0.1.20/snarkjs-0.1.20.tgz#d7610cd3c8dc10598da7dc3e40e5d7470c3aa8c7" + integrity sha512-mn+ePoQjqOHyDyK8AMy8SXYqNSxJWVswWVmMYvuc75/9bBtJ7SNtwrTByxmfWjrf4S3BM3IrGfHqBHEXY6gR4Q== + dependencies: + big-integer "^1.6.43" + chai "^4.2.0" + escape-string-regexp "^1.0.5" + eslint "^5.16.0" + keccak "^2.0.0" + yargs "^12.0.5" + +"@tornado/websnark@^0.0.4": + version "0.0.4" + resolved "https://git.tornado.ws/api/packages/tornado-packages/npm/%40tornado%2Fwebsnark/-/0.0.4/websnark-0.0.4.tgz#4c603259b71172225a70e3d454344fa172710970" + integrity sha512-dHbaS41ILPq5NyVBDW8AmUPoSKvamtkTeIhyuKKmoyOrZMAUhJ9y1B2zRcejUKfhCZkIjAgCt9bvdzdOGGswwQ== + dependencies: + "@tornado/snarkjs" "^0.1.20" + big-integer "1.6.42" + +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@types/bn.js@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + +"@types/circomlibjs@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@types/circomlibjs/-/circomlibjs-0.1.6.tgz#dba1b9cc68ae4f75da045b8b14c50f3444b31d7f" + integrity sha512-yF174bPDaiKgejlZzCSqKwZaqXhlxMcVEHrAtstFohwP05OjtvHXOdxO6HQeTg8WwIdgMg7MJb1WyWZdUCGlPQ== + +"@types/debug@^4.1.7": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-fetch@^2.6.11": + version "2.6.11" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + +"@types/node@*", "@types/node@^20.12.5": + version "20.12.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" + integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== + dependencies: + undici-types "~5.26.4" + +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + +"@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@typescript-eslint/eslint-plugin@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz#1f5df5cda490a0bcb6fbdd3382e19f1241024242" + integrity sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.6.0" + "@typescript-eslint/type-utils" "7.6.0" + "@typescript-eslint/utils" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.6.0.tgz#0aca5de3045d68b36e88903d15addaf13d040a95" + integrity sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg== + dependencies: + "@typescript-eslint/scope-manager" "7.6.0" + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/typescript-estree" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz#1e9972f654210bd7500b31feadb61a233f5b5e9d" + integrity sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w== + dependencies: + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + +"@typescript-eslint/type-utils@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz#644f75075f379827d25fe0713e252ccd4e4a428c" + integrity sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw== + dependencies: + "@typescript-eslint/typescript-estree" "7.6.0" + "@typescript-eslint/utils" "7.6.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.6.0.tgz#53dba7c30c87e5f10a731054266dd905f1fbae38" + integrity sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ== + +"@typescript-eslint/typescript-estree@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz#112a3775563799fd3f011890ac8322f80830ac17" + integrity sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw== + dependencies: + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/visitor-keys" "7.6.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.6.0.tgz#e400d782280b6f724c8a1204269d984c79202282" + integrity sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.6.0" + "@typescript-eslint/types" "7.6.0" + "@typescript-eslint/typescript-estree" "7.6.0" + semver "^7.6.0" + +"@typescript-eslint/visitor-keys@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz#d1ce13145844379021e1f9bd102c1d78946f4e76" + integrity sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw== + dependencies: + "@typescript-eslint/types" "7.6.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^6.0.7: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + 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" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +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" + +assert@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +b4a@^1.0.1: + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "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.42: + version "1.6.42" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.42.tgz#91623ae5ceeff9a47416c56c9440a66f12f534f1" + integrity sha512-3UQFKcRMx+5Z+IK5vYTMYK2jzLRJkt+XqyDdacgWgtMjjuifKpKTFneJLEgeBElOE2/lXZ1LcMcb5s8pwG2U8Q== + +big-integer@^1.6.42, big-integer@^1.6.43, big-integer@^1.6.48: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +blake-hash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + readable-stream "^3.6.0" + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +blake2b@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== + dependencies: + blake2b-wasm "^2.4.0" + nanoassert "^2.0.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bloomfilter.js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bloomfilter.js/-/bloomfilter.js-1.0.2.tgz#63449e4b055dc08e5e4db75367d48cc0a395e704" + integrity sha512-x3SG+7/NlT5m6hHy1GCerNoWm38kxWZeUIsBs1LaMwnTLM0hidmGalhAfXH07DtP3s9QAp+JAQagpgVIxtUl9g== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "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.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== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + 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.5" + hash-base "~3.0" + inherits "^2.0.4" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.21.10: + 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.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001587: + version "1.0.30001612" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae" + integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g== + +chai@^4.2.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circomlibjs@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== + dependencies: + blake-hash "^2.0.0" + blake2b "^2.1.3" + ethers "^5.5.1" + ffjavascript "^0.2.45" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-table3@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0" + integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-browserify@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +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== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@4, debug@^4.0.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domain-browser@^4.22.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" + integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== + +electron-to-chromium@^1.4.668: + version "1.4.748" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.748.tgz#aa7d4f2f3eac3a6a863cd1779bd4682b4bb68ed5" + integrity sha512-VWqjOlPZn70UZ8FTKUOkUvBLeTQ0xpty66qV0yJcAGY2/CthI4xyW9aEozRVtuwv3Kpf5xTesmJUcPwuJmgP4A== + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.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" + +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" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.12.0, enhanced-resolve@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.12.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" + integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1, es-module-lexer@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esbuild-loader/-/esbuild-loader-4.1.0.tgz#06bddf224320c279fafbe4981feb1a0175b593e4" + integrity sha512-543TtIvqbqouEMlOHg4xKoDQkmdImlwIpyAIgpUtDPvMuklU/c2k+Qt2O3VeDBgAwozxmlEbjOzV+F8CZ0g+Bw== + dependencies: + esbuild "^0.20.0" + get-tsconfig "^4.7.0" + loader-utils "^2.0.4" + webpack-sources "^1.4.3" + +esbuild@^0.20.0, esbuild@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escalade@^3.1.1: + 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" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-prettier@^5.1.3: + 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.6" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^1.3.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +eslint@^8.57.0: + 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.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" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1, esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" + integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + dependencies: + "@noble/curves" "1.3.0" + "@noble/hashes" "1.3.3" + "@scure/bip32" "1.3.3" + "@scure/bip39" "1.2.2" + +ethers@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethers@^6.4.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.12.0.tgz#b0c2ce207ae5a3b5125be966e32ffea7c1f2481a" + integrity sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + 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" + +ffjavascript@0.2.48, ffjavascript@^0.2.45: + version "0.2.48" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.48.tgz#0ca408471d7b18bfc096a9631aa3ef3549c8c82b" + integrity sha512-uNrWP+odLofNmmO+iCCPi/Xt/sJh1ku3pVKmKWVWCLFfdCP69hvRrogKUIGnsdiINcWn0lGxcEh5oEjStMFXQQ== + dependencies: + big-integer "^1.6.48" + wasmbuilder "^0.0.12" + wasmcurves "0.1.0" + web-worker "^1.2.0" + +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0, get-tsconfig@^4.7.0, get-tsconfig@^4.7.2: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.2, glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + 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" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.11, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + 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" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + 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" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +https-proxy-agent@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.2.0, ignore@^5.3.1: + 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.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13, is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" + integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== + dependencies: + bindings "^1.5.0" + inherits "^2.0.4" + nan "^2.14.0" + safe-buffer "^5.2.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.30.3: + version "0.30.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" + integrity sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment@^2.30.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + +nan@^2.14.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" + integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== + +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.2: + 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-polyfill-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-3.0.0.tgz#296b8235d081af368cd413f4c77e68c98919d99c" + integrity sha512-QpG496dDBiaelQZu9wDcVvpLbtk7h9Ctz693RaUMZBgl8DUoFToO90ZTLKq57gP7rwKqYtGbMBXkcEgLSag2jQ== + dependencies: + assert "^2.1.0" + browserify-zlib "^0.2.0" + buffer "^6.0.3" + console-browserify "^1.2.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.12.0" + domain-browser "^4.22.0" + events "^3.3.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "^1.0.1" + process "^0.11.10" + punycode "^2.3.0" + querystring-es3 "^0.2.1" + readable-stream "^4.4.2" + stream-browserify "^3.0.0" + stream-http "^3.2.0" + string_decoder "^1.3.0" + timers-browserify "^2.0.12" + tty-browserify "^0.0.1" + type-fest "^4.4.0" + url "^0.11.3" + util "^0.12.5" + vm-browserify "^1.1.2" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +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 "^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" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +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== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pony-cause@^2.1.10: + version "2.1.11" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.11.tgz#d69a20aaccdb3bdb8f74dd59e5c68d8e6772e4bd" + integrity sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.11.2: + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + dependencies: + side-channel "^1.0.6" + +querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +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.5.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== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.4.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-plugin-esbuild@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.1.1.tgz#ec1dba647dbe1974f76192c75e907aa6eb636399" + integrity sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw== + dependencies: + "@rollup/pluginutils" "^5.0.5" + debug "^4.3.4" + es-module-lexer "^1.3.1" + get-tsconfig "^4.7.2" + +rollup@^4.14.1: + version "4.14.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.14.1.tgz#228d5159c3f4d8745bd24819d734bc6c6ca87c09" + integrity sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.14.1" + "@rollup/rollup-android-arm64" "4.14.1" + "@rollup/rollup-darwin-arm64" "4.14.1" + "@rollup/rollup-darwin-x64" "4.14.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.14.1" + "@rollup/rollup-linux-arm64-gnu" "4.14.1" + "@rollup/rollup-linux-arm64-musl" "4.14.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.14.1" + "@rollup/rollup-linux-riscv64-gnu" "4.14.1" + "@rollup/rollup-linux-s390x-gnu" "4.14.1" + "@rollup/rollup-linux-x64-gnu" "4.14.1" + "@rollup/rollup-linux-x64-musl" "4.14.1" + "@rollup/rollup-win32-arm64-msvc" "4.14.1" + "@rollup/rollup-win32-ia32-msvc" "4.14.1" + "@rollup/rollup-win32-x64-msvc" "4.14.1" + fsevents "~2.3.2" + +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.4.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +semver@^5.5.0, semver@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4, semver@^7.6.0: + 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" + +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" + integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.7.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" + integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + 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@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-json-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +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/core" "^0.1.0" + tslib "^2.6.2" + +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0: + version "5.30.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.4.tgz#62b4d16a819424e6317fd5ceffb4ee8dc769803a" + integrity sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timers-browserify@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-api-utils@^1.3.0: + 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" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +tsc@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/tsc/-/tsc-2.0.4.tgz#5f6499146abea5dca4420b451fa4f2f9345238f5" + integrity sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +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== + +tty-browserify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^4.4.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.17.0.tgz#4c1b2c2852d2a40ba8c0236d3afc6fc68229e5bf" + integrity sha512-9flrz1zkfLRH3jO3bLflmTxryzKMxVa7841VeMgBaNQGY6vH4RCcpN/sQLB7mQQYh1GZ5utT2deypMuCy4yicw== + +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5.4.4: + version "5.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" + integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +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" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + dependencies: + punycode "^1.4.1" + qs "^6.11.2" + +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== + +util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +vm-browserify@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +wasmbuilder@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.12.tgz#a60cb25d6d11f314fe5ab3f4ee041ccb493cb78a" + integrity sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w== + dependencies: + big-integer "^1.6.48" + +wasmcurves@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.1.0.tgz#0bc3f9d465367fcd8243395cb0094a05577e5609" + integrity sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q== + dependencies: + big-integer "^1.6.42" + blakejs "^1.1.0" + +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +web-worker@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-cli@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.91.0: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +"y18n@^3.2.1 || ^4.0.0": + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==